tag:blogger.com,1999:blog-77945068191073771342024-03-14T05:39:10.992-07:00RRFreeman SharePoint ArchitectRobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.comBlogger139125tag:blogger.com,1999:blog-7794506819107377134.post-31322553457237498392019-07-25T18:55:00.001-07:002019-07-25T19:05:54.226-07:00O365 SharePoint - Duplicate Content Type<strong>Scenario</strong><br />
<ul><li>You try to create a new sub-site from a template or try to create a new content type</li>
<li>Office 365 SharePoint Online (SPO) environment</li>
</ul><strong>Issue</strong><br />
<ul><li>Internal SharePoint validation identifies a duplicate Content Type</li>
<ul><li>Typically this is due to a migration of content types or a failed feature activation/deactivation</li>
<li>Ex: "A duplicate content type name "Document Set" was found.</li>
</ul><li>You cannot remove the duplicate Content Types because they are part of a feature or in-use</li>
</ul><strong>Resolution</strong><br />
<ul><li>Rename the duplicate Content Types using the Site Settings/Content Types interface</li>
</ul><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY9fV36rXAUjY1EeYA1FLLsq2ob0_fKWaIf1D3FF7rvOEu9G42JdtcN8_kwBdF5v3PFuaz4m5eikIxan25-iWAi_T9F1UI1w9KDLDish_aNHpKg56rIYcxle7vvpw7nhL9WUH078yUaFQ/s1600/ContentType+Duplicates.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="172" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY9fV36rXAUjY1EeYA1FLLsq2ob0_fKWaIf1D3FF7rvOEu9G42JdtcN8_kwBdF5v3PFuaz4m5eikIxan25-iWAi_T9F1UI1w9KDLDish_aNHpKg56rIYcxle7vvpw7nhL9WUH078yUaFQ/s1600/ContentType+Duplicates.png" /></a></div><ul><li>_hidden content types (like "System Media Collection") require using PNP PowerShell cmdlets to get the ID to pass into the browser URL<pre class="code">$smc = Get-PnPContentType "System Media Collection"
$smc.Id
StringValue TypeId
----------- ------
0x0120D50067B20E13E9C3AA458AEF3A8392B641FD01 {da0f1e90-296f-480e-bc27-cefe51eff241}</pre></li>
<li><div>Edit another content type and then replace the ctype query string parameter to edit the _hidden content type</div></li>
<ul><li>Replace the following from the Document Set Edit Name Page<br />
/_layouts/15/ctypedit.aspx?ctype=<span style="color: red;">0x0120D50067B20E13E9C3AA458AEF3A8392B641FD</span></li>
</ul></ul>RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com11tag:blogger.com,1999:blog-7794506819107377134.post-47980151773554179222018-08-17T12:26:00.003-07:002018-08-17T12:41:38.321-07:00Promoted Tiles - Popup Prior to Click<strong>Scenario</strong><br />
<ul><li>You have a promoted tiles web part on a page</li>
<li>You need to prompt the user with a dialog box prior to navigating to the link on click</li>
</ul><strong>Issue</strong><br />
<ul><li>The onclick attribute is dynamically populated by the control, so it's hard to manipulate using Javascript or JQuery</li>
</ul><strong>Resolution</strong><br />
<ul><li>The key is to use the mousedown event instead.</li>
<ul><li>Note: This will not support keyboard navigation so you may need to handle the <a href="http://api.jquery.com/keydown/">keydown </a>event as well.</li>
</ul><li>Here is the code for the Script Editor. Adapt the URLs for your environment</li>
</ul><pre class="code"><script type="text/javascript" src="/SiteAssets/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/teams/print/SiteAssets/PromotedLinkPrompt.js"></script>
</pre><div><ul><li>Here is the PromotedLinkPrompt.js code</li>
</ul><pre class="code">console.log("PromotedLinkPrompt.js Loaded");
localStorage.setItem("PopupContentDone", "false");
function PopupContent()
{
var done = localStorage.getItem("PopupContentDone");
if (done == "false")
{
if (confirm("Does this work?\n\nClick OK to Proceed.\nClick Cancel for More Info."))
{
$(this).find("a")[0].click();
}
else
{
window.location = "http://www.votematrix.com";
}
localStorage.setItem("PopupContentDone", "true");
}
}
$(document).ready(function () {$("div .ms-tileview-tile-content").mousedown(PopupContent)});</pre></div>RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com7tag:blogger.com,1999:blog-7794506819107377134.post-36787601473563148292018-08-06T15:41:00.001-07:002018-08-06T15:45:50.670-07:00Use a JSON file in a SharePoint Library<strong>Scenario</strong><br />
<ul><li>You want to utilize a JSON file uploaded by an automated process to a SharePoint Document Library</li>
<li>In this case we will use the SiteAssets (Site Assets) document library in an Office 365 SharePoint Online (O365) site</li>
</ul><strong>Issue</strong><br />
<ul><li>If you use a direct path to the file you get the "Sorry, something went wrong" "File Not Found." error</li>
<ul><li>Ex: https://mycompany.sharepoint.com/sites/MySite/SiteAssets/MyFile.json</li>
</ul><li>If you click on the file or get a link to the file you are given a URL to an AllItems display form which renders a file editor, but will not grant access to the JSON via script</li>
<ul><li>Ex: https://mycompany.sharepoint.com/sites/MySite/SiteAssets/Forms/AllItems.aspx?id=%2Fsites%2FMySite%2FSiteAssets%2FMyFile%2Ejson&parent=%2Fsites%2FMySite%2FSiteAssets</li>
</ul></ul><strong>Resolution</strong><br />
<ul><li>Using the Download button and Fiddler (or IE dev tools / network), you can identify the correct URL to access the raw JSON file.</li>
<ul><li>Look for the <b>HTTPS GET </b>for <b>download.aspx</b></li>
</ul><li>Alternatively, you can use the following URL format and replace <b>mycompany</b>, <b>MySite</b>, and <b>MyFile </b>text with your own values:</li>
<ul><li>https://<b>mycompany</b>.sharepoint.com/sites/<b>MySite</b>/_layouts/15/download.aspx?SourceUrl=%2Fsites%2F<b>MySite</b>%2FSiteAssets%2F<b>MyFile</b>%2Ejson</li>
<ul><li>Note: This is for a site at /sites/MySite. You may need to modify this path.</li>
</ul></ul><li>If using JQuery, here is some code to get it:</li>
</ul><pre class="code"><div><div>$(document).ready(function () </div><div>{</div><div><span style="white-space: pre;"> </span>$.ajax({</div><div><span style="white-space: pre;"> </span> type: "GET",</div><div><span style="white-space: pre;"> </span> url: "/sites/MySite/_layouts/15/download.aspx?SourceUrl=%2Fsites%2FMySite%2FSiteAssets%2FMyFile%2Ejson",</div><div><span style="white-space: pre;"> </span> success: function(result)</div><div><span style="white-space: pre;"> </span> {</div><div> console.log(result[0].property1+ " - " + result[0].property2);</div><div><span style="white-space: pre;"> </span> }</div><div><span style="white-space: pre;"> </span> });</div><div>});</div></div></pre>RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com6tag:blogger.com,1999:blog-7794506819107377134.post-40919702356747401742018-07-25T13:53:00.002-07:002018-07-25T13:53:47.131-07:00SharePoint Column Validation - Is Numeric<strong>Scenario</strong><br />
<ul>
<li>You want the Title field to be an integer only.</li>
</ul>
<strong>Issue</strong><br />
<ul>
<li>The Title field cannot be typed as an integer using the standard list administration UI</li>
<li>The column validation in SharePoint is not straightforward</li>
<ul>
<li>ISNumeric([Column Name]) does not work as it always sees the parameter as text</li>
<ul>
<li>You have to add 0 to get a numeric value</li>
</ul>
</ul>
</ul>
<strong>Resolution</strong><br />
<ul>
<li>Use this format for the column validation to correctly identify an Integer</li>
<ul>
<li>=IFERROR(INT([Column Name]+0)=[Column Name]+0,FALSE)</li>
</ul>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-32017770721121118942018-05-29T12:11:00.000-07:002018-06-22T12:01:44.266-07:00Microsoft tech support fails the open source community<strong>Scenario</strong><br />
<ul>
<li>Open an O365 support ticket with Microsoft to notify them of a bug in their product.</li>
<li>Detail everything Microsoft needs to know to fix the problem in an email</li>
<ul>
<li>In a recent case it was simply due to the Microsoft release engineer failing to deploy 2 files (CSS and PNG) from the Office 365 release to the CDN.</li>
<ul>
<li>This effected tenants utilizing the CKEditor <b>open source</b> JavaScript class library, breaking the functionality for released web parts. (Part of the SPfx 40)</li>
</ul>
</ul>
</ul>
<div>
<b>Issues</b></div>
<ul>
<li>Tier 1 support calls you and wastes an hour (or more) of your time making you go over the same steps provided in the email.</li>
<ul>
<li>In the recent case it was literally as easy as clicking a link and getting a 404 error.</li>
<ul>
<li>Here is the link to the Open Source product that Microsoft broke and the users who took the time to report it: https://github.com/OlivierCC/spfx-40-fantastics/issues/29</li>
</ul>
</ul>
<li>Tier 1 support says they can't support this because it is a programming issue and wants you to open a paid ticket to fix their own product issue.</li>
</ul>
<strong>Proposed Resolution</strong><br />
<ul>
<li>Microsoft needs a better way to escalate tickets from members of the community who are trying to help out and know what they are doing without having to go through tier 1 engineers or paid support.</li>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com1tag:blogger.com,1999:blog-7794506819107377134.post-60971877397724966432018-05-21T18:26:00.000-07:002018-07-11T13:40:39.213-07:00OneNote Compliance, Records Management, and Governance - O365<b><span style="font-size: medium;">
Scenario</span></b><br />
<ul>
<li>OneNote (part of the Office 365 suite of tools) is used to store information that may be considered records (official information)</li>
<li>Your compliance or governance teams may want retention, legal holds, or other policies configured on these records</li>
</ul>
<b><span style="font-size: medium;">
Issues</span></b><br />
<ol>
<li><b>Mixed Content</b>: OneNote notebooks contain mixed content with differing record policies.</li>
<ul>
<li>Ex: Meeting minutes in one section, project info in another, and issues in a third section.</li>
<li>You cannot apply policies at the page level.</li>
<li>Note: This issue is the same as any other document containing mixed content (Word, Excel, etc.), however it is easier to use OneNote in this manner.</li>
</ul>
<li><b>Time Span</b>: OneNote notebooks contain content spanning multiple days, months, or years</li>
<ol>
<li>This means disposition policies may not apply correctly, delaying or accelerating policy dates</li>
</ol>
<li><b>Legal Holds</b>: Legal holds may inadvertently block an entire notebook from being editable</li>
<li><b>Incompliant Locations</b>: If OneNote usage is discouraged or blocked, records are more likely to end up in incompliant locations and users may experience broken integration features</li>
<ol>
<li>Incompliant alternatives: Notepad saved locally, Evernote, cell phone pictures and voice memos (Office Lens), emails, other online services, a personal OneDrive OneNote account, or a locally stored OneNote</li>
<li>To avoid OneNote, users would also need to ignore the extensive OneNote integration features provided in Outlook, Windows, and the other Office products.</li>
<li>There is not a good alternative note-taking tool that would better meet compliance policies.</li>
</ol>
</ol>
<b><span style="font-size: medium;">
Solutions</span></b><br />
<h4>
<i>
1. Mixed Content</i></h4>
OneNote notebooks with records should live in SharePoint, not in OneDrive or on a file share.<br />
<ul>
<li>SharePoint allows for version tracking at the library level</li>
<ul>
<li>Note: This is in addition to the limited OneNote versioning.</li>
</ul>
<li>SharePoint also allows content policies to be applied at the section or Notebook level</li>
</ul>
<div>
OneNote notebooks with differing compliance policies should be split into separate notebooks</div>
<ul>
<li>The policies should then be applied at the notebook level</li>
</ul>
<h4>
<i>
2. Time Span</i></h4>
<div>
Notebook policies should be applied based on the parent SharePoint site policy whenever possible and should be defined based on the overall work being done. </div>
<div>
<ul>
<li>Example: A notebook for a project would last as long as the policy for the entire project.</li>
<li>Example: A team site notebook would expire when the team was disbanded.</li>
<li>Example: A department level knowledge-base notebook should not auto expire unless the department goes away. A separate policy for archiving historical content can still be put into place.</li>
</ul>
<div>
Users can also be trained to export and archive specific content using any time frame required by your policies. Users may automatically be assigned tasks to remind them to do this.</div>
<div>
<ul>
<li>Example Policy: Meeting minutes should be exported quarterly to PDF format and minutes deleted from the notebook for the prior quarter.</li>
<li>Example: Project notebook should be exported yearly to XPS or PDF formats.</li>
</ul>
</div>
<h4>
<i>
3. Legal Holds</i></h4>
</div>
<div>
For legal holds that block edits, records living in OneNote should be exported to an appropriate format (PDF, Word, etc.) and the hold should be applied to the exported document which would then be the official record and not block additional modifications to the entire notebook. An alternative approach is to export the entire notebook and place a hold on the exported copy. This issue applies to all document types that are actively used, but may be more impactful for OneNote if mixed content is contained in the notebook. </div>
<h4>
<i>
4. Incompliant Locations</i></h4>
<div>
The best solution is to provide the user with compliant locations that are easy to use. This can be done by provisioning SharePoint sites and OneNote notebooks for common records management use cases. In this way, notebooks will already be split by appropriate policy groupings and correctly configured for versioning and compliance policies.</div>
<div>
<br /></div>
<div>
Restricting usage and adherence to best practices is the hardest to control and must be enforced through user training. Some incompliant locations may be blocked by IT through firewall rules, but users can always get around these by using their own mobile devices.</div>
<div>
<br /></div>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com2tag:blogger.com,1999:blog-7794506819107377134.post-59000540726599259142018-01-18T12:16:00.002-08:002018-08-09T11:28:34.024-07:00SharePoint Permissions Cheat Sheet<span style="font-size: 14.6667px;">The following is a list of the default permission levels organized from greatest to least permissions and relating them in a concise hierarchical manner. You can modify these however you want; but I recommend creating new permission levels instead or modifying the default permission levels in order to avoid confusion. </span><br />
<span style="font-size: 14.6667px;"><br />
</span> <span style="font-size: 14.6667px;">Microsoft has <a href="https://support.office.com/en-us/article/Understanding-permission-levels-in-SharePoint-87ecbb0e-6550-491a-8826-c075e4859848">grid versions</a> of this, but this format is much simpler.</span><br />
<span style="font-size: 14.6667px;">Permission level details are available here: <a href="https://technet.microsoft.com/en-us/library/cc721640(v=office.16).aspx">Technet</a></span><br />
<span style="font-size: 14.6667px;"><br />
</span> <span style="font-family: inherit;"><span style="font-size: 11pt; font-weight: bold;">Full Control</span><span style="font-size: 11pt;"> - <span style="color: #674ea7;"><b>Owner</b></span></span></span><br />
<div style="height: 0px;">
</div>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">+ <span style="font-size: 11pt; font-weight: bold;">Manage Hierarchy</span></span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><b><span style="font-family: inherit;">+ Design</span></b></li>
</ul>
<span style="font-size: 11pt; font-weight: bold;"><span style="font-family: inherit;">Design</span></span><br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Apply Themes and Borders</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Apply Style Sheets</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Override list behaviors - checked out to other user</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">+ <span style="font-size: 11pt; font-weight: bold;">Edit</span></span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">+ <span style="font-size: 11pt; font-weight: bold;">Approve</span></span></li>
</ul>
<span style="font-family: inherit;"><span style="font-size: 11pt; font-weight: bold;">Manage Hierarchy</span><span style="font-size: 11pt;"> - <span style="color: #674ea7;"><b>Hierarchy Managers</b></span></span></span><br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Override list behaviors - checked out to other user</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Manage and Enumerate Permissions</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">View Web Analytics Data</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Create Subsites</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Manage Web Site</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Manage Alerts</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">+ <span style="font-size: 11pt; font-weight: bold;">Edit</span></span></li>
</ul>
<span style="font-family: inherit;"><span style="font-size: 11pt; font-weight: bold;">Edit</span><span style="font-size: 11pt;"> - <span style="color: #674ea7;"><b>Members</b></span></span></span><br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Manage Lists</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Add and Customize Pages</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">+ <span style="font-size: 11pt;"><b>Contribute</b></span></span></li>
</ul>
<span style="font-family: inherit;"><span style="font-size: 11pt; font-weight: bold;">Approve</span><span style="font-size: 11pt;"> - <b><span style="color: #674ea7;">Approvers</span></b></span></span><br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Approve Items</span></li>
<li><span style="font-family: inherit;">Override list behaviors - checked out to other user</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">+ <span style="font-size: 11pt;"><b>Contribute</b></span></span></li>
</ul>
<span style="font-size: 11pt; font-weight: bold;"><span style="font-family: inherit;">Contribute</span></span><br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Add, Edit, Delete Items</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Delete Versions</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Browse Directories (explorer view)</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Personal info, views, and web parts</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">+ <b>Read</b></span></li>
</ul>
<span style="font-family: inherit;"><span style="font-size: 11pt; font-weight: bold;">Read</span><span style="font-size: 11pt;"> - <b><span style="color: #674ea7;">Visitors</span></b></span></span><br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Open Items</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">+ <b>View Only</b></span></li>
</ul>
<span style="font-size: 11pt; font-weight: bold;"><span style="font-family: inherit;">View Only</span></span><br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">View Versions</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Create Alerts</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">View Application Pages</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Self-service Site Creation</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Browse User Information</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Use Remote interfaces</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Use Client Integration Features</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">+ <span style="font-size: 11pt; font-weight: bold;">Restricted Read</span></span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"><ul>
<li><span style="font-family: inherit;">-<span style="color: red; font-size: 11pt;"> </span><span style="color: red; font-size: 11pt;">Open Items</span></span></li>
</ul>
</ul>
<span style="font-size: 11pt; font-weight: bold;"><span style="font-family: inherit;">Restricted Read</span></span><br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">View Items</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Open Items</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">View Pages</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Open web/list/folder</span></li>
</ul>
<span style="font-size: 11pt; font-weight: bold;"><span style="font-family: inherit;">Limited Access</span></span><br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Browse User Information</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Use Client Integration Features</span></li>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc">
<li><span style="font-family: inherit;">Open web/list/folder</span></li>
</ul>
<br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"></ul>
</ul>
</ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
</ul>
<br />
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="disc"><ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
<ul style="direction: ltr; margin-bottom: 0in; margin-left: .375in; margin-top: 0in; unicode-bidi: embed;" type="circle"></ul>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com1tag:blogger.com,1999:blog-7794506819107377134.post-42706389486149660912017-12-15T14:50:00.001-08:002017-12-15T14:50:31.970-08:00Managed Metadata multi-select values in SharePoint Designer Workflow<strong>Scenario</strong><br />
<ul>
<li>You wish to use the values in a multi-select managed metadata field in your SharePoint Designer 2010 or 2013 workflow</li>
</ul>
<strong>Issue</strong><br />
<ul>
<li>Sometimes the workflow will fail when too many items are selected</li>
<ul>
<li>Ex: the term names plus GUIDs exceed 255 characters in the item / fieldname_0 results</li>
</ul>
<li>HTTP 500 Error in Workflow Information screen on 2013 workflows:</li>
<ul>
<li>RequestorId: GUID. Details: System.ApplicationException: HTTP 500 {"Transfer-Encoding":["chunked"],"X-SharePointHealthScore":["0"],"SPClientServiceRequestDuration":["30"],"SPRequestGuid":["GUID"],"request-id":["GUID"],"X-FRAME-OPTIONS":["SAMEORIGIN"],"MicrosoftSharePointTeamServices":["15.0.0.4667"],"X-Content-Type-Options":["nosniff"],"X-MS-InvokeApp":["1; RequireReadOnly"],"Cache-Control":["max-age=0, private"],"Date":["Fri, 15 Dec 2017 22:29:51 GMT"],"Server":["Microsoft-IIS\/8.0"],"X-AspNet-Version":["4.0.30319"],"X-Powered-By":["ASP.NET"]} at Microsoft.Activities.Hosting.Runtime.Subroutine.SubroutineChild.Execute(CodeActivityContext context) at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)</li>
</ul>
</ul>
<strong>Resolution</strong><br />
<ul>
<li>The list item field with _0 after it does support selections over 255 characters, but many Workflow Actions do not support fields larger than 255 characters.</li>
<ul>
<li>You cannot:</li>
<ul>
<li>Log to History List</li>
<li>Set Workflow Variable of any types except "Multiple lines of text"</li>
<ul>
<li>"Multiple lines of text" is only available from "Initiation Form" parameters</li>
</ul>
</ul>
<li>You can:</li>
<ul>
<li>Email text</li>
<li>Use "contains" operator in an If statement</li>
</ul>
<li>I have not gone further in my testing than the above, so please comment on any other actions you identify as working or not working.</li>
</ul>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-55811388593150709912017-11-20T12:06:00.003-08:002018-02-16T17:21:50.836-08:00Deploy JavaScript to a Site Collection or Web in Office 365 or On Premises + Dynamic Navigation Link<strong>Scenario</strong><br />
<ul>
<li>You have some JavaScript you'd like to inject into a page and want the simplest method of deploying it to all pages within a Site Collection or Web.</li>
</ul>
<strong>Issue</strong><br />
<ul>
<li>You can do this via custom master pages, but then you break any future upgrades from Microsoft</li>
<li>You can also do this via a Sandbox code solution, SharePoint Framework, or a SharePoint Add-In, but these are all overly complex for this simple task and may not work in some environments due to incorrect environment configurations</li>
</ul>
<strong>Resolution</strong><br />
<ul>
<li>The simplest, fully supported way to do this is via a User Custom Action ScriptLink</li>
<li><a href="http://johnliu.net/blog/2015/12/the-safest-future-proof-way-to-brand-your-sharepoint-and-sharepoint-online">John Liu</a> has a nice UI tool to simplify registering your code with each site/site collection</li>
</ul>
<div>
<strong>Example</strong></div>
<ul>
<li>The following code example injects simple Javascript into each page to add a dynamic link to the left navigation menu (quick launch)</li>
<li>I like to put these in Site Assets at the Site Collection root. If you don't have a Site Assets library, you can create one by opening the site in SharePoint Designer and double clicking the Site Assets link. You can also do this by enabling any feature that utilizes the Site Assets library. Otherwise, you can use a different library that everyone can read from.</li>
<li>You will need the following 3 files. These should be saved into the Site Assets library at the site collection root site.</li>
<ul>
<li><a href="https://votematrix.sharepoint.com/spsat/_layouts/15/guestaccess.aspx?docid=00240be81291c436db13c50975f38b913&authkey=AVsaQTIRWcTr8u_MO_Zwg8Y&e=688030383c604730843b24dc730ee021">JQuery</a> </li>
<li>John Liu's <a href="https://votematrix.sharepoint.com/:u:/g/spsat/EfvAxqS8TIlMssJcK-B8mjQBUzjD8rA3Yl8cy4bNwtYWxQ?e=AoxnDu">configuration page</a> (configure-page.aspx)</li>
<li>The following code saved as <a href="https://votematrix.sharepoint.com/spsat/_layouts/15/guestaccess.aspx?docid=08d456179b54a474890be453d0d585f4b&authkey=AV41wdKkz58fpRxnA0BBIhE&e=24f4ef68948d430c89000ed321a8ce7b">JSTest.js</a></li>
</ul>
</ul>
<div>
<pre class="code">$(document).ready(function(){
//Fixes Chrome Scrolling problem and load of ECMAScript
if (typeof(_spBodyOnLoadWrapper) !== 'undefined'){
_spBodyOnLoadWrapper();
console.log('test');
MenuLastLI = $('#zz14_RootAspMenu li:last');
MenuLastLI.before('
<li class="static"><a class="static menu-item ms-core-listMenu-item ms-displayInline ms-navedit-linkNode" href="http://www.votematrix.com/"><span class="additional-background ms-navedit-flyoutArrow"><span class="menu-item-text">CUSTOM LINK</span></span></a></li>
');
}; });
</pre>
</div>
<ul>
<li>Click to open John Liu's configuration page (configure-page.aspx)</li>
<li>Configure jQuery as Sequence 900 (so it loads first). Install Site Collection.</li>
</ul>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-Q4B5-8jMjJVQ1MZUc162gURp4bHxyhoGr0x9SbVufLToEH4IYCDKQrpTzjqDTN14EwEJjZP-Zb-9IuQ3pkbeb-ujt27oxdCyX-5oDsGnYZT9V_oGw4pE3YTeeW18owx0uoorIr6ZIQ0/s1600/Configure+Jquery.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="180" data-original-width="666" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-Q4B5-8jMjJVQ1MZUc162gURp4bHxyhoGr0x9SbVufLToEH4IYCDKQrpTzjqDTN14EwEJjZP-Zb-9IuQ3pkbeb-ujt27oxdCyX-5oDsGnYZT9V_oGw4pE3YTeeW18owx0uoorIr6ZIQ0/s640/Configure+Jquery.png" width="640" /></a></div>
<ul>
<li>Configure JSTest.js as Sequence 2000 (Loads after jQuery)</li>
</ul>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitOgiuK5qEAMnyQWaaS1c3SB2kvjf0qvxbbDHo8khDJ-zrnohGOi75dRdAY43uHILtPbrvb4bAq4FgGgnIOKeNDZsHckqT-Fc_XsHwa8E6PGvMC_X6Okz-WCSKmognp_Cvh3AM8QF6jNU/s1600/Configure+Jquery.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="150" data-original-width="640" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitOgiuK5qEAMnyQWaaS1c3SB2kvjf0qvxbbDHo8khDJ-zrnohGOi75dRdAY43uHILtPbrvb4bAq4FgGgnIOKeNDZsHckqT-Fc_XsHwa8E6PGvMC_X6Okz-WCSKmognp_Cvh3AM8QF6jNU/s640/Configure+Jquery.png" width="640" /></a></div>
</div>
<ul>
<li>That's it. The link should show on the left nav.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0qleiv3IAm7MZjtuyCktOV9X19LW8RnNjxmJtEMelTsEvktyLSP1hvnqaVdBmCuZUt5WOP9ZxLeAEhQiCs-3lcjpPRbnCPSI4ff9YvBIw_jcJ8YTZKLvHUlzhNxpOFG1hsDKyVZlg5uo/s1600/CustomLink.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="386" data-original-width="355" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0qleiv3IAm7MZjtuyCktOV9X19LW8RnNjxmJtEMelTsEvktyLSP1hvnqaVdBmCuZUt5WOP9ZxLeAEhQiCs-3lcjpPRbnCPSI4ff9YvBIw_jcJ8YTZKLvHUlzhNxpOFG1hsDKyVZlg5uo/s320/CustomLink.png" width="294" /></a></div>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com3tag:blogger.com,1999:blog-7794506819107377134.post-79053092534641784562017-06-19T17:20:00.005-07:002017-06-19T17:20:54.131-07:00SharePoint 2016 AutoSPInstaller Offline Mode Install TipsRemember to save the latest <a href="https://technet.microsoft.com/en-us/library/mt715807%28v=office.16%29.aspx?f=255&MSPPError=-2147217396">SharePoint Update</a> into the updates folder<br />
<br />
Download prerequisites:<br />
<ul>
<li><a href="https://download.microsoft.com/download/4/B/1/4B1E9B0E-A4F3-4715-B417-31C82302A70A/ENU/x64/sqlncli.msi">sqlncli.msi</a></li>
<li><a href="http://download.microsoft.com/download/E/0/0/E0060D8F-2354-4871-9596-DC78538799CC/Synchronization.msi">Synchronization.msi</a></li>
<li><a href="https://download.microsoft.com/download/A/6/7/A678AB47-496B-4907-B3D4-0A2D280A13C0/WindowsServerAppFabricSetup_x64.exe">WindowsServerAppFabricSetup_x64.exe</a></li>
<li><a href="http://go.microsoft.com/fwlink/?LinkID=252368">MicrosoftIdentityExtensions-64.msi</a></li>
<li><a href="https://download.microsoft.com/download/3/C/F/3CF781F5-7D29-4035-9265-C34FF2369FA2/setup_msipc_x64.exe">setup_msipc_x64.exe</a></li>
<li><a href="https://download.microsoft.com/download/F/1/0/F1093AF6-E797-4CA8-A9F6-FC50024B385C/AppFabric-KB3092423-x64-ENU.exe">AppFabric-KB3092423-x64-ENU.exe</a></li>
<li><a href="https://download.microsoft.com/download/1/C/A/1CAA41C7-88B9-42D6-9E11-3C655656DAB1/WcfDataServices.exe">WcfDataServices.exe</a></li>
<li><a href="http://download.microsoft.com/download/5/7/2/57249A3A-19D6-4901-ACCE-80924ABEB267/1033/amd64/msodbcsql.msi">msodbcsql.msi</a></li>
<li><a href="https://download.microsoft.com/download/C/3/A/C3A5200B-D33C-47E9-9D70-2F7C65DAAD94/NDP46-KB3045557-x86-x64-AllOS-ENU.exe">NDP46-KB3045557-x86-x64-AllOS-ENU.exe</a></li>
<li><a href="http://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe">vcredist_x64.exe</a></li>
<li><a href="http://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe">vc_redist.x64.exe</a></li>
</ul>
<div>
General reference:</div>
<div>
<a href="https://social.technet.microsoft.com/wiki/contents/articles/32416.sharepoint-server-2016-rtm-offline-installation.aspx#Section_2_Download_and_Install_pre-requisites_for_SharePoint_Server_2o16_IT_Preview">SharePoint Server 2016 RTM: offline installation</a></div>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-23400192074337688932017-04-18T16:34:00.002-07:002017-06-07T16:40:10.197-07:00SharePoint 2016 Topology Planning<strong>Scenario</strong><br />
<ul>
<li>You are architecting an on-premises SharePoint 2016 Server Farm infrastructure deployment.</li>
</ul>
<strong>Steps</strong><br />
<ul>
<li>If this is an upgrade, make sure you know what features were depricated</li>
<ul>
<li><a href="https://technet.microsoft.com/en-us/library/mt346112(v=office.16).aspx">Technet - Depricated Features</a></li>
</ul>
<li>Determine your server license requirements</li>
<ul>
<li><a href="https://gallery.technet.microsoft.com/office/SharePoint-2016-Feature-1746745d">Enterprise or Standard</a></li>
<li>Procure that license</li>
</ul>
<li>Determine if you need a scripted install or wizard install</li>
<ul>
<li>Scripted</li>
<ul>
<li>Utilize AutoSPInstaller (open source project) to create reusable installation scripts for easier re-provisioning of servers for multiple environments and disaster recovery scenarios</li>
<li>More time to setup and initially more error-prone with greater possibility of misconfiguration and typos</li>
</ul>
<li>Wizard</li>
<ul>
<li>Simplified interface and best support from MS</li>
<li>You should document in OneNote all settings chosen so you can reproduce exactly</li>
</ul>
</ul>
<li>Determine if you can use MinRoles and decide which roles to use for which servers and how many servers you need</li>
<ul>
<li>MinRoles provide best practice configurations, are better supported by Microsoft, and are easier to redeploy using the wizard</li>
<li>MinRoles cannot be used in certain large and specialized farm configurations</li>
<li>Decide how many servers you need based on projected load and high availability requirements</li>
<li>Decide which roles to use by reviewing them here: <a href="https://technet.microsoft.com/en-us/library/mt743704(v=office.16).aspx">Technet - MinRole Planning</a></li>
</ul>
<li>Design SharePoint server topology using the roles and number of servers decided earlier</li>
<ul>
<li>Determine Hardware and VM Specs: <a href="https://technet.microsoft.com/en-us/library/cc262485(v=office.16).aspx#hwLocServers">Technet - Minimum Server Requirements</a></li>
</ul>
<li>Design SQL, Workflow Manager, and Office Online (previously Office Web Apps) server configurations</li>
<ul>
<li>SQL: <a href="https://technet.microsoft.com/en-us/library/cc298801(v=office.16).aspx">Technet - SQL Planning</a></li>
<ul>
<li>Best on designated servers</li>
</ul>
<li>Workflow Manager: <a href="https://technet.microsoft.com/en-us/library/jj658588.aspx">Technet - Install Workflow Manager</a></li>
<ul>
<li>Required to enable SharePoint 2013 workflows</li>
<li>Latest SQL server version may not support WFM without additional patches</li>
<li><a href="https://gallery.technet.microsoft.com/office/SharePoint-2016-Workflow-acd5ba2a/view/Discussions">Step by step guide</a></li>
</ul>
<li>Office Online Server: <a href="https://technet.microsoft.com/en-us/library/jj219455(v=office.16).aspx">Technet - Planning Office Online Server</a></li>
<ul>
<li>Note that Excel Services is deprecated in 2016 and now requires an OOS deployment to work</li>
<li>Requires designated servers</li>
</ul>
</ul>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-85518851809062017342016-11-15T13:14:00.000-08:002017-12-22T10:57:55.789-08:00SharePoint 2013 - Redirect to View Item Form on New Item Save<strong>Scenario</strong><br />
<ul>
<li>You are saving a new record and want the user to be redirected back to the view item form to review the item. This will allow the user to start a workflow or perform another action on the ribbon without the need to find the item in the list or library view.</li>
<li>Need the solution to use JSOM (client side script) only. </li>
<li>Should work in Office 365, SharePoint Online, and On-Prem.</li>
</ul>
<strong>Issue</strong><br />
<ul>
<li>By default, SharePoint redirects you to the List View you most recently came from.</li>
<li>There is no out of the box setting for this.</li>
</ul>
<strong>Resolution</strong><br />
<ul>
<li>We solve this by adding a redirect script to each list view page that does the following:</li>
<ul>
<li>Check if a new item was added by the current user.</li>
<li>Check and create a short term cookie to determine if they have already been redirected for this item</li>
<li>Redirect the user if they haven't already been</li>
</ul>
<li>First add the following Javascript file to your SiteAssests/js folder. </li>
<ul>
<li>Create the "js" folder if it's not already there.</li>
<li>Replace the ALLCAPS hard coded values with appropriate values.</li>
</ul>
</ul>
<h2>
<b>SiteAssets/js/SP.RedirectOnAddItem.js</b></h2>
<div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var siteUrl =
'/sites/SITENAME';</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
function
createCookie(name,value,minutes) {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
if (minutes) {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var date = new Date();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
date.setTime(date.getTime()+(minutes*60*1000));</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var expires = ";
expires="+date.toGMTString();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
else var expires = "";</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
document.cookie =
name+"="+value+expires+"; path=/";</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
function
readCookie(name) {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var nameEQ = name + "=";</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var ca = document.cookie.split(';');</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
for(var i=0;i < ca.length;i++) {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var c = ca[i];</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
while (c.charAt(0)==' ') c =
c.substring(1,c.length);</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
if (c.indexOf(nameEQ) == 0) return
c.substring(nameEQ.length,c.length);</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
return null;</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
function
eraseCookie(name) {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
createCookie(name,"",-1);</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
function
RedirectOnAddItem() {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
var
clientContext = new SP.ClientContext(siteUrl);</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
var
web = clientContext.get_web();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
this.currentUser
= web.get_currentUser();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
clientContext.load(currentUser);</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
clientContext.executeQueryAsync(</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
Function.createDelegate(this,
onUserQuerySucceeded),</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
Function.createDelegate(this,
onQueryFailed)</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
); </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
function
onUserQuerySucceeded(sender, args) {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var email = this.currentUser.get_email();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var userid = this.currentUser.get_id();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var loginName =
this.currentUser.get_loginName();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var clientContext = new
SP.ClientContext(siteUrl);</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
var
oList = clientContext.get_web().get_lists().getByTitle('LISTORLIBRARYNAME'); </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var camlQuery = new SP.CamlQuery();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
camlQuery.set_viewXml('<View><Query><OrderBy><FieldRef
Name = "ID" Ascending =
"FALSE"/></OrderBy><Where><Eq><FieldRef
Name="Author" LookupId="True"/><Value
Type="User">' + userid +
'</Value></Eq></Where></Query><RowLimit>1</RowLimit></View>');</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
this.collListItem =
oList.getItems(camlQuery);</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
clientContext.load(this.collListItem);</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
clientContext.executeQueryAsync(Function.createDelegate(this,
this.onListQuerySucceeded), Function.createDelegate(this,
this.onQueryFailed)); </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
function
onListQuerySucceeded(sender, args) {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
var
listItemInfo = '';</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
var
listItemEnumerator = collListItem.getEnumerator();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
while (listItemEnumerator.moveNext()) {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var oListItem =
listItemEnumerator.get_current();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
listItemInfo += '\nID: ' +
oListItem.get_id();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
listItemInfo += '\nAuthor: ' +
oListItem.get_item("Author").get_lookupValue();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var diff = Math.abs(Date.now()) - new
Date(oListItem.get_item("Created"));</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
var minutesPassed =
Math.floor((diff/1000)/60);</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
listItemInfo += '\nCreated (Minutes
Ago): ' + minutesPassed ;</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
if (oListItem && minutesPassed
< 2) {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: 1.125in; margin: 0in;">
//alert(listItemInfo.toString());</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: 1.125in; margin: 0in;">
if
(!(readCookie('PANnewID') == oListItem.get_id().toString())){</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: 1.5in; margin: 0in;">
createCookie('PANnewID',
oListItem.get_id().toString(), 2);</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: 1.5in; margin: 0in;">
window.location
= "/sites/SITENAME/Lists/<span style="font-size: 14.6667px;">LISTORLIBRARYNAME</span>/DISPLAYFORMNAME.aspx?ID=" +
oListItem.get_id();</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: 1.125in; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .75in; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
function
onQueryFailed(sender, args) {</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
alert('Request
failed. ' + args.get_message() + '\n' + args.get_stackTrace());</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
}</div>
<ul>
<li>Finally, add the following code to a Script Editor web part on each List View page where the user would normally be redirected.</li>
</ul>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<script
src="<span style="font-size: 14.6667px;">/sites/SITENAME/</span>SiteAssets/js/SP.RedirectOnAddItem.js"></script></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<script
type="text/javascript">ExecuteOrDelayUntilScriptLoaded(RedirectOnAddItem,
"sp.js");</script></div>
</div>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com1tag:blogger.com,1999:blog-7794506819107377134.post-52737264335179153792016-07-26T20:36:00.001-07:002016-08-02T17:32:40.656-07:00Is SharePoint a true Document Management System (DMS)? Rumor explored.In my 10+ years working with SharePoint I've heard 3 individuals declare that SharePoint isn't "a true Document Management system". When questioned about this they bring up instances of poorly architected solution issues or performance limitations as the justification. I too have experienced poor performance, bugs, limitations, and have inherited poorly architected SharePoint solutions; but my tendency is to address the underlying issues or engineer proper solutions rather than discounting the software out-of-hand. This leads me to believe that there are some outdated primary sources for this rumor that were introduced outside of these users' own experiences. This article will look into some of these sources, listing their bias. I will also post some refuting articles.<br />
<br />
Disclaimer: Obviously my bias is towards SharePoint as I am very familiar with its capabilities and have used it to implement more than 40 document management solutions with each one exceeding its unique requirements<br />
<strong><br /></strong>
<strong>Sources of Rumor </strong>(SharePoint is not a DMS)<br />
<ul>
<li><a href="http://www.efilecabinet.com/is-sharepoint-a-document-management-system/">eFileCabinet</a> - SharePoint competitor (2010)</li>
<li><a href="https://www.contentverse.com/square-peg-round-hole-sharepoint-as-document-management/">ContentVerse</a> - SharePoint competitor (2014)</li>
<li><a href="http://www.fishbowlsolutions.com/fishbowl/groups/public/documents/white_papers/032990.pdf">Fishbowl Solutions</a> - Oracle WebCenter SharePoint Connector provider (2012?)</li>
<ul>
<li>Has a good overview of the history of SharePoint issues pre-2010 but is mostly propaganda for keeping WebCenter and using their connector instead of migrating everything to SharePoint</li>
</ul>
<li><a href="http://www.revasolutions.com/sharepoint-as-an-ecm-verdict/">Reva Solutions</a> - Alfresco (SharePoint Competitor) ISV (2015)</li>
<li><a href="http://www.docfinity.com/whats-in-it-for-me-sharepoint-and-the-changing-face-of-ecm/">DocFinity</a> - SharePoint competitor</li>
<li><a href="http://www.incontextmag.com/articles/2010/sharepoint-is-for-collaboration--ecm-is-for-everything-else.html">Lexmark's In Context</a> - Perceptive Software (SharePoint Competitor - now Lexmark) interview (2011)</li>
</ul>
<strong>Refutations of Rumor </strong>(SharePoint is a DMS)<br />
<ul>
<li><a href="http://www.harvesttg.com/ecm/can-microsoft-sharepoint-used-enterprise-content-management/">Harvest TG</a></li>
<ul>
<li>Includes presentation video</li>
</ul>
<li><a href="https://yuriburger.net/2010/09/21/microsoft-sharepoint-2010-is-it-a-true-document-management-system/">Yuriburger.net</a> (2010)</li>
<ul>
<li>Hummingbird/OpenText and Documentum developer who moved to SharePoint</li>
<li>Proposes a document management litmus test</li>
</ul>
<li><a href="https://imagefast.wordpress.com/2011/09/23/can-i-use-sharepoint-2010-as-a-document-management-system/">ImageFast</a> (MS Partner)</li>
<li><a href="https://blogs.msdn.microsoft.com/ecm/2010/02/14/introducing-document-management-in-sharepoint-2010/">SharePoint 2010 ECM</a> (MS: included as a feature reference)</li>
<li>Gartner Magic Quadrant - SharePoint as ECM Leader since 2008</li>
<ul>
<li><a href="https://blogs.msdn.microsoft.com/gayanpeiris/2008/09/26/microsoft-a-leader-in-gartner-enterprise-content-management-magic-quadrant/">ECM Leader 2008</a></li>
<li><a href="http://blog.dannyburlageonline.com/2009/10/microsoft-leader-ecm-quadrant-gartner-october-2009.html">ECM Leader 2009</a></li>
<li><a href="http://sharepoint247.com/sharepoint2010/sharepoint-2010-leads-the-magic-quadrant-for-enterprise-content-management/">ECM Leader 2010</a></li>
<li><a href="https://ecmroad.wordpress.com/2011/10/21/gartner-magic-quadrant-for-ecm-2011/">ECM Leader 2011</a></li>
<li><a href="http://www.imarcfletcher.com/2013/07/the-top-10-things-intervate-is-excited.html">ECM Leader 2012</a></li>
<li><a href="http://www.collectiveintelligence.com/Solutions/Web-Portals/Documents/Gartner-Magic%20Quadrant%20for%20Enterprise%20Content%20Management.pdf">ECM Leader 2013</a></li>
<li><a href="http://pulseblog.emc.com/2014/10/20/emc-named-leader-gartner-magic-quadrant-ecm/">ECM Leader 2014</a></li>
<li><a href="http://sparkblog.emc.com/wp-content/uploads/2015/10/Gartner-Magic-Quadrant-for-Enterprise-Content-Management_20151021-1024x1024.png">ECM Leader 2015</a></li>
</ul>
</ul>
<div>
<b>Conclusion</b></div>
<div>
<br /></div>
<div>
SharePoint (2007 or later) is a bonafide Document Management System with its own unique advantages and disadvantages. The rumors appear to have been initiated by competing vendors as marketing propaganda from sources with limited knowledge of SharePoint's capabilities or from early reviewers who balked at the new technology and its use of third-party vendors for imaging and other advanced functionality. It's fair to mention that SharePoint 2007 (pre-2010) was missing some of the more enterprise scale features of a DMS, but even those features were not mandatory to consider that version a "true DMS" as typically defined unless third-party products were excluded from use.</div>
<div>
<br /></div>
<div>
The closest you can get to the original rumor while maintaining the truth is that "SharePoint is not <b>just </b>a true Document Management System." Even the terms "Document Management System" and "File Management System (FMS)" are outdated. "Enterprise Content Management System" (ECM, ECMS, or CMS) is now the preferred moniker to describe platforms that do more than just manage files and documents. SharePoint, being one of the most widely used ECMs, benefits from the fact that it also takes on collaboration, intranets, extranets, (WCM) web content management, workflow, insights, enterprise search, and <a href="http://rrfreeman.blogspot.com/2012/05/solution-architecture-to-sharepoint-or.html">more</a>. It does so while maintaining one of the largest ISV (partner) communities of any ECMS, including most of the other ECM vendors who are struggling to maintain their relevance by integrating with SharePoint and Office 365. <br />
<br />
This brings about the final argument against SharePoint, "it's not specialized only for document management, thus taking on too much and spreading too thin." I agree that if the entire SharePoint team focused on just the DMS side, then it would be more feature rich in that area. However, the true benefit of SharePoint over other DMSs is that it is a multi-tool that excels in many areas, each with fringe benefits to document management. This is one of the primary reasons for the mass migration from single-focus systems to broader platforms.</div>
<div>
<br /></div>
<div>
<b>Note:</b> The meaning of "true DMS" is subjective, therefore if you define a "true DMS" to include a specific limitation (ex: Must be able to render historical versions in search without exposing the versioned documents in a library or folder - SharePoint Limitation), then you can justify your claim. Just realize that anyone else can do the same to your preferred system (ex: Must provide secure co-authoring capabilities in a web-based note-taking client on MS, iOS, and Android mobile devices - available only with SharePoint).</div>
<div>
<br /></div>
<div>
<b>Feedback?</b></div>
<div>
<b><br /></b></div>
<div>
Please contribute comments below listing specific features that your favorite CMS has which SharePoint may not. I will do my best to provide feedback on its support within SharePoint.</div>
<div>
</div>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com1tag:blogger.com,1999:blog-7794506819107377134.post-45218960905153997382016-07-19T17:29:00.000-07:002016-07-22T16:25:43.925-07:00Restricted Edit Event Receiver - SharePoint 2013<strong>Scenario</strong><br />
<ul>
<li>You need to restrict edits to a document library based on the current value of a field.</li>
<li>Full trust farm solution for SharePoint 2013 scoped to Web.</li>
</ul>
<strong>Solution</strong><br />
<ul>
<li>I created a configurable event receiver that will restrict edits (metadata and content) based on the value in one of the document's metadata columns.</li>
<li>Additional feature: Delay implementation of the restriction for a number of seconds from Created Date to allow for additional automated processes to update new documents.</li>
<li>Additional feature: Exclude a document from the restriction based on a regular expression using its filename.</li>
<li>Additional feature: Automatically populate the Title field (or other text field) based on another choice or text field.</li>
<li>Open-Source code is available here: <a href="https://1drv.ms/u/s!AqJcbKYS1Ur5jYRouKgkz89wTVXwww">RestrictedSave ZIP</a></li>
<ul>
<li>Feel free to modify and use this code. You may not resell it or a modified version of it as part of a packaged solution without my permission.</li>
</ul>
<li>Disclaimer: This will only prevent edits that trigger the item updating event receiver. Some programmatic and 3rd party API calls made using bulk edit operations, workflow actions, or other event receivers may bypass the event receiver. In addition, this code is not hardened for high security scenarios and is only meant as a first line defense against unwanted typical user edits.</li>
</ul>
<div>
<strong>Installation</strong><br />
<ul>
<li>Download the <a href="https://1drv.ms/u/s!AqJcbKYS1Ur5jYRouKgkz89wTVXwww">RestrictedSave WSP</a> file and deploy to your farm.</li>
<li>Enable the Restricted Save feature on your sub-site.</li>
<ul>
<li>Feature Description:<br />Configured via the RestrictedSave list. If this site does not have one, a RestrictedSave list will be added. Document libraries named in the RestrictedSave list will not save a file if the user is unauthorized and the assigned column contains a certain value. If no required permission is specified, then the field can only be edited if the restricted column's value is changed. Multiple document libraries, columns, or values may be configured but must exist in this subsite. Optional New File Delay and Regular Expression Exclusion may be configured as well. Will also set the document title and/or filename based on a choice field by using the 'Title Choice Field' columns.</li>
</ul>
<li>Configure the RestrictedSave list that was added to the site according to your needs.</li>
</ul>
</div>
<div>
<strong>Example</strong><br />
<br />
<ul>
<li>A standard configuration of the RestrictedSave list to restrict edits on a document library named "RestrictDeleteTest" when the "LOBType" column is set to "Choice 1".</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://yhwtvq.by3301.livefilestore.com/y3mzgF78-6Udzae3yGN3J-s3abbMtqfnqPTSoEOu02pLlSUtBS1nlqltBQ84_Xg_q5GRKsgwzrreQ0lQcMOTj6NNnf6DWhdJ6Bo6BAqa1BlnE55FxpEhisewHFrNnHg5DLunf9LRp7aud28vhPk5S0zsw?width=1046&height=209&cropmode=none" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://yhwtvq.by3301.livefilestore.com/y3mzgF78-6Udzae3yGN3J-s3abbMtqfnqPTSoEOu02pLlSUtBS1nlqltBQ84_Xg_q5GRKsgwzrreQ0lQcMOTj6NNnf6DWhdJ6Bo6BAqa1BlnE55FxpEhisewHFrNnHg5DLunf9LRp7aud28vhPk5S0zsw?width=1046&height=209&cropmode=none" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ul>
<li>The resultant error displayed on a document's edit properties form in the "RestrictDeleteTest" library when a filename modification is attempted.</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://qyk6ya.by3301.livefilestore.com/y3mQv4AGzF-F0j2P-t2zkYW7YadPRig7Gv5SSL4u5_O9Yy3WzMAIGgAZcruNFjcOkAs88c352FbLwRwKd4Et282OOxZtDT95v-slKVtYXYnlTgujLonfQqgQ8xE9YlB50Ev65dzqt_abmblJ_DvtMfPrA?width=711&height=206&cropmode=none" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://qyk6ya.by3301.livefilestore.com/y3mQv4AGzF-F0j2P-t2zkYW7YadPRig7Gv5SSL4u5_O9Yy3WzMAIGgAZcruNFjcOkAs88c352FbLwRwKd4Et282OOxZtDT95v-slKVtYXYnlTgujLonfQqgQ8xE9YlB50Ev65dzqt_abmblJ_DvtMfPrA?width=711&height=206&cropmode=none" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ul>
<li style="text-align: left;">Error Message in clear text</li>
</ul>
<div style="text-align: left;">
UNABLE TO SAVE! -- When column "LOBType" is set to "Choice 1" the item is locked and cannot be updated. -- Please work from a new copy or change the column value.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<b><br /></b></div>
<br />
<strong><br /></strong>
<strong>RestrictedSave List Configurable Fields</strong><br />
<ul>
<li>Instructions are provided in-line on the form.</li>
<li>Add one line for each restriction. All lines will be parsed for each document edited in the sub-site.</li>
</ul>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://9kl1mg.by3301.livefilestore.com/y3mer_3E8faDVwLk27UYVzQpEnWOOle0r46Rp8QiSUplkaYUmpWb0Fih8rScv2tUmRQ831-JZJ123wSC7UR6A4rtKNIPgOdLzK2sGBFH_R4TYjBnhf0Te2guAr4A7ploONBod0-mYbGLbkX553uCLAfHg?width=579&height=768&cropmode=none" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://9kl1mg.by3301.livefilestore.com/y3mer_3E8faDVwLk27UYVzQpEnWOOle0r46Rp8QiSUplkaYUmpWb0Fih8rScv2tUmRQ831-JZJ123wSC7UR6A4rtKNIPgOdLzK2sGBFH_R4TYjBnhf0Te2guAr4A7ploONBod0-mYbGLbkX553uCLAfHg?width=579&height=768&cropmode=none" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
--------------------------------------------------------------------------------------</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
And again in text format for search-engines, visually impaired, and copy/paste:</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<table border="0" cellpadding="0" cellspacing="0" class="ms-formtable" style="margin-top: 8px; width: 100%px;"><tbody>
<tr><td class="ms-formlabel" nowrap="true" valign="top" width="113"><h3 class="ms-standardheader">
<nobr>Document Library Name<span class="ms-accentText" title="This is a required field."> *</span></nobr> </h3>
</td><td class="ms-formbody" valign="top" width="350"><!-- FieldName="Document Library Name"
FieldInternalName="Title"
FieldType="SPFieldText"
--> <span dir="none"><input class="ms-long ms-spellcheck-true" id="Title_fa564e0f-0c70-4ab9-b863-0177e6ddd247_$TextField" maxlength="255" title="Document Library Name Required Field" type="text" value="" /><br /></span> <span class="ms-metadata">The Name of the Document Library in this site where edits will be restricted.</span> </td></tr>
<tr><td class="ms-formlabel" nowrap="true" valign="top" width="113"><h3 class="ms-standardheader">
<nobr>Column Name</nobr> </h3>
</td><td class="ms-formbody" valign="top" width="350"><!-- FieldName="Column Name"
FieldInternalName="ColumnName"
FieldType="SPFieldText"
--> <span dir="none"><input class="ms-long ms-spellcheck-true" id="ColumnName_4b8a6e7d-ce15-4ce1-a543-f20667fe4af9_$TextField" maxlength="255" title="Column Name" type="text" value="" /><br /></span> <span class="ms-metadata">The name of a text or choice column in the library specified above whose value will determine if edits are restricted.</span> </td></tr>
<tr><td class="ms-formlabel" nowrap="true" valign="top" width="113"><h3 class="ms-standardheader">
<nobr>Column Value</nobr> </h3>
</td><td class="ms-formbody" valign="top" width="350"><!-- FieldName="Column Value"
FieldInternalName="ColumnValue"
FieldType="SPFieldText"
--> <span dir="none"><input class="ms-long ms-spellcheck-true" id="ColumnValue_992856b2-0232-4676-8a1c-3de8af9c8025_$TextField" maxlength="255" title="Column Value" type="text" value="" /><br /></span> <span class="ms-metadata">The value of the column specified above that enables restriced edits.</span> </td></tr>
<tr><td class="ms-formlabel" nowrap="true" valign="top" width="113"><h3 class="ms-standardheader">
<nobr>Required Permission To Edit</nobr> </h3>
</td><td class="ms-formbody" valign="top" width="350"><!-- FieldName="Required Permission To Edit"
FieldInternalName="RequiredPermission"
FieldType="SPFieldChoice"
--> <span dir="none"><table cellpadding="0" cellspacing="1" id="RequiredPermission_03cff327-535e-4131-837a-a730d18a965a_FillInTable"><tbody>
<tr><td><span title="Required Permission To Edit: Choose Option"><input checked="checked" id="RequiredPermission_03cff327-535e-4131-837a-a730d18a965a_DropDownButton" name="RequiredPermission_03cff327-535e-4131-837a-a730d18a965a_Radio" type="radio" value="DropDownButton" /></span><label class="ms-hidden" for="RequiredPermission_03cff327-535e-4131-837a-a730d18a965a_DropDownButton">Required Permission To Edit: Choose Option</label><select class="ms-RadioText" id="RequiredPermission_03cff327-535e-4131-837a-a730d18a965a_$DropDownChoice" title="Required Permission To Edit"><option value=""></option><option selected="selected" value=""></option><option value="DeleteListItems">DeleteListItems</option><option value="ApproveItems">ApproveItems</option><option value="ViewVersions">ViewVersions</option><option value="DeleteVersions">DeleteVersions</option><option value="CancelCheckout">CancelCheckout</option><option value="ManageLists">ManageLists</option><option value="AddAndCustomizePages">AddAndCustomizePages</option></select></td></tr>
<tr><td><span class="ms-RadioText" title="Required Permission To Edit: Specify your own value:"><input id="RequiredPermission_03cff327-535e-4131-837a-a730d18a965a_FillInButton" name="RequiredPermission_03cff327-535e-4131-837a-a730d18a965a_Radio" type="radio" value="FillInButton" /><label for="RequiredPermission_03cff327-535e-4131-837a-a730d18a965a_FillInButton">Specify your own value:</label></span></td></tr>
<tr><td> <input id="RequiredPermission_03cff327-535e-4131-837a-a730d18a965a_$FillInChoice" maxlength="255" tabindex="-1" title="Required Permission To Edit: Specify your own value:" type="text" value="" /></td></tr>
</tbody></table>
</span> <span class="ms-metadata">The permission level of a user who can edit a restricted item. If this is left blank, a restricted item can only be edited when changing the column to a non-restricted value. Fill-in values can be any of the SPBasePermissions enumeration values. Typical value is: ApproveItems.</span> </td></tr>
<tr><td class="ms-formlabel" nowrap="true" valign="top" width="113"><h3 class="ms-standardheader">
<nobr>New Item Delay Seconds</nobr> </h3>
</td><td class="ms-formbody" valign="top" width="350"><!-- FieldName="New Item Delay Seconds"
FieldInternalName="NewItemDelaySeconds"
FieldType="SPFieldNumber"
--> <span dir="none"><input class="ms-input" id="NewItemDelaySeconds_fe9302f3-7e42-4a86-ae09-4fbfb6656065_$NumberField" size="11" title="New Item Delay Seconds" type="text" value="" /><br /></span> </td></tr>
<tr><td class="ms-formlabel" nowrap="true" valign="top" width="113"><h3 class="ms-standardheader">
<nobr>Title Exclusion Regex</nobr> </h3>
</td><td class="ms-formbody" valign="top" width="350"><!-- FieldName="Title Exclusion Regex"
FieldInternalName="TitleExclusionRegex"
FieldType="SPFieldText"
--> <span dir="none"><input class="ms-long ms-spellcheck-true" id="TitleExclusionRegex_ef88a7f0-4975-489d-b94a-32e0b184076e_$TextField" maxlength="255" title="Title Exclusion Regex" type="text" value="" /><br /></span> <span class="ms-metadata">Regular Expression that will exclude a file/item from the restriction. If the item is a document this will compare against the Filename, otherwise it will compare against the Title. Ex: To exclude files of format [filename_copy.docx] use: .*_copy\..* </span> </td></tr>
<tr><td class="ms-formlabel" nowrap="true" valign="top" width="113"><h3 class="ms-standardheader">
<nobr>Title Choice Field Name</nobr> </h3>
</td><td class="ms-formbody" valign="top" width="350"><!-- FieldName="Title Choice Field Name"
FieldInternalName="TitleChoiceFieldName"
FieldType="SPFieldText"
--> <span dir="none"><input class="ms-long ms-spellcheck-true" id="TitleChoiceFieldName_5a6ad44e-2835-4628-a94a-d379cc060468_$TextField" maxlength="255" title="Title Choice Field Name" type="text" value="" /><br /></span> <span class="ms-metadata">Field name of the column that will be used to set the title or other field (based on Title Choice Target)</span> </td></tr>
<tr><td class="ms-formlabel" nowrap="true" valign="top" width="113"><h3 class="ms-standardheader">
<nobr>Title Choice Target</nobr> </h3>
</td><td class="ms-formbody" valign="top" width="350"><!-- FieldName="Title Choice Target"
FieldInternalName="TitleChoiceTarget"
FieldType="SPFieldChoice"
--> <span dir="none"><table cellpadding="0" cellspacing="1" id="TitleChoiceTarget_f10b5e00-a485-42c2-bb8b-8db114ee507a_FillInTable"><tbody>
<tr><td><span title="Title Choice Target: Choose Option"><input checked="checked" id="TitleChoiceTarget_f10b5e00-a485-42c2-bb8b-8db114ee507a_DropDownButton" name="TitleChoiceTarget_f10b5e00-a485-42c2-bb8b-8db114ee507a_Radio" type="radio" value="DropDownButton" /></span><label class="ms-hidden" for="TitleChoiceTarget_f10b5e00-a485-42c2-bb8b-8db114ee507a_DropDownButton">Title Choice Target: Choose Option</label><select class="ms-RadioText" id="TitleChoiceTarget_f10b5e00-a485-42c2-bb8b-8db114ee507a_$DropDownChoice" title="Title Choice Target"><option value=""></option><option selected="selected" value=""></option><option value="Title">Title</option></select></td></tr>
<tr><td><span class="ms-RadioText" title="Title Choice Target: Specify your own value:"><input id="TitleChoiceTarget_f10b5e00-a485-42c2-bb8b-8db114ee507a_FillInButton" name="TitleChoiceTarget_f10b5e00-a485-42c2-bb8b-8db114ee507a_Radio" type="radio" value="FillInButton" /><label for="TitleChoiceTarget_f10b5e00-a485-42c2-bb8b-8db114ee507a_FillInButton">Specify your own value:</label></span></td></tr>
<tr><td> <input id="TitleChoiceTarget_f10b5e00-a485-42c2-bb8b-8db114ee507a_$FillInChoice" maxlength="255" tabindex="-1" title="Title Choice Target: Specify your own value:" type="text" value="" /></td></tr>
</tbody></table>
</span> <span class="ms-metadata">Fields to be autopopulated using the 'Title Choice Field Name' column value. Fill in a value to populate a field other than Title.</span></td></tr>
</tbody></table>
</div>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com3tag:blogger.com,1999:blog-7794506819107377134.post-11179385079968038982016-07-07T18:59:00.000-07:002016-07-22T16:27:05.204-07:00Hacking the Datasheet View / Quick Edit in SharePoint 2013 to display in an IFrame<strong>Scenario</strong><br />
<ul>
<li>I created a document library list view in datasheet (quick edit) mode for display in a custom popup dialog in a SharePoint 2013 Visual Studio project "application page".</li>
<ul>
<li>This grid was used to make last minute changes to metadata values of selected items before continuing an existing process in a larger solution.</li>
</ul>
<li>I needed to display the list view using an IFrame pointing to a URL filtering the values by IDs.</li>
<li>This was a large list exceeding the list view threshold</li>
<li>I needed to hide all chrome, navigation, ribbon, and other elements surrounding the list view web part.</li>
<li>I needed to call a JavaScript function outside the list view page from a button on the list view page.</li>
<li>Note that I couldn't figure out how to convert the application page into a web part page which is why the list view web part is included via an IFrame rather than embedded directly into the page, however the same issues would apply except without the need for a hidden button or the chrome trimming.</li>
<li>An alternative to using the list view web part in datasheet mode would be to use a datagrid control and manage the CRUD programatically, but this would be harder to maintain if the SharePoint schema changed down the line and would require much more coding to implement correctly.</li>
</ul>
<strong>Issues</strong><br />
<ul>
<li>In Datasheet view the last record edited (or possibly the only record) will only save if you select another record (which you can't even do if there's only one record). This was an issue for 2 reasons:</li>
<ul>
<li>There was a custom button in the app that when clicked would continue the process without saving the record that was just edited.</li>
<li>The stop editing functionality which would normally be used to save the last record resulted in a list view threshold error dialog due to a bug in the datagrid / Quick Edit mode when in a folder or using filter parameters and using the "Stop editing this list" link because it forwards to a standard view without the filter or folder.</li>
</ul>
</ul>
<strong>Resolution</strong><br />
<ul>
<li>Implementing the IFrame: A bug in Visual Studio .Net 4.5 framework IFrame web control requires the control to be instantiated manually in the code behind rather than automatically in the designer code file</li>
</ul>
protected global::System.Web.UI.HtmlControls.HtmlGenericControl iframe1;<br />
<ul>
<li>The IFrame was added to the application page like so:</li>
</ul>
<iframe name="iframe1" id="iframe1" ClientIDMode="Static" runat="server" height="400" width="400" seamless" /><br />
<ul>
<li>The IFrame was instantiated dynamically using server side code that set the filter parameters in the query string like so (itemids are in a semicolon delimited format):</li>
</ul>
iframe1.Attributes["Src"] = "/sites/SiteName/LibraryName/Forms/DatasheetViewName.aspx?IsDlg=1&FilterName=ID&FilterMultiValue=" + itemids;<br />
<ul>
<li>I hid a button (id = btnCopy style:display = none) on the application page which ran the application code and added the following JavaScript function to the application page so that it could be called from the list view page from within the IFrame. Note the timed delay here as I'll explain this later.</li>
</ul>
<div>
<script type="text/javascript"></div>
<div>
function triggerBtnCopyClick() {</div>
<div>
setTimeout(function () { document.getElementById('btnCopy').click(); }, 1200); </div>
<div>
}</div>
<div>
</div>
<div>
.... existing code used by the application page that handled the btnCopy click event.</div>
<div>
</script></div>
<div>
<ul>
<li>I added a script editor web part to the Datasheet List View page and configured it to remove the chrome elements still remaining after IsDlg=1 did its work. Note that your class names may be different based on the WPQ number (find using your browser's developer tools).</li>
<ul></ul>
</ul>
<div>
<style></div>
<div>
#s4-ribbonrow{display: none;}</div>
<div>
#Hero-WPQ2{display: none;}</div>
<div>
#CSRListViewControlDivWPQ2{display:none;}</div>
<div>
</style></div>
</div>
<div>
<ul>
<li>Finally, I added the button and code to call the parent page's triggerBtnCopyClick code. You will need to find the GUID of your list view web part (webpartid) and plug it into the code.<br />This is the part that involved hacking the datasheet view by finding the function calls the "Stop editing this list" button used to save the final changes and reusing them in my own code. The downside to this is that the grid needs to be refreshed afterwards and takes a second to finish processing so I added a 1200ms delay into the triggerBtnCopyClick function above that processes the code after the save.</li>
</ul>
<div>
<input type="button" id="SaveEdits" value="Save and Process" onclick="var gridInitInfo = g_SPGridInitInfo[('{WebPartID GUID HERE}')]; var ganttControl = window[gridInitInfo.controllerId]; var ganttControl = window[gridInitInfo.controllerId]; ganttControl.TryDispose(function(dlgReturnValue) {window.location.reload(false);}); this.style.display = 'none'; window.parent.triggerBtnCopyClick(); return false" /></div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-13025951628279844352016-06-01T16:45:00.003-07:002016-06-01T17:03:50.292-07:00SharePoint End Date on Workday using a Holiday List<strong>Scenario</strong><br />
<ul><li>Typical scenario where you need to add a certain number of days to a start date and set the due date to a working day (Ex: service window). Note that this is not "number of working days". It is "the next working day after X days".</li>
<li>You can easily adapt this code to provide the last working day before X days.</li>
<li>The working day must bypass weekends and holidays.</li>
<li>You have a Holidays list in SharePoint that you can query.</li>
<ul><li>The Holidays list uses the out of the box "<b>Holiday</b>" list content type.</li>
<ul><li>Note: In code, the "<b>Holiday</b>" "<b>Date</b>" field's internal name is "<b>V4HolidayDate</b>"</li>
</ul></ul><li>You need to add some code to an event receiver or custom workflow action to get this date.</li>
</ul><strong>Solution</strong><br />
<ul><li>This was coded for SharePoint 2013 but should work for other versions<br />
<br />
<pre class="CICodeFormatter"><code class="CICodeFormatter"> protected void MAIN_FUNCTION()
{
DateTime startdate = Convert.ToDateTime(START_DATE_VALUE).Date;
DateTime finaldate = startdate.AddDays(Convert.ToInt16(FINAL_DATE_VALUE));
SPList holidayLibrary = web.GetList("/Lists/Holidays");
Int16 CurrentHolidayIndex = 0;
SPQuery query = new SPQuery();
query.Query = string.Concat(
"<Where><And><Geq>",
"<FieldRef Name='V4HolidayDate'/>",
"<Value Type='DateTime'>", SPUtility.CreateISO8601DateTimeFromSystemDateTime(finaldate) , "</Value>",
"</Geq><Leq>",
"<FieldRef Name='V4HolidayDate'/>",
"<Value Type='DateTime'>", SPUtility.CreateISO8601DateTimeFromSystemDateTime(finaldate.AddDays(14)), "</Value>",
"</Leq></And></Where>",
"<OrderBy>",
"<FieldRef Name='Date' Ascending='FALSE' />",
"</OrderBy>");
query.ViewFields = "<FieldRef Name='V4HolidayDate' />";
query.ViewFieldsOnly = true;
//Limited to 14 days of continuous holidays
while (IsWeekend(finaldate) || IsHoliday(finaldate, holidays, ref CurrentHolidayIndex))
{
finaldate = finaldate.AddDays(1);
}
OUTPUT_FIELD_VALUE = finaldate.ToShortDateString();
}
bool IsWeekend(DateTime date)
{
if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) return true;
return false;
}
bool IsHoliday(DateTime date, SPListItemCollection holidays, ref Int16 holidayIndex)
{
for (; holidayIndex < holidays.Count; holidayIndex++)
{
DateTime holiday = Convert.ToDateTime(holidays[holidayIndex]["V4HolidayDate"]);
if (date == holiday) return true;
if (holiday > date) break; //stop checking once we pass the current date
}
return false;
}
</fieldref></code></pre><br />
</li>
</ul>RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-30402575107458631972016-03-08T10:21:00.005-08:002016-03-08T10:24:18.281-08:00SharePoint Online (Office 365) or On-PremisesGartner released this article on the basic considerations between Office 365 and On-Premises SharePoint.<br />
<br />
<a href="http://www.gartner.com/doc/reprints?id=1-2NJQJ9N&ct=150922&st=sb">How to Decide Between Microsoft SharePoint On-Premises or Online</a>RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-82278398571737706232016-01-16T00:41:00.001-08:002016-01-16T00:41:06.967-08:00VoteMatrix Mobile Phone Stand - Kickstarter just released<strong>Cellphone stand</strong><br />
<ul>
<li>Check out our newly released project on <a href="https://www.kickstarter.com/projects/161313045/votematrix-mobile-phone-stand-keychain-corporate-g">Kickstarter</a></li>
</ul>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrKZXSdrO4d5GC92-saYPq56XonlbhJf4H2rvg_TwV_nrC59H__LZEoDL3rKtViASkU5ZtuwPllCNC6PJZ-Pkm646W1n7pWJqK8enAkgTrp2CSRx_iWVkFjL_8miNhKGyPMPA7bdtvE_o/s1600/Keychain+Kickstand+with+Device+and+Photos.jpg" imageanchor="1"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrKZXSdrO4d5GC92-saYPq56XonlbhJf4H2rvg_TwV_nrC59H__LZEoDL3rKtViASkU5ZtuwPllCNC6PJZ-Pkm646W1n7pWJqK8enAkgTrp2CSRx_iWVkFjL_8miNhKGyPMPA7bdtvE_o/s320/Keychain+Kickstand+with+Device+and+Photos.jpg" width="320" /></a></div>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-35726267876127209332015-11-19T18:52:00.000-08:002015-11-19T18:52:01.797-08:00Microsoft finally commits to integrating Office 365 with Dynamics LOB apps.Here is an article on the recent press release:<br />
<a href="http://www.networkworld.com/article/3005303/cloud-computing/how-microsoft-is-changing-its-strategy-with-dynamics.html">http://www.networkworld.com/article/3005303/cloud-computing/how-microsoft-is-changing-its-strategy-with-dynamics.html</a><br />
<br />
Here is my original post on the problem and solution:<br />
<a href="http://rrfreeman.blogspot.com/2015/03/crm-and-xrm-vs-sharepoint-for-business.html">http://rrfreeman.blogspot.com/2015/03/crm-and-xrm-vs-sharepoint-for-business.html</a>RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-44893528484824943252015-11-03T16:08:00.002-08:002015-11-03T16:10:31.466-08:00SharePoint Saturday, Sacramento, 11/7/2015<strong>My Presentation</strong><br />
<ul>
<li><a href="http://www.spsevents.org/city/Sacramento/Sacramento2015/_layouts/15/SPSEvents/Speakers/Session.aspx?ID=43">SharePoint Notifications: Migration, testing and upgrades communication strategy</a></li>
<ul>
<li><strong>Abstract</strong><br />Robert Freeman recently coordinated SharePoint upgrades and governance for 2 of the State of California's largest public agencies. This session will go over some of the tools that were developed to implement the communication strategy and make the process run smoother for all. Links will be provided for a <a href="http://rrfreeman.blogspot.com/2015/04/sharepoint-migration-and-administration.html">free download</a> of the tool and you will get the opportunity to discuss migration, architecture, and upgrade strategy. </li>
<li><a href="http://1drv.ms/1LWCDgO">Link to Presentation</a></li>
</ul>
</ul>
<strong>Conference Link</strong><br />
<ul>
<li><a href="http://www.spsevents.org/city/sacramento/sacramento2015">SharePoint Saturday Sacramento Homepage</a></li>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-55242971309315626592015-08-12T19:23:00.002-07:002015-11-03T16:03:31.791-08:00SharePoint ParameterBinding the DateTime Control<strong>Scenario</strong><br />
<ul>
<li>You have a custom form providing values to an XsltListViewWebPart or similar List View Web Part that supports ParameterBinding.</li>
<li>You need to provide a date picker control and would like to use the standard SharePoint control. You only need the date, not time.</li>
<li>You are using SharePoint Designer and may not have access to code blocks or other server side code.</li>
<li>You are using the ParameterBinding in a CAML Query or similar.</li>
</ul>
<strong>Issue</strong><br />
<ul>
<li>The SharePoint date picker control is easy enough to add directly to a SharePoint aspx page, but accessing the values from the Form or Control ParameterBindings are not straightforward.</li>
</ul>
<strong>Resolution</strong><br />
<ul>
<li>Add JQuery and JQuery formatDateTime libraries to the page you are working on if they're not already included in your master page.</li>
<ul>
<li>Example where you have downloaded the jquery and formatDateTime files to the root Style Library: <br />
<pre class="code"><script language="javascript" type="text/javascript" src="/Style%20Library/Scripts/jquery-1.11.3.min.js"></script>
<script language="javascript" type="text/javascript" src="/Style%20Library/Scripts/jquery.formatDateTime.min.js"></script></pre>
</li>
</ul>
<li>Add the DateTime control followed by a standard TextBox element with the Same ID + "Value". </li>
<ul>
<li>This extra TextBox control will be used to pass the value to the ParameterBinding and should be hidden. You should specify the date you wish to use when a blank is entered (be sure to change both). The OnValueChangeClientScript property is used to call the JavaScript function you will add next.</li>
<li>Example:
<pre class="code"><SharePoint:DateTimeControl runat=server id="publishDateStart" OnValueChangeClientScript="spDateChanged('publishDateStart', '1901-01-01');" DateOnly="True"></SharePoint:DateTimeControl>
<asp:textbox id="publishDateStartValue" runat="server" style="display: none;">1901-01-01</asp:textbox></pre>
</li>
</ul>
<li>Add the following JavaScript code. This converts the DateTime control's date format to the format required by your XSLT CAML query and stores it in your hidden textbox. It also swaps in a date for a blank.</li>
<ul>
<li> Code:<pre class="code"><script type="text/javascript">
function spDateChanged(id, blankdate) {
var datetimeID = '"_' + id + '_' + id + 'Date"';
var dateSelected = $('[id$=' + datetimeID + ']:first');
var dateSelectedValue = $('[id$="' + id + 'Value"]:first');
if (dateSelected[0].value == "")
{
dateSelectedValue[0].value = blankdate
}
else
{
dateSelectedValue[0].value = $.formatDateTime('yy-mm-dd', new Date(dateSelected[0].value));
}
}
</script>
</pre>
</li>
</ul>
<li>Set your ParameterBinding element to the TextBox Control's ID</li>
<ul>
<li>Example: <pre class="code"><parameterbinding defaultvalue="" location="Control(publishDateStartValue)" name="AdoptedFrom"></parameterbinding> </pre>
</li>
</ul>
<li>Note that this example does not include the time elements since it was not needed in my use case and would add in some extra complexity to the function above. This was written for a 2010 SharePoint Server.</li>
<li>Also note that typed in entries need to be in the "m/d/yyyy" format. Example: 1/1/2015</li>
<ul><div>
</div>
<div>
</div>
</ul>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com1tag:blogger.com,1999:blog-7794506819107377134.post-73305489917522111742015-05-13T11:17:00.000-07:002015-06-01T02:50:24.479-07:00SharePoint Saturday, Silicon Valley, 5/30/2015<strong>My Presentation</strong><br />
<ul>
<li><a href="http://www.spsevents.org/city/SiliconValley/SiliconValley2015/_layouts/15/SPSEvents/Speakers/Session.aspx?SpeakerId=284&ID=48&source=http%3a%2f%2fwww.spsevents.org%2fcity%2fSiliconValley%2fSiliconValley2015%2f_layouts%2f15%2fSPSEvents%2fSpeakers%2fSpeaker.aspx%3fID%3d284%26IsDlg%3d1">SharePoint Notifications: Migration, testing and upgrades communication strategy</a></li>
<ul>
<li><strong>Abstract</strong><br />Robert Freeman coordinated SharePoint upgrades and governance for 2 of the State of California's largest public agencies. This session will go over some of the tools that were developed to implement the communication strategy and make the process run smoother for all. Links will be provided for a <a href="http://rrfreeman.blogspot.com/2015/04/sharepoint-migration-and-administration.html">free download</a> of the tool and you will get the opportunity to discuss migration, architecture, and upgrade strategy. </li>
<li><a href="http://1drv.ms/1LWCDgO">Link to Presentation</a></li>
</ul>
</ul>
<strong>Conference Link</strong><br />
<ul>
<li><a href="http://www.spsevents.org/city/siliconvalley/siliconvalley2015">SharePoint Saturday Silicon Valley Homepage</a></li>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com0tag:blogger.com,1999:blog-7794506819107377134.post-31453270263809860862015-05-04T22:07:00.000-07:002015-05-08T09:58:15.961-07:00My MS Ignite 2015<span style="font-size: large;"><strong>Day 1 - Monday</strong></span><br />
<ul>
<li><strong>Keynote</strong> (~23,000 attendees)</li>
<ul>
<li>SharePoint 2016 release not mentioned in the keynote!</li>
<li>No mention of the SharePoint brand even though several new Office 365 SharePoint features were demoed</li>
<ul>
<li>Does this mean MS is splitting off the SharePoint brand into its cloud use-cases: Office 365, Sites, OneDrive, Search, Delve, etc.?</li>
</ul>
<ul>
<ul>
<li>Will SharePoint end up being rebranded as "Office 365 On-Prem"?</li>
</ul>
<li>Or possibly an indicator of a lack-luster SharePoint 2016 release?</li>
</ul>
<li>Best newly demoed SharePoint/Outlook feature is the new email integration with attach file links integrated into Azure groups and SharePoint security</li>
<li>Best Windows 10 demos were the Cortana Power BI demo and the facial recognition login demo</li>
<li>Other stuff:</li>
<ul>
<li>Skye for Business, Threat Analytics, Ops Management Suite, Azure Stack On-Premises, Windows Update changes, and the Surface Hub</li>
</ul>
</ul>
<li>
<strong>Evolution of SharePoint: Overview and Roadmap</strong> (over-capacity including overflow room)</li>
<ul>
<li>SharePoint 2016 = Office 365 On Premises</li>
<ul>
<li>Basically most of what is already on or is coming to Office 365 SharePoint will now be made available on premises</li>
</ul>
<li>Deployment wizard will allow deployment by Role</li>
<ul>
<li>WFE, App, Search, etc.</li>
</ul>
<li>Delve will be made available to SharePoint 2013 on-prem (soon?) </li>
</ul>
</ul>
<strong><span style="font-size: large;">Day 2 - Tuesday</span></strong><br />
<ul><strong></strong>
<li><strong>Power BI</strong></li>
<ul>
<li>Live Dashboards</li>
<ul>
<li>Drill into data</li>
<li>Ad-hoc BI</li>
</ul>
<li>Power BI Designer (client app)</li>
<ul>
<li>Preview release version
</li>
</ul>
<li>
On-Prem Data Sources</li>
<ul>
<li>Scheduled Refresh or Analysis Services Live Query</li>
</ul>
<li>API for data pushes / live monitoring</li>
<ul>
<li>Demoed mobile phone accelerometer data live reporting</li>
<ul>
<li>App used API to send data directly to dashboard</li>
</ul>
</ul>
</ul>
<li><strong>Transforming your SharePoint Full Trust Code to the Office App Model</strong></li>
<ul>
<li>Branding</li>
<ul>
<li>Why brand collab sites?</li>
<li>Leverage Office 365 Themes</li>
<li>SharePoint Themes</li>
<li>CDM instead of Site Assets to avoid caching/blob cache issues</li>
<li>Use alternate CSS and javascript instead of modifying master pages when possible</li>
</ul>
<li>Provisioning</li>
<ul>
<li>App/add-ins</li>
<li>Scripting</li>
<li>PnP Provisioning Engine</li>
<ul>
<li>Security</li>
<li>Fields</li>
<li>TermGroups</li>
<li>Lists</li>
<li>Pages</li>
<li>Files</li>
<li>ComposedLook</li>
<li>Apply-SPOProvisioningTemplate</li>
<ul>
<li>Will provision new items only, no updates</li>
</ul>
</ul>
</ul>
<li>Sandboxed Solutions</li>
<ul>
<li>Still deprecated, should continue to n bb work in 2016</li>
</ul>
<li>Script parts</li>
<ul>
<li>Embedded javascript (node/jquery)</li>
</ul>
<li>Office 365 App Model</li>
<ul>
<li>Mail, contacts, lists, libraries, and other Office 365 features</li>
<li>Standalone apps interface for ez app launch</li>
</ul>
</ul>
</ul>
<strong><span style="font-size: large;">Day 3 - Wednesday</span></strong><br />
<ul>
<li><strong>NanoServer </strong></li>
<ul>
<li>Preview bits available</li>
<li>No UI at all</li>
<li>Remote Powershell and Managemen Console support</li>
<ul>
<li>Limited cmdlet support, no local workflows</li>
</ul>
<li>Clustering and HyperV supported</li>
<li>Fast boot, minimal services running</li>
<li>Graphical remote management web based tool demoed</li>
<ul>
<li>Works on all versions of Windows server</li>
<li>Process Manager</li>
<li>PowerShell window</li>
<li>System Settings</li>
<li>Device Manager</li>
<li>Event Viewer</li>
</ul>
<li>ServerCore will be renamed to Server</li>
<li>Full Server/Server with a GUI will be renamed to Client</li>
<ul>
<li>Not allowed in containers</li>
</ul>
<li>Visual studio server apps targeted to either Server or Nano, not Client</li>
<li>Nano is simply a subset of Server, full compatibility for all features that are in both</li>
<ul>
<li>You select features and drivers at deployment</li>
</ul>
<li>Demo of Chef deployment to Nano with Ruby, Python, and C# components</li>
<li>More videos on channel 9</li>
<li>Reduces attack surface and maintenance requirements</li>
<ul>
<li>Fewer services, memory usage, patches, reboots</li>
<li>.4GB footprint compared to 4.84GB</li>
</ul>
<li>No MSI support</li>
<ul>
<li>Nano Server installer in the works</li>
</ul>
</ul>
<li><strong>CRM Online and Office 365: What's New</strong></li>
<ul>
<li>Integration Points</li>
<ul>
<li>Outlook/Exchange</li>
<ul>
<li>Email folder mapping of metadata</li>
<li>Create entities from email</li>
</ul>
<li>Excel</li>
<li>Power BI</li>
<li>OneNote</li>
<li>Office 365</li>
<ul>
<li>Groups integration</li>
</ul>
<li>OneDrive</li>
<li>SharePoint</li>
<li>Yammer</li>
<li>Skype</li>
<li>Skype for Business</li>
</ul>
</ul>
<li><strong>Office 365 Groups -Eric Zenz</strong></li>
<ul>
<li>Office 365 Group = SharePoint Site Collection</li>
<li>Outlook and Office App integrations</li>
<li>Groups include</li>
<ul>
<li>Files</li>
<li>Group Notebook</li>
<li>Shared with us feed</li>
<li>Recycle Bin</li>
<li>Pages</li>
</ul>
<li>Delve provides insights into groups</li>
<li>Future planned feature: Link groups to existing SharePoint sites</li>
<li>Discovery works across group mail and group viles</li>
<li>Coming in 2015</li>
<ul>
<li>Guests membership</li>
<li>Dynamic membership</li>
<li>Data Leakage Prevention (DLP)</li>
<li>Quota management</li>
<li>Soft-delete</li>
</ul>
<li>Graph REST endpoint</li>
</ul>
<li><strong>Line of Business Dev on Dynamics CRM</strong> (small room)</li>
<ul>
<li>Dynamics CRM</li>
<ul>
<li>Line of business and Customer Engagement</li>
<li>Solution development</li>
<ul>
<li>Relationship</li>
<li>Process</li>
<li>Interaction</li>
<li>LOB</li>
</ul>
<li>Giving campaign demo</li>
<ul>
<li>Theme</li>
<li>Personalized</li>
<li>Navigation</li>
<li>Office 365 Integration</li>
<li>Configurable</li>
<li>Social and Collaborative</li>
<li>Mobile Ready</li>
<li>Customizable Search</li>
<li>Secured</li>
<li>Analytical</li>
</ul>
</ul>
<li>Build, Integrate, Manage</li>
</ul>
</ul>
<strong><span style="font-size: large;">Day 4 - Thursday</span></strong><br />
<ul>
<li><strong>Best Practices for Design and Performance in SharePoint Online</strong></li>
<ul>
<li>Branding Impact</li>
<ul>
<li>Low Impact</li>
<li>High Impact</li>
</ul>
<li>Responsive Web Design</li>
<ul>
<li>Limited support for some common collaboration site features</li>
<ul>
<li>Ex: Gantt charts</li>
</ul>
</ul>
<li>Composed Looks (Themes)</li>
<li>Design Manager</li>
<ul>
<li>Converts HMTL to Masterpage automatically</li>
</ul>
<li>Custom Branding</li>
<ul>
<li>Use a starter masterpage</li>
<li>Layout with html css and imagers</li>
<li>Add SP Controls</li>
</ul>
<li>Performance considerations</li>
<ul>
<li>Image sizes</li>
<li>SharePoint Online caching less reliable due to number of servers</li>
<li>Demo of custom rollup nav delaying page load</li>
</ul>
<li>Custom Masterpages will continue to be supported</li>
<ul>
<li>Make sure to stay up to date with MS improvements</li>
</ul>
</ul>
<li><strong>Deploying Yammer</strong></li>
<ul>
<li>Levi Strauss+</li>
<li>Yammer Embed</li>
<li>My Feed</li>
<li>
Group Feeds</li>
<li>Liking</li>
<li>Sharing</li>
<li>Following</li>
</ul>
</ul>
<strong><span style="font-size: large;">Day 5 - Friday</span></strong><br />
<ul>
<li>BCS to SQL hybrid</li>
<ul>
<li>OData service on-prem exposes SQL data</li>
</ul>
<li>Search hybrid</li>
<ul>
<li>Search center on-prem or online</li>
</ul>
<li>Security</li>
<ul>
<li>AD sync</li>
<li>DirSync server</li>
<ul>
<li>Claims from User Profile Sync Service</li>
<li>Config steps</li>
<ul>
<li>Add on prem domain to tenant</li>
<li>Activate DirSync in your tenant</li>
<li>Update DNS records</li>
<li>Run DirSync wizard and start sync</li>
<li>Check users and groups in Tenant Admin</li>
<li>Activate and License users</li>
</ul>
<li>Validate synchronization</li>
<ul>
<li>DirSync Troubleshooter App</li>
</ul>
</ul>
<li>Azure AD Proxy on-prem manages ACS (Access Control Services) Trust</li>
<li>ADFS + ADFS Proxy for single sign-on</li>
<li>Configuring S2S</li>
<ul>
<li>Replace STS Cert on all farms</li>
<li>Install S Sign in assistant and azure PowerShell</li>
<li>Register on-prem STS as Service Principle in 0365</li>
<li>Add SPN for on-prem domain</li>
<li>Register 0365 app principal as trusted provider</li>
<li>Set the auth realm on prem</li>
</ul>
<li>Validate User Profile Service App</li>
<li>Search Validation</li>
<ul>
<li>Result Source</li>
<ul>
<li>ECB menu, click test source</li>
</ul>
<li>Query builder</li>
<ul>
<li>From Query Rules</li>
</ul>
<li>Investigation</li>
<ul>
<li>Partitioned search service or proxy not supported in hybrid</li>
<ul>
<li>Fix: IgnoreTenatization</li>
</ul>
<li>400, 401, 403, 500 errors</li>
</ul>
</ul>
<li>BCS Validation</li>
</ul>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com8McCormick Place, Chicago, IL, USA41.850304740221659 -87.61883314154516741.848826240221662 -87.621354641545167 41.851783240221657 -87.616311641545167tag:blogger.com,1999:blog-7794506819107377134.post-25243951583774871522015-04-09T17:55:00.002-07:002015-11-07T04:02:52.484-08:00SharePoint Migration and Administration Notification Tool<strong>Scenario</strong><br />
<ul>
<li>You are performing an administrative change at the SharePoint site level or for all sub-sites starting at a particular location</li>
<ul>
<li>Examples</li>
<ul>
<li>Migration</li>
<li>Retention, Archival or Deletion</li>
<li>Redesign</li>
<li>User Acceptance Testing (UAT)</li>
<li>Upgrade</li>
<li>Restructure</li>
<li>Merge</li>
</ul>
</ul>
<li>You need to convey the administrative status to all users on the site</li>
<ul>
<li>Likely as part of your SharePoint administrative communications plan</li>
<ul></ul>
</ul>
</ul>
<strong>Issue</strong><br />
<ul>
<li>There is no simple or easy out of the box way to accomplish this</li>
<li>We don't want to manually replicate notifications on each sub-site, modify the master pages, or configure content roll-ups on each site</li>
</ul>
<strong>Solution</strong><br />
<ul>
<li>I developed the SharePoint Migration Notification Tool specifically for this purpose</li>
<ul>
<li>Download <strong>SharePointMigrationNotification.wsp</strong> for deployment at the Site Collection level on a SharePoint on-premises farm</li>
<ul>
<li><a href="http://1drv.ms/1abZt6X">SharePoint 2010 Version</a></li>
<li><a href="http://1drv.ms/1QkPJJu">SharePoint 2013 Version</a></li>
</ul>
<li><a href="https://technet.microsoft.com/en-us/library/ff607552.aspx">Add</a> and <a href="https://technet.microsoft.com/en-us/library/ff607534.aspx">Install</a> the WSP file you downloaded</li>
<li><a href="https://support.office.com/en-us/article/Enable-or-disable-site-collection-features-A2F2A5C2-093D-4897-8B7F-37F86D83DF04">Enable the site collection feature</a> named "Migration Notification" on each site collection</li>
<li>Add a list to the root site for each site collection. Select the "Migration Notification URLs" list template (found under Blank & Custom list types)</li>
<ul>
<li>You can name this whatever you like, but you should only have 1 of these lists at the site collection root because the tool uses the first one it finds</li>
</ul>
</ul>
<li>Here are some examples of the default notifications you can configure</li>
<ul>
<li>You can also add your own custom notification messages</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdEkq8A_h7hLKJq2RbIyV0hr9HNYFKDmOLrrF2mor4nol5vw_ZP4to6ytopZnDu-A3r_F5FJ9RSFMayVcIhwStzvulkmHRvoQj-MyBkOdO9D9WaNdbpe-nPOHcIOmw0qxGK2x1e8lKl68/s1600/DeletionFlag.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="39" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdEkq8A_h7hLKJq2RbIyV0hr9HNYFKDmOLrrF2mor4nol5vw_ZP4to6ytopZnDu-A3r_F5FJ9RSFMayVcIhwStzvulkmHRvoQj-MyBkOdO9D9WaNdbpe-nPOHcIOmw0qxGK2x1e8lKl68/s1600/DeletionFlag.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgatTm0Yn3za4rynUmPI4YoPTWA89X4z2nSVVbQ_D4zogbKPpQ2-59ylUEByBr5JBLjgtq7cgAQNt10axQoi7wqX2iWf3Nw4E08Dvo7KtgnAHyENq85V-44b4wDi9EXo1oatupD2kd0HZw/s1600/Migrated.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="48" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgatTm0Yn3za4rynUmPI4YoPTWA89X4z2nSVVbQ_D4zogbKPpQ2-59ylUEByBr5JBLjgtq7cgAQNt10axQoi7wqX2iWf3Nw4E08Dvo7KtgnAHyENq85V-44b4wDi9EXo1oatupD2kd0HZw/s1600/Migrated.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh77V9JyhiCduEuO3Cclp9LUA_isgQv5EnYmGuEJaWDeJDyiE4VAbbtz9XcLII9sw4P8-eL1i_Bv4G21LWRaKAJOAmhfYcPXal7oxjHS1uuihcM362D-ppvg63PXK4BU485I3W6pih-rnI/s1600/TestReady.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="48" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh77V9JyhiCduEuO3Cclp9LUA_isgQv5EnYmGuEJaWDeJDyiE4VAbbtz9XcLII9sw4P8-eL1i_Bv4G21LWRaKAJOAmhfYcPXal7oxjHS1uuihcM362D-ppvg63PXK4BU485I3W6pih-rnI/s1600/TestReady.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv9KeYosXz0VowsSdPWsGaNYO1AnKUNg0untnEPU44R_uYw1A26jJ2PhmgPi_gQCrYR7Y_vUzVOMryo62_DMPOwXDuMcoYO_fClCP28JELNd8HzY0025GtcKdfFGOZQYP0x7qMQuRcw8E/s1600/TestSite.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="48" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv9KeYosXz0VowsSdPWsGaNYO1AnKUNg0untnEPU44R_uYw1A26jJ2PhmgPi_gQCrYR7Y_vUzVOMryo62_DMPOwXDuMcoYO_fClCP28JELNd8HzY0025GtcKdfFGOZQYP0x7qMQuRcw8E/s1600/TestSite.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<li>Here is the list configured at the Site Collection root level that defines your notifications</li>
<ul>
<li>The new/edit item forms describe what should be entered in each field</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkobSgFVIzsw4JUyc6N8mlCF0doQmJo-v2LDjWqcjWQrlBdAh5Jm-09WmDl8ypJ1BZB0_xYr-rAamiN0EmFz8YklOUCxDF8EnIeZDpc_XvF6dQ4T-Nt3K-k-pGbG5cL_00yIkF-fHcbPI/s1600/MNUList.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkobSgFVIzsw4JUyc6N8mlCF0doQmJo-v2LDjWqcjWQrlBdAh5Jm-09WmDl8ypJ1BZB0_xYr-rAamiN0EmFz8YklOUCxDF8EnIeZDpc_XvF6dQ4T-Nt3K-k-pGbG5cL_00yIkF-fHcbPI/s1600/MNUList.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<li>Notification Tool Feature List</li>
<ul>
<li>Site Collection Deployed full trust solution (Currently designed for SharePoint 2010+)</li>
<li>Client object model exclusively used for notification processing in order to support future releases on the SharePoint 2013 app model and Office 365 environments</li>
<li>Drop down selection of common notification scenarios</li>
<li>Migration notification list definition</li>
<ul>
<li>Must be added to the root site collection</li>
</ul>
<li>Configurable notification text with wiki-like syntax for inserting hyperlinks or a date from the Migration Notification List</li>
<ul>
<li>More Info URL</li>
<li>New URL</li>
<li>Migration Date</li>
</ul>
<li>SharePoint client object model property bag caching to reduce server load and increase performance</li>
<li>Supports the standard notification color selections</li>
<li>Include all sub-sites (notification can be overridden at the child site level)</li>
<li>New / test site URL replacement including the full path to the current page/form</li>
<li>Notification disable flag</li>
<li>Automatic population of the title field from the New Site URL wiki when sent to a ".../NewForm.aspx?source=..." page (Using "New URL Set Title" syntax)</li>
<li>Permission based notification visibility (security trimming)</li>
<ul>
<li>Added a MultiSelect choice field in the list called "Display To"</li>
<li>Based on the <a href="https://msdn.microsoft.com/en-us/library/office/ee556747(v=office.14).aspx">SP.PermissionKind Enumeration</a></li>
</ul>
<li>Notification dismissal option (cookie based)</li>
<ul>
<li>1 day dismissal duration</li>
</ul>
<li>Automatically delete sites from the migration notification list by selecting <strong>Auto Delete</strong> or <strong>Auto Recycle</strong> in the <strong>Old Site Status</strong> field</li>
<ul>
<li>This capability is enabled through a separate Site Collection feature and requires the user to have permissions to delete the site</li>
<li>This feature is especially useful for retention policies that require you to post a notice of deletion before deleting the site.</li>
<li>If you use Auto Delete instead of Auto Recycle, you should backup the site first if there is any possibility of needing a restore</li>
</ul>
</ul>
<li>Contact me for SharePoint Farm Upgrade or Migration services, to request a customized version of this solution, or to provide SharePoint Solution Architecture services</li>
</ul>
<strong>Releases</strong><br />
<ul>
<li>Release 1.3.2.0 (2013 only): 11/7/2015 </li>
<ul>
<li>Fixed a bug when removing an existing Migration Notification List and adding another with a different name.</li>
</ul>
<li>Release 1.3.1.0: 7/6/2015</li>
<ul>
<li>SharePoint 2013 list view fix</li>
<li>3 digit year date format fix (115 fixed to be 2015)</li>
</ul>
<li>Release 1.3.0.0: 5/29/2015</li>
<ul>
<li>SharePoint 2013 version created</li>
</ul>
<li>Release 1.3.0.0: 5/27/2015</li>
<ul>
<li>New Features</li>
<ul>
<li>Auto Delete Old Site feature added</li>
<ul>
<li>New feature activates migration notification list event receiver keying off a new field type "Old Site Status"</li>
</ul>
<li>Refactored to use ScriptLink and _layouts JavaScript code file to enable browser based code caching</li>
</ul>
</ul>
<li>Release 1.2.1.0: 5/15/2015</li>
<ul>
<li>Bug Fixes</li>
<ul>
<li>Redirect URL now works when browsing folders within a list/library</li>
<ul>
<li>These links now redirect to the Document Library root folder</li>
</ul>
</ul>
<li>New Features</li>
<ul>
<li>Notification dismissal option (cookie based)</li>
<ul>
<li>1 day dismissal duration</li>
</ul>
</ul>
</ul>
<li>Release 1.2.0.0: 5/13/2015</li>
<ul>
<li>Bug Fixes</li>
<ul>
<li>URLs with spaces and special characters now work correctly</li>
<ul>
<li>You will need to make sure to unencode the URLs when entering them in the list. The title field description now reflects this requirement.</li>
</ul>
<li>Redirect URLs with special characters will now be encoded correctly</li>
</ul>
<li>Added Features</li>
<ul>
<li>Permission based notification visibility (security trimming)</li>
<ul>
<li>Added a MultiSelect choice field in the list called "Display To"</li>
<li>Based on the <a href="https://msdn.microsoft.com/en-us/library/office/ee556747(v=office.14).aspx">SP.PermissionKind Enumeration</a></li>
</ul>
</ul>
</ul>
</ul>
<strong>Backlog</strong><br />
<ul>
<li>Develop an Office 365 app version</li>
<li>Add parameter for dismissal duration length</li>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com6tag:blogger.com,1999:blog-7794506819107377134.post-35011764120284647832015-03-10T18:22:00.000-07:002015-11-19T20:00:43.769-08:00CRM and xRM vs SharePoint: Business Solution Architecture<strong>Scenario</strong><br />
<ul>
<li>You are tasked with developing an enterprise application or business process solution using a stable platform tool</li>
<li>You have MS SharePoint / Office 365 and MS Dynamics CRM options available and need to decide which to use</li>
</ul>
<b>SharePoint / Office 365 and Microsoft Dynamics CRM and xRM Comparison</b><br />
<ul>
<li>SharePoint and Office 365 is a(n)</li>
<ul>
<li>Customizable and flexible business solution platform</li>
<ul>
<li>Content-centric</li>
</ul>
<li>Content/document management and versioning system (CMS/DMS)</li>
<li>Enterprise search engine</li>
<li>Workflow system (WWF/Azure Workflow)</li>
<li>Alert engine</li>
<li>Extension for MS Office client apps and MS OfficeWeb Apps (OWA)</li>
<li>Web site development and web content management tool (WCM)</li>
<li>Publishing tool</li>
<li>Personalizable web interface</li>
<li>Social platform</li>
<li>Cloud capable, multi-tenant framework</li>
<li>MS Access web database platform</li>
<li>MS Project platform</li>
<li>MS Team Foundation Studio site platform</li>
<li>MS Dynamics CRM document repository</li>
</ul>
<li>Dynamics CRM (xRM) is a(n)</li>
<ul>
<li>Customizable CRM line of business system</li>
<ul>
<li>For <b>Sales</b> and <b>Marketing </b>departments</li>
</ul>
<li>Entity management platform</li>
<ul>
<li>Ex: Accounts, contacts, orders, cases and opportunities</li>
<li>May be configured for case management solutions such as health and human services, benefits administration, legal cases, grant management, etc.</li>
</ul>
<li>Query tool</li>
<li>Workflow engine (WWF)</li>
<li>Analytics tool</li>
<li>Extension for MS Outlook, Excel, and Word</li>
<li>Custom business solution platform</li>
<ul>
<li>Email and conversation-centric applications</li>
<ul>
<li>Customer service, tech support, employee relations, outreach, campaigning, contracts, etc.</li>
</ul>
</ul>
</ul>
</ul>
<b>Summary</b><br />
<b><br /></b>MS Dynamics CRM is designed as a customer relationship management system and the platform has native relational design at its heart. It can be adapted to many conversational and relationship based business processes. The primary problem with CRM, is that it lacks the popularity of SharePoint and Office 365 due to reduced feature set and increased cost and is therefore less likely to be available as a platform to most business developers and end users. This makes finding third party solutions, developers, community forums, and experienced users difficult or costly. Dynamics CRM as a line of business app has many competing products that make the base feature set less important when choosing a solutions platform. These include those from MS partners built directly on SharePoint such as <a href="http://www.bpa-solutions.net/sharepoint-crm/">BPA Solutions CRM</a>, <a href="http://www.sharepointcrmtemplate.com/">SP CRM Template</a>, and <a href="http://www.spmarketplace.com/sharepoint-crm.html">SP Marketplace CRM</a>.<br />
<br />
The capabilities of SharePoint and Office 365 currently outweigh those of Dynamics CRM for general purpose custom business solutions. This is especially true when business solutions incorporate enterprise search, documents and content management, publishing and approval, personalization, collaboration, or public web content. SharePoint with a typical set of third party add-ins provides the best long term, affordable, and flexible solution architecture. Microsoft has embraced SharePoint as an application platform within most of its divisions, Dynamics being the outlier. SharePoint/Office 365 is also the fastest growing product within Microsoft due to its rapid adoption globally. Finally, SharePoint has many more third party solution providers and COTS line of business systems than Dynamics CRM.<br />
<br />
For highly relational and performance based web applications it is better to develop a user interface in SharePoint (app model or web parts) with a SQL DBA developed backend or MS Access Web Database rather than develop a solution using the Dynamics CRM drag drop interface or native SharePoint lists/libraries. This will remain the case until Dynamics CRM catches up to SharePoint/Office 365 in functionality, SharePoint integrates a better relational/back end framework, or another company develops a better web application platform.<br />
<br />
<b><br /></b>
<b>Microsoft Corporate Strategy and Product Roadmap Commentary</b><br />
<div>
<b><br /></b>Ideal Objective: SharePoint = Microsoft's Web Operating System<br />
<br />
SharePoint must be the single web based application platform for all Microsoft's business solutions. MS Dynamics CRM has not been ported to the SharePoint platform for the main reason that customizable relational models are not embraced within SharePoint. Every attempt by the SharePoint product team to incorporate true relational database (RDBMS) integrity, performance, and design into the product have met with limited success. External lists and lookups are feature deprived and difficult to configure. Access web databases are siloed from other SharePoint features and sites. Native lookup fields lack <a href="http://rrfreeman.blogspot.com/2010/11/sharepoint-2007-30-cascading-lookup.html">basic features</a> and have limited relational support. Database synchronization to or from lists is non-existent. Many third party vendors have stepped up to fill these gaps, but that leaves Microsoft without the capabilities for internal development utilizing these missing features. For now, we are stuck in that period where the Dynamics CRM platform is not yet obsolete, but SharePoint (without third party add-ins) is not ready for the port.</div>
<div>
<br /></div>
If Microsoft is to succeed in its primary focus towards enterprise software, then these product teams need to work together to bolster SharePoint's feature set as a solutions development platform and then port the Dynamics business solutions onto the improved platform. This would allow the Dynamics teams to contribute to the design of the SharePoint platform while also removing the CRM team's burden of having to re-invent the wheel regarding the existing and continually improving SharePoint feature set. Examples of these shared functionality opportunities include: workflow engine, search engine, forms engine, list engine, authorization, authentication, UI, admin consoles, deployment methods, device support, mobile applications, OneDrive for Business synchronization, web services, application object model, BI, content management, metadata, analytics services, patches, upgrades, and MS Office integration. Microsoft has taken the first steps with incorporating the MS Access team into SharePoint forms and Access web database design, but the SharePoint team also needs the real world requirements and feedback from the Dynamics teams to ensure the future success of both products.<br />
<br />
Nearly 10 years ago, at the last SharePoint Conference he keynoted, I asked Bill Gates if SharePoint would get true relational design functionality. His answer was that they were working on some of these features (which turned out to be External Lists and Lookup RI) but he still insisted on using SQL RDBMS for highly relational solutions. This answer was inadequate and shortsighted. It is now time for Microsoft to step up and take advantage of the monumental opportunity to combine relational design into the worlds most prevalent and feature rich Web OS, SharePoint (aka Office 365).<br />
<br />
<div>
<strong>Sources and Other Resources</strong></div>
<ul>
<li>Microsoft's xRM positioning statement from 2010: <a href="http://blogs.msdn.com/b/ukcrm/archive/2010/03/17/positioning-xrm-and-sharepoint.aspx">Microsoft Dynamics CRM UK Blog</a></li>
<li>MS SharePoint Development Overview: <a href="https://msdn.microsoft.com/en-us/library/office/dn833469">MSDN SharePoint</a></li>
<li>MS Dynamics CRM Overview: <a href="https://msdn.microsoft.com/en-us/library/cc150928.aspx">MSDN Dynamics CRM</a></li>
</ul>
<strong></strong><br />
<strong>MS Ignite 2015 Update</strong><br />
While attending <a href="http://ignite.microsoft.com/">MS Ignite</a> 2015, I used the opportunity to talk with product leads and managers on both Dynamics CRM and SharePoint/Office 365 to find out how this is going down within Microsoft. Both teams admit that there is very little collaboration between the Dynamics and SharePoint teams and there is a lack of direction from the executive level. This issue flows from the Microsoft organizational structure and requires executive action or an internal grass roots effort to remediate. If Microsoft wants to establish itself as the king of business solutions, then we need these teams (Dynamics, SharePoint/Office 365, and MS Access) to combine their platforms and stop wasting time reinventing the wheel.<br />
<br />
One prime example of waste was brought up in the CRM line of business development session. Since the CRM team does not collaborate with the SharePoint team, they are developing their own separate enterprise search engine rather than utilizing the highly efficient FAST search engine the SharePoint/Office 365 team bought for <a href="http://www.pcworld.com/article/145117/article.html">$1.2 Billion</a>.<br />
<ul>
</ul>
RobertRFreemanhttp://www.blogger.com/profile/06353151634970716780noreply@blogger.com2