Articles about European Sharepoint Hosting Service
SharePoint 2013 Hosting – HostForLIFE :: How To Manage Navigation With ACE (Adaptive card extensions) In SPFx
Introduction
In this article, we will explain how we can create multiple views and navigate between multiple views (quick views and card views), or render/replace views based on conditions.
ACE Navigations:
- Every ACE has below navigation props:
- cardNavigator
- quickViewNavigator
- Thesee can be used in CardView and QuickView:
- Register
- Push
- Pop
- Replace
- Read the current itemID
Scenario
In this example, we will call a graph API to fetch onedrive items. And, based on the result, we will create three card views. Based on the condition, we will render them.
So when we are calling any APIs there are multiple outcomes like records (number of records and no records found) and any error. So for this, we will create three card views. Based on that, we will render different card views.
In the end, our output will look like this:
For getting started with an Adaptive card extension in SPFx then refer to this.
Implementation
Open a command prompt.
Move to the path where you want to create a project.
Create a project directory using:
md folder-name
Move to the above-created directory using:
cd folder-name
Now execute the below command to create an SPFx solution:
yo @microsoft/sharepoint
It will ask some questions, as shown below:
After a successful installation, we can open a project in any source code tool. Here, I am using the VS code, so I will execute the command:
1 |
code . |
Now we will create a service, model, and typescript and JSON files for different views. So in the end, our project structure will look like this (here my solution name is graphApiAce):
Create a models folder inside ACE and create a file called IOnedriveItems.ts.
1 2 3 4 5 6 7 |
<span class="token keyword module keyword-export">export</span> <span class="token keyword keyword-interface">interface</span> <span class="token class-name">IOnedriveItems</span> <span class="token punctuation">{</span> value<span class="token operator">:</span> <span class="token punctuation">{</span> webUrl<span class="token operator">:</span> string<span class="token punctuation">;</span> displayName<span class="token operator">:</span> string<span class="token punctuation">;</span> id<span class="token operator">:</span> string<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Now let’s create a service to get Onedrive Items using graph API. So for that, create the below files:
GraphService.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">MSGraphClient</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">"@microsoft/sp-http"</span><span class="token punctuation">;</span> <span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">IOnedriveItems</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">"../models/IOnedriveItems"</span><span class="token punctuation">;</span> <span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">IGraphService</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">"./IGraphService"</span><span class="token punctuation">;</span> <span class="token keyword module keyword-export">export</span> <span class="token keyword keyword-class">class</span> <span class="token class-name">GraphService</span> <span class="token keyword keyword-implements">implements</span> <span class="token class-name">IGraphService</span> <span class="token punctuation">{</span> <span class="token keyword keyword-private">private</span> _graphClient<span class="token operator">:</span> <span class="token maybe-class-name">MSGraphClient</span><span class="token punctuation">;</span> <span class="token keyword keyword-private">private</span> _GraphVersion <span class="token operator">=</span> <span class="token string">"v1.0"</span><span class="token punctuation">;</span> <span class="token keyword keyword-public">public</span> <span class="token function">init</span><span class="token punctuation">(</span>graphClient<span class="token operator">:</span> <span class="token maybe-class-name">MSGraphClient</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token keyword keyword-void">void</span> <span class="token punctuation">{</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">_graphClient</span> <span class="token operator">=</span> graphClient<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword keyword-public">public</span> getOnedriveItems <span class="token operator">=</span> <span class="token keyword keyword-async">async</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token known-class-name class-name">Promise</span> <span class="token operator"><</span> <span class="token maybe-class-name">IOnedriveItems</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">></span> <span class="token arrow operator">=></span> <span class="token punctuation">{</span> <span class="token keyword control-flow keyword-if">if</span> <span class="token punctuation">(</span><span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">_graphClient</span> <span class="token operator">===</span> <span class="token keyword nil keyword-undefined">undefined</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword control-flow keyword-throw">throw</span> <span class="token keyword keyword-new">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token string">"Service is not initialized"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword keyword-const">const</span> apiUrl <span class="token operator">=</span> <span class="token string">"/me/drive/root/children"</span><span class="token punctuation">;</span> <span class="token keyword keyword-const">const</span> itemsResponse <span class="token operator">=</span> <span class="token keyword control-flow keyword-await">await</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">_graphClient</span><span class="token punctuation">.</span><span class="token method function property-access">api</span><span class="token punctuation">(</span>apiUrl<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">version</span><span class="token punctuation">(</span><span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">_GraphVersion</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword keyword-const">const</span> onedriveItems<span class="token operator">:</span> <span class="token maybe-class-name">IOnedriveItems</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> itemsResponse<span class="token punctuation">.</span><span class="token property-access">value</span> <span class="token keyword module keyword-as">as</span> <span class="token maybe-class-name">IOnedriveItems</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword control-flow keyword-return">return</span> onedriveItems<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword module keyword-export">export</span> <span class="token keyword keyword-const">const</span> graphService <span class="token operator">=</span> <span class="token keyword keyword-new">new</span> <span class="token class-name">GraphService</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
IGraphService.ts
1 2 3 4 5 6 7 |
<span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">MSGraphClient</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">'@microsoft/sp-http'</span><span class="token punctuation">;</span> <span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">IOnedriveItems</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">'../models/IOnedriveItems'</span><span class="token punctuation">;</span> <span class="token keyword module keyword-export">export</span> <span class="token keyword keyword-interface">interface</span> <span class="token class-name">IGraphService</span> <span class="token punctuation">{</span> <span class="token function">init</span><span class="token punctuation">(</span>graphClient<span class="token operator">:</span> <span class="token maybe-class-name">MSGraphClient</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token keyword keyword-void">void</span><span class="token punctuation">;</span> <span class="token function">getOnedriveItems</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token known-class-name class-name">Promise</span><span class="token operator"><</span><span class="token maybe-class-name">IOnedriveItems</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">></span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Move to the GraphApiAceAdaptiveCardExtension.ts file.
Update states in onInit() as below,
1 2 3 4 5 6 7 |
<span class="token keyword keyword-public">public</span> <span class="token keyword keyword-async">async</span> <span class="token function">onInit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token known-class-name class-name">Promise</span> <span class="token operator"><</span> <span class="token keyword keyword-void">void</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">state</span> <span class="token operator">=</span> <span class="token punctuation">{</span> onedriveItms<span class="token operator">:</span> <span class="token keyword nil keyword-undefined">undefined</span><span class="token punctuation">,</span> noRecordsFoundMessage<span class="token operator">:</span> <span class="token keyword nil keyword-undefined">undefined</span><span class="token punctuation">,</span> errorMessage<span class="token operator">:</span> <span class="token keyword nil keyword-undefined">undefined</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Move to the ./quickView folder and create the below files.
ErrorMessageCardView.ts
In this, we will use an Error icon and text. The description will be based on our requirements.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">BasePrimaryTextCardView</span><span class="token punctuation">,</span> <span class="token maybe-class-name">IPrimaryTextCardParameters</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">'@microsoft/sp-adaptive-card-extension-base'</span><span class="token punctuation">;</span> <span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionProps</span><span class="token punctuation">,</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionState</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">'../GraphApiAceAdaptiveCardExtension'</span><span class="token punctuation">;</span> <span class="token keyword module keyword-export">export</span> <span class="token keyword keyword-class">class</span> <span class="token class-name">ErrorMessageCardView</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">BasePrimaryTextCardView</span> <span class="token operator"><</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionProps</span><span class="token punctuation">,</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionState</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword keyword-public">public</span> <span class="token keyword keyword-get">get</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token maybe-class-name">IPrimaryTextCardParameters</span> <span class="token punctuation">{</span> <span class="token keyword control-flow keyword-return">return</span> <span class="token punctuation">{</span> title<span class="token operator">:</span> <span class="token string">"Error"</span><span class="token punctuation">,</span> primaryText<span class="token operator">:</span> <span class="token string">"Error while calling graph API."</span><span class="token punctuation">,</span> description<span class="token operator">:</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">state</span><span class="token punctuation">.</span><span class="token property-access">errorMessage</span><span class="token punctuation">,</span> iconProperty<span class="token operator">:</span> <span class="token string">"Error"</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
NoRecordsCardView.ts
In this, we will use an Info icon and text. The description will be based on our requirements.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">BasePrimaryTextCardView</span><span class="token punctuation">,</span> <span class="token maybe-class-name">IPrimaryTextCardParameters</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">'@microsoft/sp-adaptive-card-extension-base'</span><span class="token punctuation">;</span> <span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionProps</span><span class="token punctuation">,</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionState</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">'../GraphApiAceAdaptiveCardExtension'</span><span class="token punctuation">;</span> <span class="token keyword module keyword-export">export</span> <span class="token keyword keyword-class">class</span> <span class="token class-name">NoRecordsView</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">BasePrimaryTextCardView</span> <span class="token operator"><</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionProps</span><span class="token punctuation">,</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionState</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword keyword-public">public</span> <span class="token keyword keyword-get">get</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token maybe-class-name">IPrimaryTextCardParameters</span> <span class="token punctuation">{</span> <span class="token keyword control-flow keyword-return">return</span> <span class="token punctuation">{</span> title<span class="token operator">:</span> <span class="token string">"No Records Found"</span><span class="token punctuation">,</span> primaryText<span class="token operator">:</span> <span class="token string">"Info"</span><span class="token punctuation">,</span> description<span class="token operator">:</span> <span class="token string">"Onedrive items are not available for current logged in user."</span><span class="token punctuation">,</span> iconProperty<span class="token operator">:</span> <span class="token string">"Info"</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
QuickView.ts
Update data() to set state values to render in JSON.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">ISPFxAdaptiveCard</span><span class="token punctuation">,</span> <span class="token maybe-class-name">BaseAdaptiveCardView</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">'@microsoft/sp-adaptive-card-extension-base'</span><span class="token punctuation">;</span> <span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token operator">*</span> <span class="token keyword module keyword-as">as</span> strings</span> <span class="token keyword module keyword-from">from</span> <span class="token string">'GraphApiAceAdaptiveCardExtensionStrings'</span><span class="token punctuation">;</span> <span class="token keyword module keyword-import">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionProps</span><span class="token punctuation">,</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionState</span> <span class="token punctuation">}</span></span> <span class="token keyword module keyword-from">from</span> <span class="token string">'../GraphApiAceAdaptiveCardExtension'</span><span class="token punctuation">;</span> <span class="token keyword module keyword-export">export</span> <span class="token keyword keyword-interface">interface</span> <span class="token class-name">IQuickViewData</span> <span class="token punctuation">{</span> subTitle<span class="token operator">:</span> string<span class="token punctuation">;</span> title<span class="token operator">:</span> string<span class="token punctuation">;</span> onedriveItms<span class="token operator">:</span> any<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> errorMessage<span class="token operator">:</span> string<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword module keyword-export">export</span> <span class="token keyword keyword-class">class</span> <span class="token class-name">QuickView</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">BaseAdaptiveCardView</span> <span class="token operator"><</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionProps</span><span class="token punctuation">,</span> <span class="token maybe-class-name">IGraphApiAceAdaptiveCardExtensionState</span><span class="token punctuation">,</span> <span class="token maybe-class-name">IQuickViewData</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword keyword-public">public</span> <span class="token keyword keyword-get">get</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token maybe-class-name">IQuickViewData</span> <span class="token punctuation">{</span> <span class="token keyword control-flow keyword-return">return</span> <span class="token punctuation">{</span> subTitle<span class="token operator">:</span> strings<span class="token punctuation">.</span><span class="token property-access"><span class="token maybe-class-name">SubTitle</span></span><span class="token punctuation">,</span> title<span class="token operator">:</span> strings<span class="token punctuation">.</span><span class="token property-access"><span class="token maybe-class-name">Title</span></span><span class="token punctuation">,</span> onedriveItms<span class="token operator">:</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">state</span><span class="token punctuation">.</span><span class="token property-access">onedriveItms</span><span class="token punctuation">,</span> errorMessage<span class="token operator">:</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">state</span><span class="token punctuation">.</span><span class="token property-access">errorMessage</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword keyword-public">public</span> <span class="token keyword keyword-get">get</span> <span class="token function">template</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token maybe-class-name">ISPFxAdaptiveCard</span> <span class="token punctuation">{</span> <span class="token keyword control-flow keyword-return">return</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./template/QuickViewTemplate.json'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Move to the ./quickView/template folder.
Update QuickViewTemplate.json
- Update the data key with onedrive items state.
- We will render the name property with webUrl so it will update items and selectAction based on this.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span class="token punctuation">{</span> <span class="token string">"schema"</span><span class="token operator">:</span> <span class="token string">"http://adaptivecards.io/schemas/adaptive-card.json"</span><span class="token punctuation">,</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"AdaptiveCard"</span><span class="token punctuation">,</span> <span class="token string">"version"</span><span class="token operator">:</span> <span class="token string">"1.2"</span><span class="token punctuation">,</span> <span class="token string">"body"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"Container"</span><span class="token punctuation">,</span> <span class="token string">"separator"</span><span class="token operator">:</span> <span class="token string">"true"</span><span class="token punctuation">,</span> <span class="token string">"$data"</span><span class="token operator">:</span> <span class="token string">"${onedriveItms}"</span><span class="token punctuation">,</span> <span class="token string">"items"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"TextBlock"</span><span class="token punctuation">,</span> <span class="token string">"text"</span><span class="token operator">:</span> <span class="token string">"${name}"</span><span class="token punctuation">,</span> <span class="token string">"wrap"</span><span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">"selectAction"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"Action.OpenUrl"</span><span class="token punctuation">,</span> <span class="token string">"url"</span><span class="token operator">:</span> <span class="token string">"${webUrl}"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
Create ErrorMessageTemplate.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<span class="token punctuation">{</span> <span class="token string">"schema"</span><span class="token operator">:</span> <span class="token string">"http://adaptivecards.io/schemas/adaptive-card.json"</span><span class="token punctuation">,</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"AdaptiveCard"</span><span class="token punctuation">,</span> <span class="token string">"version"</span><span class="token operator">:</span> <span class="token string">"1.2"</span><span class="token punctuation">,</span> <span class="token string">"body"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"Container"</span><span class="token punctuation">,</span> <span class="token string">"separator"</span><span class="token operator">:</span> <span class="token string">"true"</span><span class="token punctuation">,</span> <span class="token string">"items"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"ColumnSet"</span><span class="token punctuation">,</span> <span class="token string">"separator"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">"columns"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"Column"</span><span class="token punctuation">,</span> <span class="token string">"width"</span><span class="token operator">:</span> <span class="token string">"auto"</span><span class="token punctuation">,</span> <span class="token string">"items"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"TextBlock"</span><span class="token punctuation">,</span> <span class="token string">"text"</span><span class="token operator">:</span> <span class="token string">"${description}"</span><span class="token punctuation">,</span> <span class="token string">"wrap"</span><span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
Create NoRecordsTemplate.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<span class="token punctuation">{</span> <span class="token string">"schema"</span><span class="token operator">:</span> <span class="token string">"http://adaptivecards.io/schemas/adaptive-card.json"</span><span class="token punctuation">,</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"AdaptiveCard"</span><span class="token punctuation">,</span> <span class="token string">"version"</span><span class="token operator">:</span> <span class="token string">"1.2"</span><span class="token punctuation">,</span> <span class="token string">"body"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"Container"</span><span class="token punctuation">,</span> <span class="token string">"separator"</span><span class="token operator">:</span> <span class="token string">"true"</span><span class="token punctuation">,</span> <span class="token string">"items"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"ColumnSet"</span><span class="token punctuation">,</span> <span class="token string">"separator"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">"columns"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"Column"</span><span class="token punctuation">,</span> <span class="token string">"width"</span><span class="token operator">:</span> <span class="token string">"auto"</span><span class="token punctuation">,</span> <span class="token string">"items"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"type"</span><span class="token operator">:</span> <span class="token string">"TextBlock"</span><span class="token punctuation">,</span> <span class="token string">"text"</span><span class="token operator">:</span> <span class="token string">"No Records found"</span><span class="token punctuation">,</span> <span class="token string">"wrap"</span><span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
Now, again, move to the GraphApiAceAdaptiveCardExtension.ts file.
1. Register views
- Here we have to register the views that we are creating.
2. Call services
- Call API which we have created in graph service to get one drive items.
3. Replace views and update states
- While calling an API, if an item’s length is greater than zero, then render records in quick view.
- If the record length is zero, then we will render the no records found view.
- If there is any error, show an error card with an error message.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<span class="token keyword keyword-public">public</span> <span class="token keyword keyword-async">async</span> <span class="token function">onInit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token known-class-name class-name">Promise</span> <span class="token operator"><</span> <span class="token keyword keyword-void">void</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">state</span> <span class="token operator">=</span> <span class="token punctuation">{</span> onedriveItms<span class="token operator">:</span> <span class="token keyword nil keyword-undefined">undefined</span><span class="token punctuation">,</span> noRecordsFoundMessage<span class="token operator">:</span> <span class="token keyword nil keyword-undefined">undefined</span><span class="token punctuation">,</span> errorMessage<span class="token operator">:</span> <span class="token keyword nil keyword-undefined">undefined</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">cardNavigator</span><span class="token punctuation">.</span><span class="token method function property-access">register</span><span class="token punctuation">(</span><span class="token constant">CARD_VIEW_REGISTRY_ID</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=></span> <span class="token keyword keyword-new">new</span> <span class="token class-name">CardView</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">cardNavigator</span><span class="token punctuation">.</span><span class="token method function property-access">register</span><span class="token punctuation">(</span><span class="token constant">NO_RECORDS_CARD_VIEW_REGISTRY_ID</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=></span> <span class="token keyword keyword-new">new</span> <span class="token class-name">NoRecordsView</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">cardNavigator</span><span class="token punctuation">.</span><span class="token method function property-access">register</span><span class="token punctuation">(</span><span class="token constant">ERROR_MESSAGE_CARD_VIEW_REGISTRY_ID</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=></span> <span class="token keyword keyword-new">new</span> <span class="token class-name">ErrorMessageCardView</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">quickViewNavigator</span><span class="token punctuation">.</span><span class="token method function property-access">register</span><span class="token punctuation">(</span><span class="token constant">QUICK_VIEW_REGISTRY_ID</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=></span> <span class="token keyword keyword-new">new</span> <span class="token class-name">QuickView</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword keyword-const">const</span> graphClient <span class="token operator">=</span> <span class="token keyword control-flow keyword-await">await</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">context</span><span class="token punctuation">.</span><span class="token property-access">msGraphClientFactory</span><span class="token punctuation">.</span><span class="token method function property-access">getClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> graphService<span class="token punctuation">.</span><span class="token method function property-access">init</span><span class="token punctuation">(</span>graphClient<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token keyword keyword-async">async</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=></span> <span class="token punctuation">{</span> <span class="token keyword control-flow keyword-await">await</span> graphService<span class="token punctuation">.</span><span class="token method function property-access">getOnedriveItems</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">then</span><span class="token punctuation">(</span><span class="token parameter">items</span> <span class="token arrow operator">=></span> <span class="token punctuation">{</span> <span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span><span class="token string">"one drive items:"</span><span class="token punctuation">,</span> items<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword control-flow keyword-if">if</span> <span class="token punctuation">(</span>items<span class="token punctuation">.</span><span class="token property-access">length</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token method function property-access">setState</span><span class="token punctuation">(</span><span class="token punctuation">{</span> onedriveItms<span class="token operator">:</span> items <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword control-flow keyword-else">else</span> <span class="token punctuation">{</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">cardNavigator</span><span class="token punctuation">.</span><span class="token method function property-access">replace</span><span class="token punctuation">(</span><span class="token constant">NO_RECORDS_CARD_VIEW_REGISTRY_ID</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword control-flow keyword-return">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token keyword control-flow keyword-catch">catch</span><span class="token punctuation">(</span><span class="token parameter">error</span> <span class="token arrow operator">=></span> <span class="token punctuation">{</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token method function property-access">setState</span><span class="token punctuation">(</span><span class="token punctuation">{</span> errorMessage<span class="token operator">:</span> error<span class="token punctuation">.</span><span class="token property-access">code</span> <span class="token operator">+</span> <span class="token string">":"</span> <span class="token operator">+</span> error<span class="token punctuation">.</span><span class="token property-access">message</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword keyword-this">this</span><span class="token punctuation">.</span><span class="token property-access">cardNavigator</span><span class="token punctuation">.</span><span class="token method function property-access">replace</span><span class="token punctuation">(</span><span class="token constant">ERROR_MESSAGE_CARD_VIEW_REGISTRY_ID</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword control-flow keyword-return">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">500</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword control-flow keyword-return">return</span> <span class="token known-class-name class-name">Promise</span><span class="token punctuation">.</span><span class="token method function property-access">resolve</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Print article | This entry was posted by Peter on July 28, 2022 at 5:07 am, and is filed under European SharePoint 2013 Hosting. Follow any responses to this post through RSS 2.0. Both comments and pings are currently closed. |