<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-691739770978360344</atom:id><lastBuildDate>Wed, 08 Jan 2025 22:34:51 +0000</lastBuildDate><category>SharePoint</category><category>Developer</category><category>Code</category><category>SharePoint 2010</category><category>C#</category><category>MOSS</category><category>wss</category><category>Undocumented</category><category>Code Free</category><category>JavaScript</category><category>SPFx</category><category>SharePoint Designer</category><category>SharePoint 2013</category><category>Web Part</category><category>ASP.NET</category><category>Data View Web Part</category><category>MOSS 2007</category><category>Publishing</category><category>Search</category><category>SharePoint Saturday</category><category>Visual Studio</category><category>WCM</category><category>how to</category><category>presentation</category><category>Client Code</category><category>Workflow</category><category>bug</category><category>master page</category><category>Anonymous</category><category>Events</category><category>Ribbon</category><category>WF</category><category>community benefit</category><category>conference</category><category>install</category><category>solution</category><category>Filter</category><category>IT</category><category>Product Customization</category><category>Virtual Machine</category><category>Visual Studio 2010 Tools for SharePoint</category><category>technical problem</category><category>CAML</category><category>CRM</category><category>Cache</category><category>Enterprise Taxonomy Management</category><category>Excel</category><category>FormsServer</category><category>InfoPath</category><category>Office UI Fabric</category><category>REST</category><category>Replaceable Parameters</category><category>Sun VirtaulBox</category><category>Tokens</category><category>Variations</category><category>WebServices</category><category>Windows 8</category><category>XSL</category><category>assembly folder</category><category>codeplex</category><category>delegate controls</category><category>site template</category><category>team site</category><category>Asmx</category><category>Audience</category><category>CRM SharePoint Connector</category><category>DataSheet</category><category>Forms</category><category>HTML</category><category>HyperV</category><category>IE</category><category>Impersonation</category><category>Internet</category><category>KPI</category><category>KnockoutJS</category><category>Metro</category><category>Navigation</category><category>SCORM</category><category>SEO</category><category>SLK</category><category>Sandbox Solution</category><category>Social</category><category>Upgrade</category><category>VSCode</category><category>WSP</category><category>Webinar</category><category>back up</category><category>content sources</category><category>education</category><category>feature</category><category>gallery</category><category>giving back</category><category>new release</category><category>restore</category><category>smart pages</category><category>special offer</category><category>spell check</category><category>wiki</category><title>KWizCom SharePoint Blog</title><description>A blog by the KWizCom SharePoint experts!&#xa;The KWizCom team, led by its VP R&amp;amp;D Shai Petel, utilizes its experience and knowledge to give a unique insight on Microsoft&amp;#39;s SharePoint platform - the leading business collaboration platform.</description><link>http://kwizcom.blogspot.com/</link><managingEditor>noreply@blogger.com (Igor Goldshtaub)</managingEditor><generator>Blogger</generator><openSearch:totalResults>229</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-9149597071402445968</guid><pubDate>Tue, 05 Oct 2021 15:03:00 +0000</pubDate><atom:updated>2021-10-05T08:03:00.494-07:00</atom:updated><title>Upcoming birthday column - without aging your employees!</title><description>&lt;p&gt;&amp;nbsp;Here is something I needed to do so many times, and I think I finally perfected it.&lt;/p&gt;&lt;p&gt;A simple HR request, is to show the employees upcoming birthdays, in a simple user friendly way without dating your employees! (So, without showing their birth year...)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I&#39;ve come up with this simple way of handling this, using 3 columns.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;First create a choice column for Month (01-12) and for Date (01-31).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Then, create a calculated column with output type &quot;Date&quot;, using this formula:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;=DATE(IF([Birth month]&amp;lt;TEXT(TODAY(),&quot;MM&quot;),YEAR(TODAY())+1,YEAR(TODAY())),[Birth month],[Birth date])&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;And boom - you will always get the employee&#39;s upcoming birthday in a date column that you can use to display on your site!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Explanation about the formula:&lt;/p&gt;&lt;p&gt;The formula will check if the birth month has past, and if so will use next year&#39;s birthday. Otherwise it will construct a date for the current year based on the month and date you entered before.&lt;/p&gt;&lt;p&gt;Want a cool way to show it?&lt;/p&gt;&lt;p&gt;Try our &lt;a href=&quot;https://kwizcom.com/sharepoint-apps/calendar-plus-app-for-sharepoint-online-office365&quot;&gt;Calendar Plus&lt;/a&gt; web part:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgg9cMNPxA-sHIZlje21yM0ZsecYgfM-zkXTORDEoO4wds2tSvKG-ncErMq35TADQ7yyt6w6LLrEpLrxozw06tOFYA9TPmknZjr7o-3mJYRDCUyfumx8tpAgGbT6eXALpcJr4TqIQqBy35//&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;214&quot; data-original-width=&quot;415&quot; height=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgg9cMNPxA-sHIZlje21yM0ZsecYgfM-zkXTORDEoO4wds2tSvKG-ncErMq35TADQ7yyt6w6LLrEpLrxozw06tOFYA9TPmknZjr7o-3mJYRDCUyfumx8tpAgGbT6eXALpcJr4TqIQqBy35//&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Want an even cooler way?&amp;nbsp;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Use our brand new &quot;Card&quot; control:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVd9ZkoP6jwn9boyBmP08uNO0eYn0zOXe_arP-QYqLJrRD3v1BHWEmA4buI73GmHP7RmnTeijTrkCoJbmthbVETmMCCGLbbc1tqcaOIj4D4yr0OzD4tDhJ_LW4JBz3eBzxwwz34SmOaQxx//&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;178&quot; data-original-width=&quot;315&quot; height=&quot;181&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVd9ZkoP6jwn9boyBmP08uNO0eYn0zOXe_arP-QYqLJrRD3v1BHWEmA4buI73GmHP7RmnTeijTrkCoJbmthbVETmMCCGLbbc1tqcaOIj4D4yr0OzD4tDhJ_LW4JBz3eBzxwwz34SmOaQxx//&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Hope this helps!&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2021/10/upcoming-birthday-column-without-aging.html</link><author>noreply@blogger.com (Shai Petel)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgg9cMNPxA-sHIZlje21yM0ZsecYgfM-zkXTORDEoO4wds2tSvKG-ncErMq35TADQ7yyt6w6LLrEpLrxozw06tOFYA9TPmknZjr7o-3mJYRDCUyfumx8tpAgGbT6eXALpcJr4TqIQqBy35/s72-c/" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-569832629555168342</guid><pubDate>Mon, 12 Nov 2018 17:34:00 +0000</pubDate><atom:updated>2018-11-12T09:35:28.035-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Code</category><category domain="http://www.blogger.com/atom/ns#">Data View Web Part</category><category domain="http://www.blogger.com/atom/ns#">SPFx</category><title>Changing the edit link on SPFx remote list viewer to open in same page</title><description>Just had a customer asking how to change the default edit link action icon in the table control of the remote list viewer add-in.&lt;br /&gt;
&lt;br /&gt;
Currently, it checks if the item has an edit link, and then opens it in a new window:&lt;br /&gt;
&lt;pre style=&quot;background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, &#39;Liberation Mono&#39;, Menlo, Courier, monospace; font-size: 11.9px; line-height: 1.45; overflow: auto; padding: 16px; word-wrap: normal;&quot;&gt;&lt;code&gt;return item.dvp_EditFormUrl &amp;amp;&amp;amp; window.open(item.dvp_EditFormUrl) || console.log(&#39;this item does not have a valid edit url.&#39;);&lt;/code&gt;&lt;/pre&gt;
This customer asked to have the edit item open in the same page/tab.&lt;br /&gt;
These customizations and changes are exactly what our product excels in. It is actually very simple to change.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Step 1&lt;/h3&gt;
&lt;div&gt;
Edit the web part. In the table control designer toolbar, click on the gear icon to open the control configuration panel:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj48WaEZN-wVCDHkt9g8NSmFEksnoPfX8ZieE5RxMcsQf_oveDMsjOUMGrpwcjQZLcgH2Kd6izCqT1_AQgnfY5R0jex64UtTUCXGhRXGtRyh3IAfgtUFdEZi1NRT3vmqjAyFSavN8PpW00e/s1600/rlv1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;773&quot; data-original-width=&quot;1384&quot; height=&quot;356&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj48WaEZN-wVCDHkt9g8NSmFEksnoPfX8ZieE5RxMcsQf_oveDMsjOUMGrpwcjQZLcgH2Kd6izCqT1_AQgnfY5R0jex64UtTUCXGhRXGtRyh3IAfgtUFdEZi1NRT3vmqjAyFSavN8PpW00e/s640/rlv1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Step 2&lt;/h3&gt;
&lt;div&gt;
In the control configuration panel, locate the edit action and click on it to open the action&#39;s script editor:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6pd3dYO8MvM32xZqCrRsMhevU4esD_gCdxng-ppruZXaETYDyR_wl_9taQaOh0DrOqztiXOqskzJjpZK2PjGYd2BCxovlMvxPAv0mPlK6iRC7SfZQvgfRHkRURXJe2u5UnoYo4E4Rktfm/s1600/rlv2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;948&quot; data-original-width=&quot;343&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6pd3dYO8MvM32xZqCrRsMhevU4esD_gCdxng-ppruZXaETYDyR_wl_9taQaOh0DrOqztiXOqskzJjpZK2PjGYd2BCxovlMvxPAv0mPlK6iRC7SfZQvgfRHkRURXJe2u5UnoYo4E4Rktfm/s400/rlv2.png&quot; width=&quot;143&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Step 3&lt;/h3&gt;
&lt;div&gt;
In the script editor you can change the icon, tooltip and script that this action runs.&lt;/div&gt;
&lt;div&gt;
Change the script to the following code to open it in a new window.&lt;/div&gt;
&lt;pre style=&quot;background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, &#39;Liberation Mono&#39;, Menlo, Courier, monospace; font-size: 11.9px; line-height: 1.45; overflow: auto; padding: 16px; word-wrap: normal;&quot;&gt;&lt;code&gt;if(item.dvp_EditFormUrl) window.location = item.dvp_EditFormUrl + &quot;&amp;amp;Source=&quot;+encodeURIComponent(window.location.href);&lt;/code&gt;&lt;/pre&gt;
Note: we added the current window as the Source parameter. This will make the edit form redirect back to this current page when the user is done editing the item.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0cTgf46YwMaWuLQhKrpHh9yQ7T4zGnQP-VlLhgOjSQfcS4IM4-OLh1UfrMq3ysL1-qjU18qMeCcIyIBzq9M4ZUNGlIeakrpNOslLjJWoDgZhCiHonTBmjMRrb49IyDtv-EyohRKtiX7A9/s1600/rlv3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;938&quot; data-original-width=&quot;822&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0cTgf46YwMaWuLQhKrpHh9yQ7T4zGnQP-VlLhgOjSQfcS4IM4-OLh1UfrMq3ysL1-qjU18qMeCcIyIBzq9M4ZUNGlIeakrpNOslLjJWoDgZhCiHonTBmjMRrb49IyDtv-EyohRKtiX7A9/s640/rlv3.png&quot; width=&quot;560&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
You are done. Click outside the dialog to close it.&lt;br /&gt;
&lt;br /&gt;
Made a mistake? Want to revert back to default? No worries. Like all other properties, once you change their default value, a &quot;revert to default...&quot; option appears under the new value, allowing you to revert your changes to go back to defaults quickly.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXxfu6bIAwgeT6B6v1el7ZsxX77FGs8dPTIVpit618odmhQuHvv7weJGdbhL1oxic5VfcaRIzlrGsoFgp5cf0Cu748Zq10lDEuLF7Y7LGvNrSVurotTpHfRnTFkn7VVvfB8ItIs1MpPPEq/s1600/rlv4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;282&quot; data-original-width=&quot;289&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXxfu6bIAwgeT6B6v1el7ZsxX77FGs8dPTIVpit618odmhQuHvv7weJGdbhL1oxic5VfcaRIzlrGsoFgp5cf0Cu748Zq10lDEuLF7Y7LGvNrSVurotTpHfRnTFkn7VVvfB8ItIs1MpPPEq/s1600/rlv4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Questions? Suggestions? Feel free to ask here in comments or email our support team.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2018/11/changing-edit-link-on-spfx-remote-list.html</link><author>noreply@blogger.com (Shai Petel)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj48WaEZN-wVCDHkt9g8NSmFEksnoPfX8ZieE5RxMcsQf_oveDMsjOUMGrpwcjQZLcgH2Kd6izCqT1_AQgnfY5R0jex64UtTUCXGhRXGtRyh3IAfgtUFdEZi1NRT3vmqjAyFSavN8PpW00e/s72-c/rlv1.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-3882756018802427742</guid><pubDate>Wed, 29 Aug 2018 21:33:00 +0000</pubDate><atom:updated>2018-08-29T14:33:09.623-07:00</atom:updated><title>Data view plus for SharePoint online (SPFx) template sample</title><description>And again... I love this web part so much I have to share another template I made with it.&lt;br /&gt;
&lt;br /&gt;
For those who don&#39;t know, the &lt;a href=&quot;http://www.kwizcom.com/sharepoint-apps/data-view-plus/download/&quot; target=&quot;_blank&quot;&gt;data view plus&lt;/a&gt;&amp;nbsp;is a versatile web part that connects to various data sources and display the data using several built in controls, plus it allows you to provide your own template for rendering.&lt;br /&gt;
&lt;br /&gt;
Current data sources are:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;SharePoint List&lt;/li&gt;
&lt;li&gt;Aggregation of several SharePoint Lists&lt;/li&gt;
&lt;li&gt;Excel File&lt;/li&gt;
&lt;li&gt;Graph API&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
but more are added all the time.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, I got an ask from our sales team to build a risk matrix sample template to a customer who was interested in this product.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Within a couple of hours of work I got this fully working template out to the customer - nothing but HTML and CSS work was needed!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Here is the result web part:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUvNZKRfrgmoLEpBbxNDHy-yjjRIAwVb8T9NwA8KTSUk3bm-0KQD7Ez9fvFJy4EZqoDHAc5NKqzsXf3S-ao860aAVWghKehWe1y0jR8GHL9XnQvVKCe5BEyXQqN9VHx6bu2Omv0KPVRVNV/s1600/risk1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;587&quot; data-original-width=&quot;818&quot; height=&quot;457&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUvNZKRfrgmoLEpBbxNDHy-yjjRIAwVb8T9NwA8KTSUk3bm-0KQD7Ez9fvFJy4EZqoDHAc5NKqzsXf3S-ao860aAVWghKehWe1y0jR8GHL9XnQvVKCe5BEyXQqN9VHx6bu2Omv0KPVRVNV/s640/risk1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
When hovering over a risk, here are the details:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEZvLq-3FM3Ba68umyK708HquV_wzmEP7_Ywf_FduE5imO2nt2oUVtSd9wg18Uy4S-XgBmL21vDrLuK2avN4TlMaSLcrFgoMofg-j1hHcROc4Mgp6rIGZZ-gdq1Ob81LvRRt0otA4fZdGn/s1600/risk2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;597&quot; data-original-width=&quot;646&quot; height=&quot;368&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEZvLq-3FM3Ba68umyK708HquV_wzmEP7_Ywf_FduE5imO2nt2oUVtSd9wg18Uy4S-XgBmL21vDrLuK2avN4TlMaSLcrFgoMofg-j1hHcROc4Mgp6rIGZZ-gdq1Ob81LvRRt0otA4fZdGn/s400/risk2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
You can see the filter control above the chart, and since this chart is built by custom HTML template - you can customize it as much as you want with full control on all rendering!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
And of course, the data source can be any one of the supported data sources so you have a very flexible, custom tailored solution to fit any requirement your clients may have!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Note: The template is available in the sample templates of the custom control as of version 1.0.0.8 build #47&lt;/div&gt;
&lt;div&gt;
Note 2: This sample template relies on the following fields to exist in the data source:&lt;/div&gt;
&lt;div&gt;
Title: text&lt;/div&gt;
&lt;div&gt;
Probability: number or choice (1-5)&lt;/div&gt;
&lt;div&gt;
Severity: number or choice&amp;nbsp;(1-5)&lt;/div&gt;
&lt;div&gt;
Project: any type&lt;/div&gt;
&lt;div&gt;
Risk Owner: any type&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2018/08/data-view-plus-for-sharepoint-online.html</link><author>noreply@blogger.com (Shai Petel)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUvNZKRfrgmoLEpBbxNDHy-yjjRIAwVb8T9NwA8KTSUk3bm-0KQD7Ez9fvFJy4EZqoDHAc5NKqzsXf3S-ao860aAVWghKehWe1y0jR8GHL9XnQvVKCe5BEyXQqN9VHx6bu2Omv0KPVRVNV/s72-c/risk1.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-8177437043792691190</guid><pubDate>Fri, 22 Jun 2018 12:48:00 +0000</pubDate><atom:updated>2018-06-22T05:48:32.927-07:00</atom:updated><title>SPFx 1.5 npm install errors</title><description>I recently wanted to upgrade my SPFx project from 1.4 to 1.5 release.&lt;br /&gt;
&lt;br /&gt;
I followed the instructions on sp-dev-docs for the upgrade (found here:&amp;nbsp;https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes-for-SharePoint-Framework-Package-v1.5)&lt;br /&gt;
&lt;br /&gt;
But at the last step - running npm install - I got a breaking error that would not let npm install complete:&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Error:&lt;/h3&gt;
&lt;div&gt;
&lt;blockquote style=&quot;background-color: white; border-left: 0.25em solid rgb(223, 226, 229); box-sizing: border-box; color: #6a737d; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin: 0px 0px 16px; padding: 0px 1em;&quot;&gt;
&lt;div style=&quot;box-sizing: border-box;&quot;&gt;
node-sass@4.9.0 install C:\testspfx\node_modules\node-sass&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;node scripts/install.js&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin-bottom: 16px;&quot;&gt;
Downloading binary from&amp;nbsp;&lt;a href=&quot;https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-57_binding.node&quot; style=&quot;background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration-line: none;&quot;&gt;https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-57_binding.node&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;Cannot download &quot;&lt;a href=&quot;https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-57_binding.node&quot; style=&quot;background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration-line: none;&quot;&gt;https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-57_binding.node&lt;/a&gt;&quot;:&lt;/div&gt;
&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin-bottom: 16px;&quot;&gt;
connect ETIMEDOUT 52.216.168.43:443&lt;/div&gt;
&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin-bottom: 16px;&quot;&gt;
Timed out whilst downloading the prebuilt binary&lt;/div&gt;
&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin-bottom: 16px;&quot;&gt;
Hint: If github.com is not accessible in your location&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;try setting a proxy via HTTP_PROXY, e.g.&lt;/div&gt;
&lt;pre style=&quot;background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;&quot;&gt;&lt;code style=&quot;background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;&quot;&gt;  export HTTP_PROXY=http://example.com:1234
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin-bottom: 16px;&quot;&gt;
or configure npm proxy via&lt;/div&gt;
&lt;pre style=&quot;background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;&quot;&gt;&lt;code style=&quot;background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;&quot;&gt;  npm config set proxy http://example.com:8080
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;background-color: white; border-left: 0.25em solid rgb(223, 226, 229); box-sizing: border-box; color: #6a737d; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin: 0px 0px 16px; padding: 0px 1em;&quot;&gt;
&lt;div style=&quot;box-sizing: border-box;&quot;&gt;
phantomjs-prebuilt@2.1.16 install C:\testspfx\node_modules\phantomjs-prebuilt&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;node install.js&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin-bottom: 16px;&quot;&gt;
Considering PhantomJS found at C:\Users\xxx\AppData\Roaming\npm\phantomjs.CMD&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;Looks like an&amp;nbsp;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;npm install -g&lt;/code&gt;&amp;nbsp;on windows; skipping installed version.&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;Downloading&amp;nbsp;&lt;a href=&quot;https://github.com/Medium/phantomjs/releases/download/v2.1.1/phantomjs-2.1.1-windows.zip&quot; style=&quot;background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration-line: none;&quot;&gt;https://github.com/Medium/phantomjs/releases/download/v2.1.1/phantomjs-2.1.1-windows.zip&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;Saving to C:\Users\xxx\AppData\Local\Temp\phantomjs\phantomjs-2.1.1-windows.zip&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;Receiving...&lt;/div&gt;
&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin-bottom: 16px;&quot;&gt;
Error making request.&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;Error: connect ETIMEDOUT 52.216.168.43:443&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;at Object._errnoException (util.js:992:11)&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;at _exceptionWithHostPort (util.js:1014:20)&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1186:14)&lt;/div&gt;
&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin-bottom: 16px;&quot;&gt;
Please report this full log at&amp;nbsp;&lt;a href=&quot;https://github.com/Medium/phantomjs&quot; style=&quot;background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration-line: none;&quot;&gt;https://github.com/Medium/phantomjs&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;npm WARN ajv-keywords@3.2.0 requires a peer of ajv@^6.0.0 but none is installed. You must install peer dependencies yourself.&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules\fsevents):&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.4: wanted {&quot;os&quot;:&quot;darwin&quot;,&quot;arch&quot;:&quot;any&quot;} (current: {&quot;os&quot;:&quot;win32&quot;,&quot;arch&quot;:&quot;x64&quot;})&lt;/div&gt;
&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin-bottom: 16px;&quot;&gt;
npm ERR! code ELIFECYCLE&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;npm ERR! errno 1&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;npm ERR! phantomjs-prebuilt@2.1.16 install:&amp;nbsp;&lt;code style=&quot;background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;node install.js&lt;/code&gt;&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;npm ERR! Exit status 1&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;npm ERR!&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;npm ERR! Failed at the phantomjs-prebuilt@2.1.16 install script.&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;npm ERR! This is probably not a problem with npm. There is likely additional logging output above.&lt;/div&gt;
&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin-bottom: 16px;&quot;&gt;
npm ERR! A complete log of this run can be found in:&lt;br style=&quot;box-sizing: border-box;&quot; /&gt;npm ERR! C:\Users\xxx\AppData\Roaming\npm-cache_logs\2018-06-21T17_03_52_895Z-debug.log&lt;/div&gt;
&lt;pre style=&quot;background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px; line-height: 1.45; overflow: auto; padding: 16px; word-wrap: normal;&quot;&gt;&lt;code style=&quot;background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;&quot;&gt;      _=+#####!
   ###########|       .-----------------------------------.
   ###/    (##|(@)    |          Congratulations!         |
   ###  ######|   \   |    Solution tester is created.    |
   ###/   /###|   (@) |  Run gulp serve to play with it!  |
   #######  ##|   /   &#39;-----------------------------------&#39;
   ###     /##|(@)
   ###########|
      **=+####!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
My setup:&lt;/h3&gt;
My package.json file is as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre lang=&quot;{r&quot; style=&quot;background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px; line-height: 1.45; overflow: auto; padding: 16px; word-wrap: normal;&quot;&gt;&lt;code style=&quot;background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;&quot;&gt;{
  &quot;name&quot;: &quot;dvp&quot;,
  &quot;version&quot;: &quot;1.0.1&quot;,
  &quot;private&quot;: true,
  &quot;engines&quot;: {
    &quot;node&quot;: &quot;&amp;gt;=0.10.0&quot;
  },
  &quot;dependencies&quot;: {
    &quot;@microsoft/sp-client-base&quot;: &quot;~1.0.0&quot;,
    &quot;@microsoft/sp-core-library&quot;: &quot;~1.5.0-plusbeta&quot;,
    &quot;@microsoft/sp-webpart-base&quot;: &quot;~1.5.0-plusbeta&quot;,
    &quot;@types/knockout&quot;: &quot;3.4.55&quot;,
    &quot;@types/webpack-env&quot;: &quot;1.13.1&quot;,
    &quot;@types/es6-promise&quot;: &quot;0.0.33&quot;,
    &quot;knockout&quot;: &quot;3.4.2&quot;
  },
  &quot;devDependencies&quot;: {
    &quot;@microsoft/sp-build-web&quot;: &quot;~1.5.0-plusbeta&quot;,
    &quot;@microsoft/sp-module-interfaces&quot;: &quot;~1.5.0-plusbeta&quot;,
    &quot;@microsoft/sp-webpart-workbench&quot;: &quot;~1.5.0-plusbeta&quot;,
    &quot;@types/chai&quot;: &quot;&amp;gt;=3.4.34 &lt;3 .6.0=&quot;&quot; mocha=&quot;&quot; types=&quot;&quot;&gt;=2.2.33 &lt;2 .6.0=&quot;&quot; build=&quot;&quot; bundle=&quot;&quot; clean=&quot;&quot; code=&quot;&quot; gulp=&quot;&quot; knockout-paging=&quot;&quot; scripts=&quot;&quot; test=&quot;&quot;&gt;&lt;/2&gt;&lt;/3&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Cause and workaround:&lt;/h3&gt;
I created a new project using version 1.5 but got the same error.&lt;br /&gt;
So, next - I removed all packages in my package.json, deleted my node_modules folder and added them back one by one running npm install after each one to see which one was causing this issue.&lt;br /&gt;
&lt;br /&gt;
I found the cause for this issue is coming from a dependency of one of the &quot;@microsoft/sp&quot; packages in my dev dependencies... not something I can live without.&lt;br /&gt;
&lt;br /&gt;
I still can&#39;t be sure what is causing this issue but a bit of googling around I encountered a lot of people had a similar issue a few months or years back.&lt;br /&gt;
&lt;br /&gt;
It seems to be something with the npm package installer causing it, and the workaround many people were using was:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: rgba(27, 31, 35, 0.05); color: #24292e; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 11.9px;&quot;&gt;npm install phantomjs-prebuilt@2.1.16 --ignore-scripts&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So, I ran that command separately which completed successfully. Next I run the full npm install and what do you know! It finished successfully (with the regular list of 100+ warnings LOL)&lt;br /&gt;
&lt;br /&gt;
Ran gulp, fixed a couple of lines of code that had to be changed and done. Now my project compiles and runs on SPFx 1.5&lt;br /&gt;
&lt;br /&gt;
Still, this took an awful lot of time and the upgrade process is still something I fear as I have yet to have a single version upgraded without running into some npm hell like that (or worst) that just took half a day of work to fix.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Well, hope this helps someone else save some time! Good luck!&lt;br /&gt;
&lt;br /&gt;
(reference github issue:&amp;nbsp;https://github.com/SharePoint/sp-dev-docs/issues/2092)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2018/06/spfx-15-npm-install-errors.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-465529785368097482</guid><pubDate>Mon, 07 May 2018 21:12:00 +0000</pubDate><atom:updated>2018-05-07T14:12:25.664-07:00</atom:updated><title>SharePoint 2013 date picker scrolls form to the top</title><description>Just recently noticed a bug in SharePoint 2013... Yeah, I know it is 2018 now LOL&lt;br /&gt;
&lt;br /&gt;
The bug is simple but very annoying.&lt;br /&gt;
If you have a long list form, with many columns, and you have a few date columns at the bottom - beyond the scroll position - clicking any date picker will open the picker but will scroll your page to the top.&lt;br /&gt;
&lt;br /&gt;
This happens when using non-IE browsers (I use chrome), and it is the result of the following code running INSIDE the picker iframe:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; function: setFocusDatepicker&lt;br /&gt;
&lt;br /&gt;
Is trying to set focus to the current date element.&lt;br /&gt;
&lt;br /&gt;
Now, since this code is executed in the iframe it could be tricky to fix, since we don&#39;t have any code running in that iframe, but our code runs on the current window...&lt;br /&gt;
&lt;br /&gt;
But there seems to be a fix for that we can use a little (a lot actually) JavaScript trickery to manipulate the frame&#39;s code from the containing document.&lt;br /&gt;
&lt;br /&gt;
We will hook up to OnIframeLoadFinish function, which is called when the iframe of the picker is ready.&lt;br /&gt;
&lt;br /&gt;
Once inside, we will find the function setFocusDatepicker INSIDE the iframe.&lt;br /&gt;
(Note: this is only allowed since we are on the same domain as the iframe...)&lt;br /&gt;
&lt;br /&gt;
Then we will override the setFocusDatepicker to keep the workspace scrollTop, call setFocusDatepicker, and then restore the workspace scrollTop.&lt;br /&gt;
&lt;br /&gt;
Here is the complete code, just call it once after all scripts were loaded:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #eeeeee; border: 1px solid black; overflow: auto; padding: 4px; white-space: pre;&quot;&gt;
ExecuteOrDelayUntilScriptLoaded(
    function() {
        if (typeof(window.original_OnIframeLoadFinish) !== &#39;function&#39;) {
            window.original_OnIframeLoadFinish = window.OnIframeLoadFinish;
            window.OnIframeLoadFinish = function() {
                original_OnIframeLoadFinish.apply(this, arguments);
                window.Picker.contentWindow.original_setFocusDatepicker = window.Picker.contentWindow.setFocusDatepicker;

                window.Picker.contentWindow.setFocusDatepicker = function() {
                    workspaceTop = document.getElementById(&#39;s4-workspace&#39;).scrollTop;
                    window.Picker.contentWindow.original_setFocusDatepicker.apply(this, arguments);
                    document.getElementById(&#39;s4-workspace&#39;).scrollTop = workspaceTop;
                }
            }
        }
    }, &quot;datepicker.js&quot;);
&lt;/div&gt;
&lt;br /&gt;
Enjoy!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2018/05/sharepoint-2013-date-picker-scrolls.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-8278520323086803286</guid><pubDate>Mon, 09 Apr 2018 21:38:00 +0000</pubDate><atom:updated>2018-04-09T15:25:49.643-07:00</atom:updated><title>Upgrading SPFx React from 1.1.0 to 1.4.0 build errors</title><description>Hey guys,&lt;br /&gt;
&lt;br /&gt;
I&#39;ve been playing with my SPFx demo project (code here on GitHub) getting ready for my session @SPSTC when I decided perhaps its time to upgrade one of my demo web parts to SPFx version 1.4.0 while keeping the other one in 1.1.0 so that I can discuss the upgrade process.&lt;br /&gt;
&lt;br /&gt;
The upgrade process is, as I stated many times, a very tedious and hard manual work - and VERY error prone and time consuming.&lt;br /&gt;
&lt;br /&gt;
Here are a few notes I gathered from this upgrade that I&#39;d like to share - join my session to get the full picture!&lt;br /&gt;
&lt;br /&gt;
Following this article as my base-line:&amp;nbsp;https://docs.microsoft.com/en-us/sharepoint/dev/spfx/toolchain/update-latest-packages&lt;br /&gt;
&lt;div&gt;
There are a few things that went wrong here...&lt;br /&gt;
&lt;h4&gt;
React versions&lt;/h4&gt;
If you follow this guide, it says to run npm outdated and get all packages to the latest versions. Well, that simply is bad advice since when it comes to the react packaged - you should get the same version that the Microsoft packages are using. This is not explained anywhere - you just end up with hundreds of errors in your gulp command with no clue why they are there or how to fix them. I simply went into the Microsoft packages and saw they were using these versions so I used the same:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&quot;@types/react&quot;: &quot;15.6.6&quot;&lt;/li&gt;
&lt;li&gt;&quot;@types/react-dom&quot;: &quot;15.5.6&quot;&lt;/li&gt;
&lt;li&gt;&quot;react&quot;: &quot;15.6.2&quot;&lt;/li&gt;
&lt;li&gt;&quot;react-dom&quot;: &quot;15.6.2&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
That brought down the errors count to 1. Sounds simple? Not so much...&lt;/div&gt;
&lt;h4&gt;
React createComponent error&lt;/h4&gt;
&lt;div&gt;
See, in my web part demo that was built on version 1.1.0 of SPFx - the react component class was declared as:&lt;/div&gt;
&lt;div style=&quot;background-color: #eeeeee; border: 1px solid black; padding: 4px;&quot;&gt;
export default class ReactWebPart extends React.Component&amp;lt;IReactWebPartProps, void&amp;gt;&lt;/div&gt;
&lt;div&gt;
In the web part class, it was used in this code:
&lt;br /&gt;
&lt;div style=&quot;background-color: #eeeeee; border: 1px solid black; overflow: auto; padding: 4px;&quot;&gt;
&lt;pre&gt;      const element: React.ReactElement&amp;lt;IReactWebPartProps&amp;gt; = React.createElement&amp;lt;IReactWebPartProps&amp;gt;(
        ReactWebPart,
        {
          description: this.properties.description,
          userName: Utilities.GetUserName(this.context as any),
          license: licenseMessage,
          color: this.properties.color
        }
      );&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
which, in turn, produced this error message:
&lt;/div&gt;
&lt;div style=&quot;background-color: #eeeeee; border: 1px solid black; overflow: auto; padding: 4px;&quot;&gt;
&lt;pre&gt;Error - typescript - src/webparts/reactWebPart/ReactWebPartWebPart.ts(27,8): error TS2345: Argument of type &#39;typeof ReactWebPart&#39; is not assignable to parameter of type &#39;string | ComponentClass&amp;lt;IReactWebPartProps&amp;gt; | StatelessComponent&amp;lt;IReactWebPartProps&amp;gt;&#39;.
Error - &#39;typescript&#39; sub task errored after 4.49 s
 TypeScript error(s) occurred.&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
So, we checked the typescript version we were running, all the npm modules dependencies and versions - they all seemed to check out.&lt;br /&gt;
We went with our favorite way for fixing SPFx versioning issues:&lt;br /&gt;
We created a new sample SPFx React web part, and if that one (hopefully) compiles - we compare the two.&lt;br /&gt;
&lt;br /&gt;
In our case, since this is a sample component without a lot of code - it was easier to find the difference between the two.&lt;br /&gt;
In the new project, the react component class is defined with one difference:&lt;/div&gt;
&lt;div style=&quot;background-color: #eeeeee; border: 1px solid black; overflow: auto; padding: 4px;&quot;&gt;
export default class ReactWebPart extends React.Component&amp;lt;IReactWebPartProps, {}&amp;gt;&lt;/div&gt;
&lt;div&gt;
See, the &quot;void&quot; that was sent in as the react state was changed to an empty object.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This made the error go away and now our project compiles with no problem. Yay!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I can&#39;t help but feeling SPFx tooling still has a long way to go before it will be adopted by the mass development community. It can get pretty frustrating every time you have to move computers or upgrade versions to the point that it is just scary and unpredictable.&lt;br /&gt;
&lt;br /&gt;
That said - I have to admit it is brilliant, fast and fun to build on when you get it to compile. So - I&#39;m keeping my hopes up for this platform.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I will continue to provide this feedback to the team @Microsoft, which are doing a great job at listening for feedback, but please also share your experience in the comments below, on their GitHub project&amp;nbsp; or by voting on user voice requests.&lt;br /&gt;
&lt;br /&gt;
Here is a link to the GitHub with this project in case you want to see the code changes during the upgrade:&amp;nbsp;https://github.com/KWizCom/SPFxDemo&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Hope this helps,&lt;/div&gt;
&lt;div&gt;
Shai.&lt;/div&gt;
&lt;div&gt;
Funny thing... not 5 minutes after posting this, I went back to my demo and run gulp. Guess what? It errored out. This time showing this strange error:&lt;/div&gt;
&lt;div style=&quot;background-color: #eeeeee; border: 1px solid black; overflow: auto; padding: 4px;&quot;&gt;
&lt;pre&gt;[17:53:08] Error - Unknown
 Cannot find module &#39;typescript&#39;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
Guess what worked this time to fix this? delete node_modules folder and running npm install again...&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2018/04/upgrading-spfx-react-from-110-to-140.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-3534777810932648193</guid><pubDate>Wed, 28 Mar 2018 19:43:00 +0000</pubDate><atom:updated>2018-04-25T11:57:26.982-07:00</atom:updated><title>Transforming SharePoint radio buttons to appear horizontal</title><description>Recently I was at SharePoint Fest DC.&lt;br /&gt;
While I was at KWizCom&#39;s booth, one of our customers approached me with a question:
He had a list form with lots of radio buttons.&lt;br /&gt;
They each had just a few choices, but the form didn&#39;t look very nice since they all stretched out too long and narrow.&lt;br /&gt;
See, SharePoint always renders radio button choice fields vertically...&lt;br /&gt;
&lt;br /&gt;
He wanted to have these choice columns render in a horizontal layout instead of the OOB vertical one. (side by side instead of under each other)&lt;br /&gt;
&lt;br /&gt;
In other words, from something that looks very much like this:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1oS7eElaegKAmMySVIHNE1sTARavzPfpELuzsXXimqilKDZ08SU6rZC2EAcOnk2cNAzw_zpx60eW3jbmGuTv-NNDgFCfct8U1rFhBD3QTppO4B-SKgpGNI4QmSH1xifwUR98enHq2Z5jh/s1600/Screen+Shot+2018-03-28+at+3.36.55+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1052&quot; data-original-width=&quot;1354&quot; height=&quot;248&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1oS7eElaegKAmMySVIHNE1sTARavzPfpELuzsXXimqilKDZ08SU6rZC2EAcOnk2cNAzw_zpx60eW3jbmGuTv-NNDgFCfct8U1rFhBD3QTppO4B-SKgpGNI4QmSH1xifwUR98enHq2Z5jh/s320/Screen+Shot+2018-03-28+at+3.36.55+PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Into something that looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw0icx6T2FEJGm0d8y8arRPQEwfWzMyn0_3k6b42yVS1Zhh3ewC5o4xvV7an0SygUfY9ahyphenhyphenNVDoQouy7O7eEDVehcpKQ4XyLoEKmgq4sDLgpjyrBeMYe1PKdVg606UM2-OSghtQa985Gh7/s1600/Screen+Shot+2018-03-28+at+3.39.08+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;889&quot; data-original-width=&quot;1370&quot; height=&quot;207&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw0icx6T2FEJGm0d8y8arRPQEwfWzMyn0_3k6b42yVS1Zhh3ewC5o4xvV7an0SygUfY9ahyphenhyphenNVDoQouy7O7eEDVehcpKQ4XyLoEKmgq4sDLgpjyrBeMYe1PKdVg606UM2-OSghtQa985Gh7/s320/Screen+Shot+2018-03-28+at+3.39.08+PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
(Due to privacy of his content, I can&#39;t share his exact form layout - but he had a few more of them spread around the form)&lt;br /&gt;
&lt;br /&gt;
So, you might notice the customer was already using our forms solution and had the form render in a 2 column layout and with the column captions above the controls.&lt;br /&gt;
&lt;br /&gt;
Because of that, the change he requested was very simple to implement so I was happy to do it on the spot with him, on his laptop.&lt;br /&gt;
&lt;br /&gt;
It took about 2 minutes to complete, he was very impressed, but I must admit - this wasn&#39;t a very challenging request if you know your way around CSS.&lt;br /&gt;
&lt;br /&gt;
All he had to do was:&lt;br /&gt;
1. Create a CSS file with a new class that targets the table in radio buttons choice columns&lt;br /&gt;
2. Change the rows of the table to display inline instead of breaking row like it usually does in HTML&lt;br /&gt;
2. Save the CSS file in site assets&lt;br /&gt;
3. Get our Forms solution to load this new CSS file and all done!&lt;br /&gt;
&lt;br /&gt;
Here is the CSS needed to make this change, it should work on SP2013, SP2016 and SharePoint online in classic UI:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; line-height: 18px; white-space: pre;&quot;&gt;
&lt;span style=&quot;color: #d7ba7d;&quot;&gt;table[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;$=&lt;span style=&quot;color: #ce9178;&quot;&gt;&#39;RadioTable&#39;&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;] tr&lt;/span&gt;{
    &lt;span style=&quot;color: #9cdcfe;&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color: #ce9178;&quot;&gt;inline&lt;/span&gt;;
}&lt;/div&gt;
&lt;br /&gt;
Note: if you don&#39;t use KWizCom Forms, you will have to load the CSS some other way to the page, but this solution should still work.&lt;br /&gt;
&lt;br /&gt;
Note #2: this wasn&#39;t tested on modern UI, but on classic. It might require some minor tweaking to work in modern UI, let me know in the comments if this is something you need and having trouble achieving.&lt;br /&gt;
&lt;br /&gt;
Enjoy!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2018/03/transforming-sharepoint-radio-buttons.html</link><author>noreply@blogger.com (Shai Petel)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1oS7eElaegKAmMySVIHNE1sTARavzPfpELuzsXXimqilKDZ08SU6rZC2EAcOnk2cNAzw_zpx60eW3jbmGuTv-NNDgFCfct8U1rFhBD3QTppO4B-SKgpGNI4QmSH1xifwUR98enHq2Z5jh/s72-c/Screen+Shot+2018-03-28+at+3.36.55+PM.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-6641324477826677459</guid><pubDate>Fri, 09 Mar 2018 17:38:00 +0000</pubDate><atom:updated>2018-03-09T09:38:14.013-08:00</atom:updated><title>Recent breaking changes in SharePoint Online</title><description>If you ever wondered why SharePoint online apps/add-ins/products are sold almost exclusively as subscription - here is your answer.&lt;br /&gt;
&lt;br /&gt;
We at KWizCom run full automated testing on several production tenants as well as on our own fast-ring release tenant every night, as well as after every build is pushed to fast ring or to production.&lt;br /&gt;
&lt;br /&gt;
More often than we&#39;d like, we see glitches or breaking changes pushed to production that make some or all of our code stop working as intended.&lt;br /&gt;
&lt;br /&gt;
Here are a couple of stories from the past 48 hours:&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
First&lt;/h2&gt;
&lt;br /&gt;
Product manager sets up a live demo of our forms solution. EVERY THING breaks. Pages load with no settings, after a refresh - with only some settings and on other times normally with everything working.&lt;br /&gt;
&lt;br /&gt;
We investigate and notice that SPO (SharePoint Online) is returning a JS file we store under the site assets with a different content every time.&lt;br /&gt;
&lt;br /&gt;
We cancel all caching, open the file in the browser - and you won&#39;t believe it! We get a different file every time!&lt;br /&gt;
&lt;br /&gt;
We rename the file, so the file in that URL doesn&#39;t exist anymore. Is the problem gone? No - it&#39;s worst. Now it comes back in 3 different versions as well as a 404 not found error occasionally.&lt;br /&gt;
&lt;br /&gt;
I&#39;m freaking out, calling on all my Microsoft contacts to investigate. Within 6 hours the problem is gone like it never happens.&lt;br /&gt;
&lt;br /&gt;
Was I dreaming? NO! I got the video to prove it:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/WgaR1jYM4gI?rel=0&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Now, obviously I can&#39;t reproduce it so I can&#39;t give Microsoft additional information, there is no way to know what happened and how to prevent it from happening again.&lt;br /&gt;
&lt;br /&gt;
(Sounds to me, like a new caching feature was being tested out and pushed to production, then later pulled back).&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Second&lt;/h2&gt;
&lt;div&gt;
You thought the first story was strange? try this one. We have a provider hosted app that customers are required to install in order to get our products working.&lt;/div&gt;
&lt;div&gt;
We literally had this app for YEARS with no problems.&lt;/div&gt;
&lt;div&gt;
Two days ago we get a support call that no one can install our provider hosted app.&lt;/div&gt;
&lt;div&gt;
We check and see that our app has an install and uninstall remote event receivers - and that event receiver is throwing error 500.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This event receiver code hasn&#39;t changed in years, so what happened?&lt;/div&gt;
&lt;div&gt;
Well, a built in method that visual studio project auto-generated for us that gets the clientContext used to work, or return null if the app was not trusted.&lt;/div&gt;
&lt;div&gt;
In the last 48 hours it now stopped working and was throwing an exception blowing up our event handler.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Fun times.&lt;/div&gt;
&lt;div&gt;
In the first case, we had nothing to do but wait, in the second - it was a simply easy fix. But you get my point as to why we need to constantly monitor and push updates for our products?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now, you might better understand why I am a strong advocate of allowing vendors to update apps remotely without forcing each user to install a new package (like they try to make us do in the new SPFx eco-system).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
We literally push hundreds of updates and fixes every month for all our products without bothering the users to install them - I can&#39;t imagine we would have happy customers if they would need to install hundreds of updated packages every month...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now, if you are wondering why we need so many updates, and boasting about your single app that was built X years ago and working until today - ask yourself what does it do. My guess: not much more than saying &quot;hello&quot; or showing the current time and weather... ;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Hope this provides some insight to those who are looking to support SPO or any cloud service in their products. Sound off in the comments if you have more to add!&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2018/03/recent-breaking-changes-in-sharepoint.html</link><author>noreply@blogger.com (Shai Petel)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/WgaR1jYM4gI/default.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-2669550427167991166</guid><pubDate>Tue, 06 Mar 2018 19:41:00 +0000</pubDate><atom:updated>2018-06-06T07:10:52.887-07:00</atom:updated><title>Speaking Engagements 2018</title><description>ust FYI, my speaking engagements for 2018 are posted here, If you are around – come see me!&lt;br /&gt;
&lt;br /&gt;
If you were in one of my sessions, you can find links to the session code and presentation below.&lt;br /&gt;
&lt;br /&gt;
Also – if you have any comments on my session – feel free to post it here!&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
February 21, 2018 - Toronto SharePoint User Group -&amp;nbsp;&lt;a href=&quot;https://kwizcom.blogspot.ca/2017/08/spfx-isv-insight-to-microsofts-latest.html&quot; target=&quot;_blank&quot;&gt;SPFx: An ISV Insight to Microsoft’s latest customization model&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
March 26, 2018 - SPFest DC -&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=6o56IYjQ8gM&quot; target=&quot;_blank&quot;&gt;Who Said You Have to Be a Power-User to Create Dynamic Forms in SharePoint/O365?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
April 14, 2018, SPS Twin Cities -&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=6o56IYjQ8gM&quot; target=&quot;_blank&quot;&gt;Who Said You Have to Be a Power-User to Create Dynamic Forms in SharePoint/O365?&lt;/a&gt;&amp;nbsp;+ Introducing KWizCom SPFx web parts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;
&lt;div style=&quot;margin: 0px;&quot;&gt;
May 29, 2018 - European Collaboration Summit -&amp;nbsp;&lt;a href=&quot;https://kwizcom.blogspot.ca/2017/08/spfx-isv-insight-to-microsofts-latest.html&quot; target=&quot;_blank&quot;&gt;SPFx: An ISV Insight to Microsoft’s latest customization model&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2018/03/speaking-engagements-2018.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-3736154573979855528</guid><pubDate>Fri, 09 Feb 2018 15:08:00 +0000</pubDate><atom:updated>2018-02-09T07:08:20.945-08:00</atom:updated><title>Windows 10 updates and Hyper-V - beware!</title><description>So, I always have a local copy of a full SharePoint farm with a domain controller, data base, exchange server, SharePoint servers from version 2007, 2010, 2013 and 2016 on my desktop.&lt;br /&gt;
&lt;br /&gt;
Its a beast with 16 cores and 100gb of ram.&lt;br /&gt;
&lt;br /&gt;
The OSs of the VMs are windows server versions, some newer and some older like windows server 2008 R2.&lt;br /&gt;
&lt;br /&gt;
In one of the recent updates on my windows 10 host OS, all my VMs were completely gone from hyper V.&lt;br /&gt;
I lost all configurations and all snapshots without any warning!&lt;br /&gt;
&lt;br /&gt;
Only 1 VM survived - the one with the newest OS running the SP2016 server.&lt;br /&gt;
&lt;br /&gt;
After re-adding my VMs using the original VHD drives I thought the worst is behind me.&lt;br /&gt;
&lt;br /&gt;
Not so -&lt;br /&gt;
&lt;br /&gt;
It seems the good guys at Microsoft went into a bit of a logic-endless-loop here...&lt;br /&gt;
&lt;br /&gt;
See, they moved all hyper-v drivers into windows update.&lt;br /&gt;
Since it is all in windows update - there is no need for the VM integration disc anymore.&lt;br /&gt;
So, they removed the vmguest.iso file and the menu option to &quot;insert integration services setup disk&quot;.&lt;br /&gt;
They claim it is not needed since all VMs now have the network drivers built-in and then can connect to windows update to get the drivers they need.&lt;br /&gt;
What about OSs that don&#39;t have the drivers? - use the legacy network drive!&lt;br /&gt;
But, the legacy network drive doesn&#39;t work on 64bit OS.&lt;br /&gt;
No problem - get the latest drive from windows update!&lt;br /&gt;
&lt;br /&gt;
Well, after going around in a loop for a day and a half I was finally able to get the vmguest.iso file from a colleague (Thanks Kevin!).&lt;br /&gt;
&lt;br /&gt;
I inserted it into the VM and run the installation, and once completed my network adapter showed up again.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;I guess this was done since Microsoft doesn&#39;t officially support windows 2008 anymore, the question is - why purposely kill support for this OS? You had something working, why not just keep it as it?&lt;br /&gt;
&lt;br /&gt;
Or, it could have just been something they missed in the latest update.&lt;br /&gt;
&lt;br /&gt;
Anyway - keep an eye out for this update, and keep a safe copy of the vmguest.iso if you got one!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2018/02/windows-10-updates-and-hyper-v-beware.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-4515396947382787423</guid><pubDate>Thu, 04 Jan 2018 23:03:00 +0000</pubDate><atom:updated>2018-01-04T15:03:30.709-08:00</atom:updated><title>Customizing KWizCom SPFx remote list viewer to add google maps popup</title><description>We are hard at work here at KWizCom working hard to bring you amazing SPFx web parts. I&#39;m sure you know that.&lt;br /&gt;
&lt;br /&gt;
One of our best offerings are now a bundle of some amazing web parts that are all built on SPFx using KnockoutJS templating and bindings - which gives you the power to influence and change the HTML template of these web parts, or write some custom actions and buttons to really make them feel like custom tailored solutions for your exact needs.&lt;br /&gt;
&lt;br /&gt;
One example I want to discuss today is something our product manager asked me 10 minutes before doing a demo for a potential customer, who mentioned he was interested in showing a location from a list item&#39;s column in a popup google map.&lt;br /&gt;
&lt;br /&gt;
He was demoing our remote list viewer app&amp;nbsp;http://www.kwizcom.com/sharepoint-apps/remote-list-viewer/overview/&lt;br /&gt;
&lt;br /&gt;
but this is true for our list aggregator or any of our web parts that are built on top of our amazing Data View Plus:&amp;nbsp;http://www.kwizcom.com/sharepoint-apps/data-view-plus/overview/&lt;br /&gt;
&lt;br /&gt;
So, in just a few minutes I was able to provide him with this script that would add an action to the table control that opens a city or address from a column named &quot;City&quot; or &quot;Title&quot; in a popup.&lt;br /&gt;
&lt;br /&gt;
Here is how it works.&lt;br /&gt;
&lt;br /&gt;
Start with a list that has a location either in the Title column, or in a column named &quot;City&quot;.&lt;br /&gt;
(you can have any other column names you want - you will just have to specify the column name in the script sample...)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjtc1taQe4dUoF7Z9-1L4oGuC6TEzkUPbExpM648MspG-sDihQ4UKIJaf7rAp5_mYe_YID46BLXHEUVBclaDjYI895uXI5Xp_Vk09WZcUbUxoaxViLQHWJRygpfulisRFn8Rx_9yUKQpFN/s1600/list.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;445&quot; data-original-width=&quot;781&quot; height=&quot;182&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjtc1taQe4dUoF7Z9-1L4oGuC6TEzkUPbExpM648MspG-sDihQ4UKIJaf7rAp5_mYe_YID46BLXHEUVBclaDjYI895uXI5Xp_Vk09WZcUbUxoaxViLQHWJRygpfulisRFn8Rx_9yUKQpFN/s320/list.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Next, lets create a modern page and add a remote list viewer to it, setting the data source to this list:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBuDMnOLmmItW1T3E0LaX3xX8573C7kz0CeTe3QDa1apqza7K9E-iKzqfDSf-VGqCP1GiS9D6RTVQoC8g7tbJfaJnHR9drpMw5Vf_G-f-K6J_fdeSNhsIlr5sKlxczWglwtjcXFYeCkBHW/s1600/insert+web+part.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;797&quot; data-original-width=&quot;1053&quot; height=&quot;242&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBuDMnOLmmItW1T3E0LaX3xX8573C7kz0CeTe3QDa1apqza7K9E-iKzqfDSf-VGqCP1GiS9D6RTVQoC8g7tbJfaJnHR9drpMw5Vf_G-f-K6J_fdeSNhsIlr5sKlxczWglwtjcXFYeCkBHW/s320/insert+web+part.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
You end up with this basic table control showing your list items. Please note the action buttons on each row - these are customizable actions that we are going to change:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSq6NoBiGhMB6AtGZyxzlTWwXCXpdvzFWW_wTUqpimxCEw2WpMCFv_wEfyl24v7wxdi5_suKZtf7H1gjVwNIFtnVNYANQ9I-STi-HQiSgi8JG0ugMit4FI0d18D-XkOBnilwpiNMsNEhEU/s1600/basic+list.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;843&quot; data-original-width=&quot;864&quot; height=&quot;312&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSq6NoBiGhMB6AtGZyxzlTWwXCXpdvzFWW_wTUqpimxCEw2WpMCFv_wEfyl24v7wxdi5_suKZtf7H1gjVwNIFtnVNYANQ9I-STi-HQiSgi8JG0ugMit4FI0d18D-XkOBnilwpiNMsNEhEU/s320/basic+list.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Now, just click the &quot;Open designer&quot; button to bring up our template designer, scroll down and expand &quot;configure table&quot; section where you will find the &quot;Item actions&quot; list:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiglEg-8jr1AdhAU29fvH4krbZ35PNkO_46y63iZ6yjiDiKhvj1Xw8Y-WY3QR-yG1rhWPxpSoFFB3Sa4QIGmYvscg3ANFoomB8PhPpZMpPbuoEDw633e_rGslXeGpukhER5Fw9WeVDg3FWE/s1600/item+actions.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;256&quot; data-original-width=&quot;288&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiglEg-8jr1AdhAU29fvH4krbZ35PNkO_46y63iZ6yjiDiKhvj1Xw8Y-WY3QR-yG1rhWPxpSoFFB3Sa4QIGmYvscg3ANFoomB8PhPpZMpPbuoEDw633e_rGslXeGpukhER5Fw9WeVDg3FWE/s1600/item+actions.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
By default we provide an item click action plus 4 actions with icons for each item:&lt;br /&gt;
1. Open item properties in a popup&lt;br /&gt;
2. Open a new email with the item&#39;s properties&lt;br /&gt;
3. Open the item view form in a new window&lt;br /&gt;
4. Open the item edit form in a new window&lt;br /&gt;
&lt;br /&gt;
Choose any one of these to replace, click on it and an action editor popup will open. First - change the icon to something with a map (you can type &quot;map&quot; to filter the icons list):&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjRrxsvZJJB40dTNHbldqj6FfroEcS-4aR0tFSTCxLYcOZTj8XFJ2QVeg7_UWC4gaZUZ5rrDvRy8XgFjYgbrVIhmTvNbpoHhJgLeOwV8nrtutfnjOgvpz1nzUPsh09EBEvw-9HRGTADAje/s1600/action+icon.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;501&quot; data-original-width=&quot;573&quot; height=&quot;279&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjRrxsvZJJB40dTNHbldqj6FfroEcS-4aR0tFSTCxLYcOZTj8XFJ2QVeg7_UWC4gaZUZ5rrDvRy8XgFjYgbrVIhmTvNbpoHhJgLeOwV8nrtutfnjOgvpz1nzUPsh09EBEvw-9HRGTADAje/s320/action+icon.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Next, paste this script into the script editor text area. For more hints on what objects and data you can use - see this popup for more help and information.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #eeeeee; border: 1px solid black; padding: 4px;&quot;&gt;
var openInPopup = true; //change this to open in new window&lt;br /&gt;
&lt;br /&gt;
//for popup&lt;br /&gt;
var mapsLink = &quot;https://www.google.ca/maps/place/{city}&quot;;&lt;br /&gt;
//for iframe&lt;br /&gt;
var mapsLinkEmbed = &quot;https://maps.google.com/maps?q={city}&amp;amp;output=embed&quot;;&lt;br /&gt;
//get the city column value, if doesn&#39;t exist - take the item&#39;s title.&lt;br /&gt;
var fieldValue = item.City &amp;amp;&amp;amp; item.City.text || item.Title;&lt;br /&gt;
&lt;br /&gt;
var buildCityPopup = function(city, src) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var popupCity = document.getElementById(&#39;kwCityPopup&#39;) || document.createElement(&#39;div&#39;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (popupCity.classList.length &amp;lt; 1) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;popupCity.classList.add(&quot;kw-Dialog&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;popupCity.classList.add(&quot;kw-Dialog--lgHeader&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.body.appendChild(popupCity);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var html = &#39;&amp;lt;div class=&quot;kw-Dialog-title&quot;&amp;gt;{city}&amp;lt;/div&amp;gt;&amp;lt;div class=&quot;kw-Dialog-content&quot; style=&quot;overflow:auto;max-height:500px;&quot;&amp;gt;  &amp;lt;div class=&quot;kw-Dialog-subText&quot;&amp;gt;&amp;lt;div style=&quot;text-align:center;width: 100%;border-bottom: 2px solid #ce4b1f;max-height:180px;&quot;&amp;gt;&amp;lt;iframe src=&quot;{src}&quot; width=&quot;300&quot; height=&quot;150&quot; frameborder=&quot;0&quot; style=&quot;border:0&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&quot;kw-Dialog-actions&quot;&amp;gt;&amp;lt;button class=&quot;kw-Button kw-Dialog-action&quot;&amp;gt;&amp;lt;span class=&quot;kw-Button-label&quot;&amp;gt;Close&amp;lt;/span&amp;gt;&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#39;.replace(&quot;{city}&quot;, encodeURIComponent(city))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.replace(&quot;{src}&quot;, src);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;popupCity.innerHTML = html;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new kwfabric[&#39;Dialog&#39;](popupCity).open();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
if (fieldValue &amp;amp;&amp;amp; fieldValue.length &amp;gt; 0) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mapsLink = mapsLink.replace(&quot;{city}&quot;, encodeURIComponent(fieldValue));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mapsLinkEmbed = mapsLinkEmbed.replace(&quot;{city}&quot;, encodeURIComponent(fieldValue));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;openInPopup ? buildCityPopup(fieldValue, mapsLinkEmbed) : window.open(mapsLink);&lt;br /&gt;
} else alert(&quot;Sorry, could not find a city column value. Please edit the action or add a column named &#39;City&#39;.&quot;);&lt;/div&gt;
&lt;br /&gt;
That&#39;s it. you are done. Close the popup and designer by clicking outside on the web part area.&lt;br /&gt;
Now you web part shows a map action icon:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf5UzjC3nHRui_ViG6JA2EolH2YwghZZRVQQNfrYrl9SJYfalWS_KP9XZ1BOTi7kKgM6Y5fvRTVefL6YyJrA0J_48XkBm16pWKND9JYdT0vyjGiLRk-KvjoFHbUspbGklO3VPV1EO0r5Zp/s1600/row+icons.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;177&quot; data-original-width=&quot;793&quot; height=&quot;71&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf5UzjC3nHRui_ViG6JA2EolH2YwghZZRVQQNfrYrl9SJYfalWS_KP9XZ1BOTi7kKgM6Y5fvRTVefL6YyJrA0J_48XkBm16pWKND9JYdT0vyjGiLRk-KvjoFHbUspbGklO3VPV1EO0r5Zp/s320/row+icons.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
When you click on it, you will get a popup with google maps of that location:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnMamFvMOoyRHhTu0iIer80-6Y_sZKSS9WUYilv424puFGKxOUQs2iBTMgL8juN52qCxLnuc9CA9q12p5pl3pkcKQR6jvZVam0VMFxhuBsV9PvUnaoLRYwFnkSkSgB0Dsvs83HAcknACpo/s1600/maps+popup.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;617&quot; data-original-width=&quot;748&quot; height=&quot;263&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnMamFvMOoyRHhTu0iIer80-6Y_sZKSS9WUYilv424puFGKxOUQs2iBTMgL8juN52qCxLnuc9CA9q12p5pl3pkcKQR6jvZVam0VMFxhuBsV9PvUnaoLRYwFnkSkSgB0Dsvs83HAcknACpo/s320/maps+popup.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Like it? Questions? Comments?&lt;br /&gt;
Feel free to write in the comments below.&lt;br /&gt;
Please note, for support or more advanced &quot;how do I?&quot; questions, I recommend as always to contact our support (at) kwizcom (dot) com&lt;br /&gt;
&lt;br /&gt;
Thanks, Shai.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2018/01/customizing-kwizcom-spfx-remote-list.html</link><author>noreply@blogger.com (Shai Petel)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjtc1taQe4dUoF7Z9-1L4oGuC6TEzkUPbExpM648MspG-sDihQ4UKIJaf7rAp5_mYe_YID46BLXHEUVBclaDjYI895uXI5Xp_Vk09WZcUbUxoaxViLQHWJRygpfulisRFn8Rx_9yUKQpFN/s72-c/list.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-269059523622656983</guid><pubDate>Fri, 15 Dec 2017 18:05:00 +0000</pubDate><atom:updated>2017-12-15T10:05:48.237-08:00</atom:updated><title>SPFx 1.4 brings automatic CDN deployment option!</title><description>Reading the latest release notes, it was a bit hard to find and to understand fully but here is what I got from it so far:&lt;br /&gt;
&lt;br /&gt;
Starting from SPFx 1.4, there will be a new setting in the package-solution.json file.&lt;br /&gt;
&lt;br /&gt;
&quot;&lt;span style=&quot;background-color: #f9f9f9; color: #222222; font-family: Consolas, Menlo, Monaco, &amp;quot;Lucida Console&amp;quot;, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Bitstream Vera Sans Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace, sans-serif; font-size: 12.8px;&quot;&gt;includeClientSideAssets&lt;/span&gt;&quot;&lt;br /&gt;
&lt;br /&gt;
Basically, when this feature is turned on, building a produciton package will no longer force you to specify the target CDN and manually host your files there.&lt;br /&gt;
&lt;br /&gt;
Instead, all of these assets will go into the .sppkg file, and when deployed into SharePoint, they will be automatically uploaded to a CDN-enabled library either in your app catalog or - if you enabled it - another pre-designated CDN location.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The benefits are obvious:&lt;br /&gt;
That means smaller dev teams or vendors don&#39;t have to worry about keeping a CDN up to host their files.&lt;br /&gt;
Also, you won&#39;t have to worry about uploading and managing these files yourself.&lt;br /&gt;
&lt;br /&gt;
The disadvantages for vendors like us are also clear:&lt;br /&gt;
We will have no control over the CDN, meaning - again - any minor change in code would have to result in a new package being built, published, sent to customers and installed before they will see any fixes applied.&lt;br /&gt;
&lt;br /&gt;
While that was how we did things for years in the full trust world, in the ever-changing fast pace apps/add-ins world I am not sure if that is a viable option anymore.&lt;br /&gt;
Changes are being rolled to SharePoint continuously. Admins no longer have control on when updates are being installed. And so - our frequently have to update our code to work with these changes and adapt to new features on a regular basis.&lt;br /&gt;
Having our own CDN allows us to do just that - push updates to our CDN on a fast ring and production releases and our customers could be happier.&lt;br /&gt;
&lt;br /&gt;
So, it is exciting to see this as an option, even though I probably won&#39;t be able to use it in the real world.&lt;br /&gt;
&lt;br /&gt;
What do you think?&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/12/spfx-14-brings-automatic-cdn-deployment.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-9079773810367444223</guid><pubDate>Tue, 12 Dec 2017 18:31:00 +0000</pubDate><atom:updated>2017-12-12T10:31:49.131-08:00</atom:updated><title>SharePoint REST API double encoding field internal names when using $expand=FieldValuesAsText</title><description>This is a simple bug I found when building one of our products while it was used by a French speaking customer...&lt;br /&gt;
&lt;br /&gt;
He simply created a column with a french name that had some special characters, for example: &quot;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Français&lt;/span&gt;&quot;&lt;br /&gt;
&lt;br /&gt;
So, the letter&amp;nbsp;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;ç was encoded when creating the column&#39;s internal name, which is what you&#39;d expect. The column&#39;s internal name was: &quot;&lt;/span&gt;Fran_x00e7_ais&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;When making REST requests to SharePoint to get items, query items, or anything you like - you would get the item field value under this internal name - gain, as you would expect.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;But!!!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;If you wanted to get the values as text and used the $expand=FieldValuesAsText in your query (or /FieldValuesAsText if getting a single item) - SharePoint returns something very different.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;The value for this column would be set in &quot;Fran_x005f_x00e7_x005f_ais&quot;, which is basically a double encoded version of the real internal name: &quot;&lt;/span&gt;Fran_x00e7_ais&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I couldn&#39;t find a solution for this problem besides hacking it, so now I hard coded updated my code to replace _x005f_ with _ when looking for field values as text...&lt;br /&gt;
&lt;br /&gt;
I&#39;ll report this issue but since changing it would potentially break so many existing applications I doubt it would be fixed any time soon.&lt;br /&gt;
&lt;br /&gt;
So for now - keep that in mind, and let me know if there is a better way to finding out the field name that this REST API uses!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/12/sharepoint-rest-api-double-encoding.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-764377519754167823</guid><pubDate>Mon, 30 Oct 2017 16:09:00 +0000</pubDate><atom:updated>2018-02-22T11:58:51.045-08:00</atom:updated><title>Changing SharePoint list item attachment to allow multiple files</title><description>I just got this email from a colleague saying he wants to upload multiple files as attachments to an item, and having to click add and confirm each and every one separately is quite annoying and time consuming.&lt;br /&gt;
&lt;br /&gt;
So I wrote a little script that changes this behavior of the OOB file upload to allow multiple files selection.&lt;br /&gt;
&lt;br /&gt;
Suprisingly, it works well with multiple files. there was only one part I had to fix, which was the label it shows before you save the item. It still shows the first file name only.&lt;br /&gt;
&lt;br /&gt;
Here is the JavaScript code you can use to enable it on your system today. Just add this script in your new/edit item forms and it should work:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #eeeeee; border: 1px solid black; padding: 4px;&quot;&gt;
ExecuteOrDelayUntilScriptLoaded &amp;amp;&amp;amp; ExecuteOrDelayUntilScriptLoaded(function(){&lt;br /&gt;
var oldShowPartAttachment = window.ShowPartAttachment;&lt;br /&gt;
var oldOkAttach = window.OkAttach;&lt;br /&gt;
window.OkAttach = function(){&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;var index = String(FileUploadIndex);&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;oldOkAttach();&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;var index2 = String(FileUploadIndex);&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;if(index2 === index)//it means OK fail.&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;return;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;var files = GetAttachElement(FileuploadString + index);&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;if(files &amp;amp;&amp;amp; files.files.length &amp;gt; 1)//more than one file&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;var text = &quot;&quot;;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;for(var i=0;i&amp;lt;files.files.length; i++) text+=&#39;, &#39;+ files.files[i].name;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;text = text.slice(2);&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;document.getElementById(&quot;attachRow&quot; + index).cells[0].innerHTML = text;&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
window.ShowPartAttachment = function(){&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;oldShowPartAttachment();&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;var index = String(FileUploadIndex);&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;var files = GetAttachElement(FileuploadString + index);&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;if(files)&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;files.multiple = true;&lt;br /&gt;
}}, &quot;form.js&quot;);
&lt;/div&gt;
&lt;br /&gt;
Also, we will be adding this little script to a future release of our forms solution, so stay tuned for the update.&lt;br /&gt;
&lt;br /&gt;
Let me know if you like it!&lt;br /&gt;
&lt;br /&gt;
Edit: correction in the script, the if statement was missing the {}&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/10/changing-sharepoint-list-item.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-1736207307593418893</guid><pubDate>Mon, 16 Oct 2017 14:57:00 +0000</pubDate><atom:updated>2017-10-16T07:57:50.526-07:00</atom:updated><title>SharePoint Online Search not returning all results part 2</title><description>Continuing the investigation into&amp;nbsp;&lt;a href=&quot;https://kwizcom.blogspot.ca/2017/10/sharepoint-online-search-not-returning.html&quot; target=&quot;_blank&quot;&gt;SharePoint Online Search not returning all results&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
We found that SharePoint search API has the &quot;remove duplicates&quot; flag turned on by default.&lt;br /&gt;
&lt;br /&gt;
At first we didn&#39;t pay much attention to it, since the results we were missing were not duplicates...&lt;br /&gt;
&lt;br /&gt;
However, after digging some more into it, it seems SharePoint Search was not only removing identical duplicates (meaning, the same item returned twice) but also &lt;b&gt;similar&lt;/b&gt;&amp;nbsp;duplicates - meaning items it deems are too similar to one another.&lt;br /&gt;
&lt;br /&gt;
It is on by default, so you should turn it off on every request. It seems to have helped with our issues, we haven&#39;t been able to replicate this issue since we turned that off.&lt;br /&gt;
&lt;br /&gt;
In query string, add:&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: segoe-ui_normal, &amp;quot;Segoe UI&amp;quot;, Segoe, &amp;quot;Segoe WP&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, sans-serif; font-size: 16px;&quot;&gt;?trimduplicates=false&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: segoe-ui_normal, &amp;quot;Segoe UI&amp;quot;, Segoe, &amp;quot;Segoe WP&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, sans-serif; font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: segoe-ui_normal, &amp;quot;Segoe UI&amp;quot;, Segoe, &amp;quot;Segoe WP&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, sans-serif; font-size: 16px;&quot;&gt;In post, add:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #f9f9f9; color: #222222; font-family: Consolas, Menlo, Monaco, &amp;quot;Lucida Console&amp;quot;, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Bitstream Vera Sans Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace, sans-serif; font-size: 14px; white-space: pre;&quot;&gt;{
&#39;__metadata&#39;:{&#39;type&#39;:&#39;Microsoft.Office.Server.Search.REST.SearchRequest&#39;},
&#39;Querytext&#39;:&#39;sharepoint&#39;,
&#39;TrimDuplicates&#39;=&#39;False&#39;
}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://bit.ly/2ys3EeH&quot; target=&quot;_blank&quot;&gt;Read more&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The strange thing about it was - why did &quot;Reindex List&quot; button help in some cases? Perhaps there were two issues, we can not be sure.&lt;br /&gt;
&lt;br /&gt;
Hope this helps!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/10/sharepoint-online-search-not-returning_16.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-5636635196340396701</guid><pubDate>Mon, 16 Oct 2017 14:51:00 +0000</pubDate><atom:updated>2017-12-18T11:18:31.625-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SPFx</category><title>Removing the hash from the SPFx bundle file name</title><description>Just a quick follow up on this topic&amp;nbsp;&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/08/controlling-spfx-bundle-file-name-in.html&quot; target=&quot;_blank&quot;&gt;Controlling SPFx bundle file name in production builds&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
It seems the latest drop of SPFx added a new setting that allows you to bypass the hash mechanism and prevent it from being added to your bundle file names.&lt;br /&gt;
&lt;br /&gt;
I have yet to confirm this, but it seems you can add this code to you gulpfile.js:&lt;br /&gt;
&lt;span style=&quot;background-color: rgba(27 , 31 , 35 , 0.05); color: #24292e; font-family: , &amp;quot;consolas&amp;quot; , &amp;quot;liberation mono&amp;quot; , &amp;quot;menlo&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: 11.9px;&quot;&gt;build.copyAssets.taskConfig = { excludeHashFromFileNames: true, }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
And this will stop adding the hash to the file names.&lt;br /&gt;
&lt;br /&gt;
Posted:&amp;nbsp;https://github.com/SharePoint/sp-dev-fx-webparts/issues/246#issuecomment-335946172&lt;br /&gt;
By:&amp;nbsp;Franck Cornu&lt;br /&gt;
(Thanks!)&lt;br /&gt;
&lt;br /&gt;
I will give it a try and update here if it works. See my other blog post on how to edit the file name and add the version number automatically as well.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Edit: I just verified this is working as of 1.4.0&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/10/removing-hash-from-spfx-bundle-file-name.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-6128498441619610811</guid><pubDate>Tue, 10 Oct 2017 21:56:00 +0000</pubDate><atom:updated>2017-10-10T14:56:00.737-07:00</atom:updated><title>My Interview with Collab365</title><description>Just in case you are interested, here is my interview with Collab365.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://collab365.community/dotlight-visit-shai-petel-kwizcom-lego/&quot; target=&quot;_blank&quot;&gt;https://collab365.community/dotlight-visit-shai-petel-kwizcom-lego/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The event will go live in 21 days, join my session on SPFx development or check out the recording after (link to be posted after the event so stay tuned)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/10/my-interview-with-collab365.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-4035545766563053019</guid><pubDate>Tue, 10 Oct 2017 19:22:00 +0000</pubDate><atom:updated>2017-10-10T12:22:21.726-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">REST</category><category domain="http://www.blogger.com/atom/ns#">Search</category><category domain="http://www.blogger.com/atom/ns#">SharePoint</category><title>SharePoint Online Search not returning all results</title><description>When building the data source for our &lt;a href=&quot;http://www.kwizcom.com/sharepoint-apps/list-aggregator/overview/&quot; target=&quot;_blank&quot;&gt;SPFx list aggregator web part&lt;/a&gt;, we noticed that in some cases when we make a request to the SharePoint Online Rest Search API, some lists or content were not returned by the search.&lt;br /&gt;
&lt;br /&gt;
I cannot confirm exactly what happens or why, but in some cases lists that had their title changed were not picked up by the search service days and weeks after the change.&lt;br /&gt;
In other cases, lists that were created a few months ago were not returned at all unless specifically mentioning their list name in the query.&lt;br /&gt;
&lt;br /&gt;
After investigating this for a long time, we could not identify a specific common cause for all these lists that would cause this to happen. We did however find many people experiencing the same issue with the SharePoint Online search.&lt;br /&gt;
&lt;br /&gt;
One workaround we found that would fix the issue within reasonable time (usually within a few minutes up to a couple of hours) was simply to visit those lists, go to the list settings and under advanced settings to click the &quot;Reindex List&quot; button.&lt;br /&gt;
&lt;br /&gt;
This seem to fix the issue, which makes me thing that the problem is with the incremental search crawl logic not picking up all changes properly.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikymt3t5gSil2Z43-0PoCLcsUF_f0T_C-JhA1YJM0fPVolsEtInxItfrV1n9PF0rMnIoMK-VwIWBXsVlFUIU47x2jgf35sVP-Nzn5SLXXGw9rMM7dsgsiDStdrfHmvrKwnOyHo8ekIoz98/s1600/reindex+list.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;366&quot; data-original-width=&quot;579&quot; height=&quot;202&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikymt3t5gSil2Z43-0PoCLcsUF_f0T_C-JhA1YJM0fPVolsEtInxItfrV1n9PF0rMnIoMK-VwIWBXsVlFUIU47x2jgf35sVP-Nzn5SLXXGw9rMM7dsgsiDStdrfHmvrKwnOyHo8ekIoz98/s320/reindex+list.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Hope that helps you guys.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/10/sharepoint-online-search-not-returning.html</link><author>noreply@blogger.com (Shai Petel)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikymt3t5gSil2Z43-0PoCLcsUF_f0T_C-JhA1YJM0fPVolsEtInxItfrV1n9PF0rMnIoMK-VwIWBXsVlFUIU47x2jgf35sVP-Nzn5SLXXGw9rMM7dsgsiDStdrfHmvrKwnOyHo8ekIoz98/s72-c/reindex+list.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-3685990865063390236</guid><pubDate>Fri, 15 Sep 2017 15:38:00 +0000</pubDate><atom:updated>2017-09-15T08:38:10.562-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SPFx</category><title>Versioning strategy for SPFx</title><description>&lt;h2&gt;
Background&lt;/h2&gt;
&lt;br /&gt;
As an ISV, one of the most important aspects of our products is - you guesed it - product versioning.&lt;br /&gt;
&lt;br /&gt;
Versioning is important for a lot of things:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;It tells users if they are running the latest bits of their software&lt;/li&gt;
&lt;li&gt;It helps support reproduce issues and report them more accurately&lt;/li&gt;
&lt;li&gt;It helps developers track bugs and issues, when they occur and when they were fixed&lt;/li&gt;
&lt;li&gt;It tells the product manager how the product is moving along its roadmap&lt;/li&gt;
&lt;/ul&gt;
... and more!&lt;br /&gt;
&lt;br /&gt;
One thing I am not a big fan of is how SPFx handles product releases and versions.&lt;br /&gt;
&lt;br /&gt;
See, as an ISV in the cloud-world, we find it important from time to time to push updates to our apps to all our customers at once, without having to ask them to download and install a new version of the application.&lt;br /&gt;
&lt;br /&gt;
We do that by updating the resources in our CDN, expiring our cache and that makes sure all clients get the latest and greatest builds automatically.&lt;br /&gt;
&lt;br /&gt;
Imagine you have a spelling mistake, typo, or that an update is rolling out that causes a critical failure of your product. In these situations, we usually push updates from our servers to all our customers, and they don&#39;t have to worry about updating anything themselves.&lt;br /&gt;
&lt;br /&gt;
(Remember the days you had to go to the app store on your phone and hit &quot;update&quot; on every app? Yuck!)&lt;br /&gt;
&lt;br /&gt;
So, for that reason, I find the way SPFx produces builds a bit lacking.&lt;br /&gt;
See, whenever you are ready to release a build, you type gulp --ship to build your scripts in release mode.&lt;br /&gt;
That produces a bundled JS file that contains a hash in the file name.&lt;br /&gt;
Meaning - every little change you do will produce a different hash code.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;
&lt;br /&gt;
&lt;div&gt;
data-view-plus.bundle_d&lt;span style=&quot;color: #b5cea8;&quot;&gt;41&lt;/span&gt;aab&lt;span style=&quot;color: #b5cea8;&quot;&gt;51&lt;/span&gt;ecdd&lt;span style=&quot;color: #b5cea8;&quot;&gt;17&lt;/span&gt;f&lt;span style=&quot;color: #b5cea8;&quot;&gt;15&lt;/span&gt;f&lt;span style=&quot;color: #b5cea8;&quot;&gt;7&lt;/span&gt;f&lt;span style=&quot;color: #b5cea8;&quot;&gt;921&lt;/span&gt;d&lt;span style=&quot;color: #b5cea8;&quot;&gt;87534405&lt;/span&gt;.js&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
Now, the manifest points to that specific file with that specific hash, and requires you to produce a new app package, and install that new package on your app catalog.&lt;br /&gt;
&lt;br /&gt;
Although the bundle JS file is most likely hosted in your CDN, each new version you release points to a new different file, so no one gets updates automatically.&lt;br /&gt;
&lt;br /&gt;
Moreover, you have no way of controlling when your clients upgrade, so you can never remove older files from your CDN, making it a complete mess and nightmare to maintain in an ever-growing pile of files, most of which no one will ever use.&lt;br /&gt;
&lt;br /&gt;
This is why we chose to go a different route when releasing our SPFx versions.&lt;br /&gt;
&lt;br /&gt;
Instead of using the hash - we use a package version in the JS file name.&lt;br /&gt;
As long as we make small changes that we want to push automatically, we keep the same file name and push the changes to our CDN.&lt;br /&gt;
We track the build number using a JS variable inside our code to be able to keep track on what build is the current client running, since we do not change the package version on every release.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;
&lt;br /&gt;
&lt;div&gt;
data-view-plus.&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;.&lt;span style=&quot;color: #b5cea8;&quot;&gt;0.5&lt;/span&gt;.js&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
Every time we have a bigger change, that changes our package manifest (added a web part, added or changed a dependency library) - that requires a new app package to be released. So only on these circumstances we advance the package version (config\package-solution.json) and release a new package with a new bundle file name to match it.&lt;br /&gt;
&lt;br /&gt;
This significantly reduces the amount of script files we have in our CDN, makes each file very easy to understand which build it belongs to (instead of those hash codes) and allows us to push minor updates without requiring our users to install a new package in their catalog.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
So, how do we do it?&lt;/h2&gt;
&lt;div&gt;
I&#39;m afraid we have yet to automate this part... but the steps are not too complicated to follow, I promise.&lt;/div&gt;
&lt;div&gt;
From this point I assume you have your SPFx project all ready and set up, configured with a CDN of your choice.&lt;/div&gt;
&lt;h3&gt;
Releasing a new package version&lt;/h3&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Change the version in your config\package-solution.json file&lt;/li&gt;
&lt;li&gt;Advance your &quot;BuildNumber&quot; variable in your code (optional)&lt;/li&gt;
&lt;li&gt;Run &#39;gulp --ship&#39;&lt;/li&gt;
&lt;li&gt;Visit the new files outputted to temp\deploy&lt;/li&gt;
&lt;li&gt;Edit the bundle JS file name, replace the hash with the version you put in step 1&lt;/li&gt;
&lt;li&gt;Edit the [guid].json file, it should have the bundle JS file name in it - replace with with the new file name you came up with in step 5&lt;/li&gt;
&lt;li&gt;Save all changes&lt;/li&gt;
&lt;li&gt;Run &#39;gulp package-solution --ship&#39;&lt;/li&gt;
&lt;li&gt;Now, you package will be ready for you under SharePoint/Solution and it will use the file name you set in step 5&lt;/li&gt;
&lt;li&gt;Don&#39;t forget to copy your bundle JS file to your CDN, do not remove older versions from the CDN if you have them.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;h3&gt;
Releasing patches or minor updates&lt;/h3&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Advance your &quot;BuildNumber&quot; variable in your code (optional)&lt;/li&gt;
&lt;li&gt;Run &#39;gulp --ship&#39;&lt;/li&gt;
&lt;li&gt;Copy the content of the bundle JS file from either temp\deploy or from the dist folder into the CDN, overwrite the content of the latest version file you got there&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Hint: how can you tell if your change requires a new package or not? Simple. Add the web part to a SharePoint page (classic or modern) - not the workbench. It will use the old web part definition. If it runs - it means your changes did not break the signature of the bundle. If you get a nasty error message, time to release a new version.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Do you manage versions in SPFx? Do it differently? I would love to hear, please leave a comment!&lt;/div&gt;
&lt;div&gt;
Also, know how to automate my process? Please share!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Thanks for reading,&lt;/div&gt;
&lt;div&gt;
Shai.&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/06/versioning-strategy-for-spfx.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-1931684647060079587</guid><pubDate>Fri, 15 Sep 2017 15:37:00 +0000</pubDate><atom:updated>2017-09-15T08:37:56.708-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SPFx</category><title>Updating SPFx package still showing the older web part</title><description>Something I noticed while working with SPFx,&lt;br /&gt;
some times I would release a new package to my app catalog by dragging it over an existing older version.&lt;br /&gt;
&lt;br /&gt;
SharePoint would prompt me to overwrite, I would say yes.&lt;br /&gt;
&lt;br /&gt;
Now, every page refresh I would randomly get the older file loaded or the latest one loaded. It was completely unpredictable and didn&#39;t seem to depend on anything specific I did.&lt;br /&gt;
&lt;br /&gt;
What happens?&lt;br /&gt;
&lt;br /&gt;
It seems when you overwrite a package, you don&#39;t get the dialog to trust the package. Now, that dialog is important, since while you visit it, it plants a cookie in your browser that marks for SharePoint to drop its package cache and reload the manifest.&lt;br /&gt;
If that cookie is missing... you would be getting a cached version of the manifest.&lt;br /&gt;
Since SharePoint Online is a beast with many WFE servers in load balanced setup, you sometimes get a server that cleared its cache (maybe the one that handled the replace action) and other times a server that still has the older one cached.&lt;br /&gt;
&lt;br /&gt;
This situation is not a big deal in production, since in 20 minutes or so the cache clears itself.&lt;br /&gt;
&lt;br /&gt;
But for dev - here is what you have to do to avoid it:&lt;br /&gt;
Simply delete the package before you upload a new one, and don&#39;t use the overwrite option.&lt;br /&gt;
&lt;br /&gt;
Simple, efficient but very confusing...&lt;br /&gt;
&lt;br /&gt;
Hope this helps!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/06/updating-spfx-package-still-showing.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-7524974359052038780</guid><pubDate>Fri, 08 Sep 2017 00:50:00 +0000</pubDate><atom:updated>2017-09-15T08:36:17.008-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Office UI Fabric</category><title>Office UI Fabric JS multi select support</title><description>Following up on my earlier post, where I shared our own version of Office Fabric JS that resolved a few major issues with versioning, isolation, and custom-prefix.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;As promised we will continue to deliver enhancements and bug fixes to our hosted version of Office Fabric JS library.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;In the near future, we hope to launch this as an official fork with open source in GitHub, but for now we still host it and you are welcome to use it.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;A reminder, &lt;a href=&quot;http://kwizcom.blogspot.ca/2017/03/using-office-ui-fabric-js-in-spfx.html&quot;&gt;here is the original post&lt;/a&gt; explaining how to use our version.

&lt;br /&gt;
&lt;br /&gt;
So, to the matter at hand.&lt;br /&gt;
&lt;br /&gt;
Today, I am happy to announce we have released a new build that added a much needed feature to the office UI fabric JS library: support for multi-select.&lt;br /&gt;
&lt;br /&gt;
As a design decision, Microsoft decided they will not support multi select control for usability reasons, fearing it won&#39;t be compatible with touch devices.&lt;br /&gt;
&lt;br /&gt;
While you may or may not agree with their decision, there are times where using a multi select control will make sense, either as a requirement from your customer, your users or just what makes more sense for you in that particular situation.&lt;br /&gt;
&lt;br /&gt;
(&lt;a href=&quot;https://github.com/OfficeDev/office-ui-fabric-core/issues/221&quot;&gt;GitHub Discussion here&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
So far, select controls that were enhanced with office UI fabric JS would just render as a regular single select.&lt;br /&gt;
&lt;br /&gt;
Today we released an update to the library, once you set your select control to allow multiple selection, enhancing it with Office UI Fabric JS will now render a multiple selection control.&lt;br /&gt;
&lt;br /&gt;
The main differences are:&lt;br /&gt;
1. After selecting a value, the drop down will remain open allowing you to select another one.&lt;br /&gt;
2. Clicking on a selected item will remove it from the selection.&lt;br /&gt;
3. The text box will now show all selected values separated by ,&lt;br /&gt;
&lt;br /&gt;
Here it is opened:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNTmmxtsKpaX08HhhIoMkn9xRPdYbv-0Sq7yKSqCmg3mP6aqnEhSzv9Ix-tFiTIuP6EJvOD3aZwte5bPKA5R7ZYhGS_AFSpCBGL1KieRWM1vdC2_7bVP9ZliIhAkd0nHgNbDx-Ro1uAF_c/s1600/multi-open.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;163&quot; data-original-width=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNTmmxtsKpaX08HhhIoMkn9xRPdYbv-0Sq7yKSqCmg3mP6aqnEhSzv9Ix-tFiTIuP6EJvOD3aZwte5bPKA5R7ZYhGS_AFSpCBGL1KieRWM1vdC2_7bVP9ZliIhAkd0nHgNbDx-Ro1uAF_c/s1600/multi-open.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span id=&quot;goog_566383405&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_566383406&quot;&gt;&lt;/span&gt;And closed:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQnzkbqqfDdK5H_XxOYCtkEhf8ksjX7bcqqGZH9PK9XQBoN4PgsHJDJCpIdsIjH1NlNgHcpqdR97D477OAC4EW_bl3LSiFNQOE8mceje2CrJf4_4NTZteSl2qz2tbdOeYotKheTZQwczsM/s1600/multi-closed.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;48&quot; data-original-width=&quot;215&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQnzkbqqfDdK5H_XxOYCtkEhf8ksjX7bcqqGZH9PK9XQBoN4PgsHJDJCpIdsIjH1NlNgHcpqdR97D477OAC4EW_bl3LSiFNQOE8mceje2CrJf4_4NTZteSl2qz2tbdOeYotKheTZQwczsM/s1600/multi-closed.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Here is the working JSFiddle:&lt;br /&gt;
&lt;script async=&quot;&quot; src=&quot;//jsfiddle.net/SPetel/u2bttp3e/2/embed/js,html,result/&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/09/office-ui-fabric-js-multi-select-support.html</link><author>noreply@blogger.com (Shai Petel)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNTmmxtsKpaX08HhhIoMkn9xRPdYbv-0Sq7yKSqCmg3mP6aqnEhSzv9Ix-tFiTIuP6EJvOD3aZwte5bPKA5R7ZYhGS_AFSpCBGL1KieRWM1vdC2_7bVP9ZliIhAkd0nHgNbDx-Ro1uAF_c/s72-c/multi-open.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-410338064731205389</guid><pubDate>Thu, 31 Aug 2017 19:52:00 +0000</pubDate><atom:updated>2017-09-15T08:35:53.674-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SPFx</category><title>Controlling SPFx bundle file name in production builds</title><description>As promised, sharing the code as discussed in my &lt;a href=&quot;http://kwizcom.blogspot.ca/2017/08/spfx-isv-insight-to-microsofts-latest.html&quot;&gt;SPFx advanced development session&lt;/a&gt;&amp;nbsp;, in &lt;a href=&quot;http://kwizcom.blogspot.ca/2017/06/versioning-strategy-for-spfx.html&quot;&gt;this blog post&lt;/a&gt;&amp;nbsp;and in &lt;a href=&quot;https://github.com/SharePoint/sp-dev-fx-webparts/issues/246#issuecomment-326397458&quot;&gt;this GitHub discussion&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As you might know already, when building an SPFx component in production (gulp --ship) you could not control the produced file name of your bundle JS file.&lt;br /&gt;
&lt;br /&gt;
The file would be generated as:&lt;br /&gt;
{product}.bundle-{hash}.js&lt;br /&gt;
&lt;br /&gt;
That caused a lot of grief for our caching mechanism and our version management and product release strategy, preventing us from taking control over our cache strategy, using other java script optimization tools (due to the bundle file name) and publishing minor fixes without requiring our clients to install a new package.&lt;br /&gt;
&lt;br /&gt;
It seems currently there is no supported way to control that, and that the production file name is being set hard coded in the copyAssetsTask.&lt;br /&gt;
&lt;br /&gt;
After a lot of trials, I finally managed to find a way to control it, but it involves hacking into the build process in a way that I am pretty sure will not be future-upgrade proof.&lt;br /&gt;
&lt;br /&gt;
So, until such time as the good people at Microsoft exposes this to us in a supported way, here is what you can do today.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Remove the hash from SPFx bundle file name&lt;/h2&gt;
1. Load package-solution.json so that you can get the version number from it:&lt;br /&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;
&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;packageJson&lt;/span&gt; = &lt;span style=&quot;color: #dcdcaa;&quot;&gt;require&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;&#39;./config/package-solution.json&#39;&lt;/span&gt;);&lt;/div&gt;
&lt;br /&gt;
2. Add this code in your gulp file, just before build.initialize(gulp);&lt;br /&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;
&lt;div&gt;
&lt;span style=&quot;color: #569cd6;&quot;&gt;var&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;original_renameWithHash&lt;/span&gt; = &lt;span style=&quot;color: #9cdcfe;&quot;&gt;build&lt;/span&gt;.&lt;span style=&quot;color: #9cdcfe;&quot;&gt;copyAssets&lt;/span&gt;.&lt;span style=&quot;color: #9cdcfe;&quot;&gt;_renameWithHash&lt;/span&gt;.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;bind&lt;/span&gt;(&lt;span style=&quot;color: #9cdcfe;&quot;&gt;build&lt;/span&gt;.&lt;span style=&quot;color: #9cdcfe;&quot;&gt;copyAssets&lt;/span&gt;);&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #9cdcfe;&quot;&gt;build&lt;/span&gt;.&lt;span style=&quot;color: #9cdcfe;&quot;&gt;copyAssets&lt;/span&gt;.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;_renameWithHash&lt;/span&gt; = &lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; (&lt;span style=&quot;color: #9cdcfe;&quot;&gt;gulpStream&lt;/span&gt;, &lt;span style=&quot;color: #9cdcfe;&quot;&gt;getFilename&lt;/span&gt;, &lt;span style=&quot;color: #9cdcfe;&quot;&gt;filenameCallback&lt;/span&gt;) {&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #569cd6;&quot;&gt;var&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;original_GetFileName&lt;/span&gt; = &lt;span style=&quot;color: #9cdcfe;&quot;&gt;getFilename&lt;/span&gt;;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #dcdcaa;&quot;&gt;getFilename&lt;/span&gt; = &lt;span style=&quot;color: #569cd6;&quot;&gt;function&lt;/span&gt; (&lt;span style=&quot;color: #9cdcfe;&quot;&gt;hash&lt;/span&gt;) { &lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;original_GetFileName&lt;/span&gt;(&lt;span style=&quot;color: #9cdcfe;&quot;&gt;hash&lt;/span&gt;)&lt;/div&gt;
&lt;div&gt;
.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;replace&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;&#39;_&#39;&lt;/span&gt; + &lt;span style=&quot;color: #9cdcfe;&quot;&gt;hash&lt;/span&gt;, &lt;span style=&quot;color: #ce9178;&quot;&gt;&#39;.&#39;&lt;/span&gt; + &lt;span style=&quot;color: #9cdcfe;&quot;&gt;packageJson&lt;/span&gt;.&lt;span style=&quot;color: #9cdcfe;&quot;&gt;solution&lt;/span&gt;.&lt;span style=&quot;color: #9cdcfe;&quot;&gt;version&lt;/span&gt;); };&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;original_renameWithHash&lt;/span&gt;(&lt;span style=&quot;color: #9cdcfe;&quot;&gt;gulpStream&lt;/span&gt;, &lt;span style=&quot;color: #9cdcfe;&quot;&gt;getFilename&lt;/span&gt;, &lt;span style=&quot;color: #9cdcfe;&quot;&gt;filenameCallback&lt;/span&gt;);&lt;/div&gt;
&lt;div&gt;
};&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Remove the .bundle from SPFx bundle file name&lt;/h2&gt;
&lt;div&gt;
This one, was suprisingly simple to do.&lt;/div&gt;
&lt;div&gt;
Thanks to&amp;nbsp;@&lt;a href=&quot;https://github.com/iclanton&quot;&gt;iclanton&lt;/a&gt;&amp;nbsp;pointing out, all you need to do is edit the config/config.json file, and change the outputPath property.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Adding a post build task&lt;/h2&gt;
&lt;div&gt;
As a part of my trial an errors, I tried adding a post build task. It didn&#39;t help in this case since it runs before the bundle process begins but here is how you do it just in case you might need to:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;
&lt;div&gt;
&lt;span style=&quot;color: #608b4e;&quot;&gt;//Add post build task. This still runs before bundle task&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;renameFilesProductionTask&lt;/span&gt; = &lt;span style=&quot;color: #9cdcfe;&quot;&gt;build&lt;/span&gt;.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;subTask&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&#39;rename-files-production&#39;&lt;/span&gt;,&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #569cd6;&quot;&gt;  function&lt;/span&gt;(&lt;span style=&quot;color: #9cdcfe;&quot;&gt;gulp&lt;/span&gt;, &lt;span style=&quot;color: #9cdcfe;&quot;&gt;buildOptions&lt;/span&gt;, &lt;span style=&quot;color: #9cdcfe;&quot;&gt;done&lt;/span&gt;) {&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #569cd6;&quot;&gt;var&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;production&lt;/span&gt; = (&lt;span style=&quot;color: #9cdcfe;&quot;&gt;process&lt;/span&gt;.&lt;span style=&quot;color: #9cdcfe;&quot;&gt;argv&lt;/span&gt;.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;indexOf&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;&#39;--ship&#39;&lt;/span&gt;) !== -&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;);&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color: #9cdcfe;&quot;&gt;production&lt;/span&gt;)&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #569cd6;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;log&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;&#39;Built in production!&#39;&lt;/span&gt;);&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #dcdcaa;&quot;&gt;done&lt;/span&gt;();&lt;/div&gt;
&lt;div&gt;
});&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #9cdcfe;&quot;&gt;build&lt;/span&gt;.&lt;span style=&quot;color: #9cdcfe;&quot;&gt;rig&lt;/span&gt;.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;addPostBuildTask&lt;/span&gt;(&lt;span style=&quot;color: #9cdcfe;&quot;&gt;renameFilesProductionTask&lt;/span&gt;);&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I hope this helps. I will update this post once I learn if there is a better way to achieve this.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Thanks.&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/08/controlling-spfx-bundle-file-name-in.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-8700480312412660526</guid><pubDate>Thu, 24 Aug 2017 17:58:00 +0000</pubDate><atom:updated>2017-08-24T10:58:22.107-07:00</atom:updated><title>Setting up automatic deployment to azure web app</title><description>This is something we have been working on for a long time, far too long. There are so many samples and options out there it was very difficult for us to set up, and now that we finally have our environment up and running I thought I&#39;d share our experience.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Our set up&lt;/h2&gt;
&lt;div&gt;
First, let me describe our current set up.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
See, with SharePoint hosted add-ins, Provider hosted add-ins, click once applications and other services (like licensing, captcha, etc) - we had to set up a web app on azure.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That web app serves as a CDN for our JS/CSS/HTML/Images and a few asp.net apps, and we had to set it up to be globally available, so using a traffic manager we have a few servers around the world handling local traffic.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now, we set up one extra server for what we call a &quot;fast ring&quot; release cycle.&lt;/div&gt;
&lt;div&gt;
That&#39;s where we publish our beta versions for testing, and after a short cooling period we push them to the production servers.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, basically each app we release requires us to publish to 1 fast ring server, and later to a few production servers in what you can imagine is a very time consuming and error prone publishing process.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Also, every server we added to the mix required the developer to publish to that server as well.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So automating this was a high priority for us from the beginning.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Automation options&lt;/h2&gt;
&lt;div&gt;
I&#39;ve continuously discussed and read about azure automated deployments, and was very happy to see there were a lot of options to publish to azure but neither answered all of our needs.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Synced library (DropBox, OneDrive, etc)&lt;/h3&gt;
&lt;div&gt;
This option was by far the easiest to set up. You basically register one of these services to be the source of your web app.&lt;/div&gt;
&lt;div&gt;
Surprisingly, no OneDrive for business support - only personal OneDrive. Actually, this is more than a surprise, it is flat out ridiculous since the target audience here is clearly a business user with a very high likelihood to be a O365 subscriber!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But that wasn&#39;t what threw me off.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You would get a sub folder in your service, and map it to a server.&lt;/div&gt;
&lt;div&gt;
So, I could build a &quot;production&quot; folder and &quot;fast ring&quot; folder and map them to their servers. Easy enough.&lt;/div&gt;
&lt;div&gt;
Then, I would have to sync that client to my dev machine, and &quot;publish&quot; my web apps into that local folder.&lt;/div&gt;
&lt;div&gt;
That would in turn sync the changes into the cloud, and at that point it gets tricky.&lt;/div&gt;
&lt;div&gt;
There isn&#39;t a way for azure to detect changes and start the update automatically.&lt;/div&gt;
&lt;div&gt;
You would have to visit each and every web app and click the &quot;sync&quot; button to have them sync their content with the storage service.&lt;/div&gt;
&lt;div&gt;
I&#39;m sure I could write a script or some code that would automate this, but I was trying to avoid writing any code for something like this - so moving on.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Azure continuous deployment from visual studio online&lt;/h3&gt;
&lt;div&gt;
In azure, under the web app there is a way to set up a connection to a project in Visual Studio online.&lt;/div&gt;
&lt;div&gt;
Since all our source code is stored in visual studio online anyways in Git repositories - I really had my hopes up.&lt;/div&gt;
&lt;div&gt;
Setting this up was just impossible.&lt;/div&gt;
&lt;div&gt;
Since we have an MSDN azure subscription where all our services are set up, and our O365 tenant is on a different subscription, our visual studio online was associated with our O365 tenant so that we can use those logins.&lt;/div&gt;
&lt;div&gt;
It seems it made it impossible to associate that visual studio online account with our azure MSDN subscription, so I tried and tried and it seemed to be impossible so I gave up.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Visual studio online &quot;Build &amp;amp; Release&quot;&lt;/h3&gt;
&lt;div&gt;
Finally, I went to visual studio online and noticed there is a way to configure it to build your project on their servers and set it up to publish and release to many remote services, including azure.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I honestly struggled with setting up the build on the server. I got it to work on some projects, others threw errors and I was about to give up. I&#39;m sure its possible and I will definitely work on it again until I get it working like I want it, but even though - getting it to publish a click once project for example would be complex, using our code signing tools and many of our pre/post build custom events and so on - it might be too complex to do.&lt;/div&gt;
&lt;div&gt;
But, I came up with a simpler way of doing it.&lt;/div&gt;
&lt;div&gt;
We would build our projects locally, and publish them locally.&lt;/div&gt;
&lt;div&gt;
Web applications - as a deployment package file. this produced a zip file, that we would check in the source control.&lt;/div&gt;
&lt;div&gt;
Next we can publish that zip file package to azure, and set up a trigger for the publish task on that zip file so that it would run automatically whenever the zip file changed.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
For click once - we basically check in the &quot;publish&quot; folder, and did the same thing - put a trigger on it, and set up a task to publish that entire folder every time it changes.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This allows us to still build and publish using our dev machines, and have visual studio online job only handle publishing the content to the web servers in azure.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Next, we decided our &quot;master&quot; branch would be our production. Created a &quot;fast ring&quot; branch that would be published to the fast ring and we were done.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That was by far the easiest to set up (connecting to azure subscription took 2-3 minutes, but at least it worked), and was automatically triggering whenever we pushed a new version.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The only downside is, that I couldn&#39;t set it up to build the package on the server, but like I said - still working on it.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, if you are working in visual studio online, obviously I would recommend this approach. But if you are not - you should check it out anyways, since the build &amp;amp; release tasks there support getting your source code from many sources (GitHub, Remote Git repo, Subversion) has a ton of build and publish tasks you can add and supports publishing to many services (not just Azure).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Also cool - is that I now get an email saying if a publish went through OK or failed. So I do have some monitoring on whats going on moving forward, which is great.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Definitely the easiest one to set up, and I wish we had done this a year ago.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If you have experience with something like that, please share your thoughts in the comments below, also questions are always welcome.&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/08/setting-up-automatic-deployment-to.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-5388417788354893759</guid><pubDate>Tue, 01 Aug 2017 13:30:00 +0000</pubDate><atom:updated>2018-04-11T12:19:19.390-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">presentation</category><category domain="http://www.blogger.com/atom/ns#">SPFx</category><title>SPFx: An ISV Insight to Microsoft&#39;s latest customization model</title><description>As promised, here is my blog post about this session from&amp;nbsp;@spsnyc&lt;br /&gt;
&lt;br /&gt;
Thanks for all the great reviews, the comment I got the most was that it had too much great info.&lt;br /&gt;
&lt;br /&gt;
My greatest challenge writing this session was focusing on a few advanced topics that were not widely covered by other SPFx sessions.&lt;br /&gt;
&lt;br /&gt;
There is an influx of SPFx sessions on every conference these days, and I find the majority of them (maybe rightly so) focus on beginner level introduction to SPFx.&lt;br /&gt;
&lt;br /&gt;
What I wanted to do with this session is something different.&lt;br /&gt;
&lt;br /&gt;
Focus on a few important more advanced topics that were not widely covered by other speakers.&lt;br /&gt;
&lt;br /&gt;
This led me to build this level 300-400 session that focuses on these key points:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Publishing versions&lt;/li&gt;
&lt;li&gt;Pushing updates through CDN&lt;/li&gt;
&lt;li&gt;Sharing code between projects&lt;/li&gt;
&lt;li&gt;Building a custom PropertyPane property&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
I cover these points in a deeper level, and accompany them with complete source code example of my solution.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Here is the slide show:&lt;/h2&gt;
&lt;div&gt;
&lt;iframe frameborder=&quot;0&quot; height=&quot;481px&quot; src=&quot;https://onedrive.live.com/embed?cid=9AA0207FBB7C160D&amp;amp;resid=9AA0207FBB7C160D%21537082&amp;amp;authkey=ACZWR1umGsedykM&amp;amp;em=2&amp;amp;wdAr=1.3333333333333333&quot; width=&quot;610px&quot;&gt;This is an embedded &lt;a target=&#39;_blank&#39; href=&#39;https://office.com&#39;&gt;Microsoft Office&lt;/a&gt; presentation, powered by &lt;a target=&#39;_blank&#39; href=&#39;https://office.com/webapps&#39;&gt;Office Online&lt;/a&gt;.&lt;/iframe&gt;


&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
* I highly recommend downloading and viewing the slideshow in PowerPoint to view my speaker notes and comments on each slide.&lt;br /&gt;
&lt;h2&gt;
Here is the code samples:&lt;/h2&gt;
&lt;a href=&quot;https://github.com/KWizCom/SPFxDemo&quot;&gt;https://github.com/KWizCom/SPFxDemo&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Please feel free to give me more comments and suggestions on what would you like to hear about, so I could update my session accordingly.&lt;br /&gt;
&lt;br /&gt;
Also consider following the github project since I will publish updates to the source examples to it.&lt;br /&gt;
&lt;br /&gt;
Thanks.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Updates and related posts:&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/08/controlling-spfx-bundle-file-name-in.html&quot;&gt;Controlling SPFx bundle file name in production builds&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/09/office-ui-fabric-js-multi-select-support.html&quot;&gt;Office UI Fabric JS multi select support&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/07/how-to-avoid-breaking-your-spfx-project.html&quot;&gt;How to avoid breaking your SPFx project when dependencies change&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/07/spfx-project-breaking-after-moving-to.html&quot;&gt;SPFx project breaking after moving to a new computer&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/07/spfx-sharing-modules-between-projects.html&quot;&gt;SPFx: Sharing Modules between projects&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/07/debugging-spfx-using-vscode-multiple.html&quot;&gt;Debugging SPFx using VSCode - multiple projects in sub folders&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/06/spfx-workbench-certificate-error-in.html&quot;&gt;SPFx workbench certificate error in Chrome after v58&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/06/updating-spfx-package-still-showing.html&quot;&gt;Updating SPFx package still showing the older web part&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/06/versioning-strategy-for-spfx.html&quot;&gt;Versioning strategy for SPFx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/06/using-knockoutjs-in-new-spfx.html&quot;&gt;Using KnockoutJS in the new SPFx - containerless control flow removed&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://kwizcom.blogspot.ca/2017/03/using-office-ui-fabric-js-in-spfx.html&quot;&gt;Using Office UI Fabric JS in SPFx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://kwizcom.blogspot.ca/search/label/SPFx&quot;&gt;Or just check out all posts on SPFx&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/08/spfx-isv-insight-to-microsofts-latest.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-691739770978360344.post-8368487468516317637</guid><pubDate>Thu, 27 Jul 2017 16:53:00 +0000</pubDate><atom:updated>2017-09-15T08:36:32.560-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SPFx</category><title>How to avoid breaking your SPFx project when dependencies change</title><description>Your SPFx project has a short list of dependencies.&lt;br /&gt;
They are listed in package.json&lt;br /&gt;
&lt;br /&gt;
Thing is, these dependencies have a looong list of dependencies themselves, so that you end up with over 300MB folder of node_modules by the time you finish running npm install on a new SPFx project.&lt;br /&gt;
&lt;br /&gt;
As most of you probably noticed, SPFx by default has a .gitignore file that excludes node_modules from ever going into your source control.&lt;br /&gt;
&lt;br /&gt;
Which is a good thing - these packages are monitored and controlled by their authors and you don&#39;t need to manage all that code in your project, do you?&lt;br /&gt;
&lt;br /&gt;
That means, whenever you move to a new computer or a new developer start working on a project, after cloning that project they must also run npm install before they can start working.&lt;br /&gt;
&lt;br /&gt;
Now, npm install will start loading packages and dependencies as of TODAY, not as of when the project or the SPFx framework were compiled.&lt;br /&gt;
&lt;br /&gt;
Some dependencies are specified by a version number, so no worries there (as long as the author did not re-publish new code with the same version number).&lt;br /&gt;
&lt;br /&gt;
Others are specified as latest, or &quot;*&quot; or just with a major version - allowing minor versions updates. Since minor version updates suppose to be fully backward compatible and not contain breaking changes - sometimes that is not the case.&lt;br /&gt;
&lt;br /&gt;
So, you go to your new PC, run npm install, and your project does not build.&lt;br /&gt;
You get a ton of errors, version mismatch, and have no clue why.&lt;br /&gt;
&lt;br /&gt;
The reason would be probably a dependency you had was updated during that time (or god forbid - removed from npm!) which now breaks your project.&lt;br /&gt;
&lt;br /&gt;
That is something I talked about during the first DevKitchen I attended, when I first saw SPFx. Having a huge list of dependencies I don&#39;t control, my project rely on, and that I don&#39;t have a copy of scared me.&lt;br /&gt;
&lt;br /&gt;
And sure enough, since that day until today I had at least 4 episodes of dependency hell.&lt;br /&gt;
&lt;h2&gt;
What can you do today&lt;/h2&gt;
Without going into what Microsoft can and should do to avoid this in the future, here is what I plan to do and encourage you guys to do as well:&lt;br /&gt;
&lt;br /&gt;
1. Build a test SPFx project, call it &quot;Sanity&quot;&lt;br /&gt;
2. Run npm install, and make sure the demo web part works by running gulp serve&lt;br /&gt;
3. Remove the .gitignore file&lt;br /&gt;
4. Store the entire huge project in your source control&lt;br /&gt;
&lt;br /&gt;
Every so often, run npm update on this project.&lt;br /&gt;
Test if it is working - and if yes, commit the changes.&lt;br /&gt;
&lt;br /&gt;
However, if your project fails to build, you know you got a breaking change. Do not commit, it will probably get fixed within a few hours.&lt;br /&gt;
&lt;br /&gt;
Note that some breaking changes may come from a globally installed package, such as typescript.&lt;br /&gt;
So, it is a good practice to log these versions as well somewhere in your project. You can get that list by running &quot;npm ls&quot;.&lt;br /&gt;
&lt;h2&gt;
What to do if your project breaks&lt;/h2&gt;
Now, once one of your project fails to build, look at where the errors are coming from.&lt;br /&gt;
It will probably tell you the packages and their dependencies.&lt;br /&gt;
Now, you can compare these packages with the ones you have in your &quot;Sanity&quot; project, and once you identify the ones causing the problem you can manually revert it by running:&lt;br /&gt;
npm uninstall {package}&lt;br /&gt;
npm install {package}@{last working version}&lt;br /&gt;
&lt;br /&gt;
If you don&#39;t have that &quot;Sanity&quot; package, and do have a working version on a different computer - try to compare the versions between these two.&lt;br /&gt;
&lt;br /&gt;
A quicker fix might be to simply copy the node_modules folder from the working project into your new broken projects.&lt;br /&gt;
&lt;br /&gt;
It could be very frustrating spending valuable dev hours on maintenance instead of productive work, but hopefully these steps could help you cut down those hours.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/KwizcomSharepointBlog&quot;&gt;RSS&lt;/a&gt;&lt;/div&gt;</description><link>http://kwizcom.blogspot.com/2017/07/how-to-avoid-breaking-your-spfx-project.html</link><author>noreply@blogger.com (Shai Petel)</author><thr:total>0</thr:total></item></channel></rss>