SharePoint 2013: Cannot Configure App URLs
A Google search will get you the basic list of these services that need to be running:
1. App Management Service
2. Microsoft SharePoint Foundation Subscription Settings Service
3. App Management Service Application & Proxy
4. Microsoft SharePoint Foundation Subscription Settings Service Application & Proxy
So you are done, right? DNS - check. Shell Web Application - check. Certificate configuration - check. Services & Service Apps - check-to-all.
But then you head in to Configure App URLs, and you are hit with this:
"The Subscription Settings service and corresponding application and proxy needs to be running in order to make changes to these settings."
So you check and re-check that things are running. And they are. So what to do? Oh - I know, you probably forgot the super secret additional thing that needs to be running that SharePoint is not telling you about:
Ensure the Security Token Service app pool is running.
For me, the STS app pool was running on the WFE's, but the app server where the services were running had the app pool stopped. All was working fine - no idea why the app pool was stopped - but I guess it was too much to ask that the ACTUAL problem is reported back to me rather than reporting something that was completely false. But I guess it would not be called SharePoint if it didn't try to waste your time...
Simple 'Sticky' Plugin compatible with SharePoint 2010 + SharePoint 2013
Here is a very tiny jQuery plugin that I developed for making elements sticky. There are many others out there - some that do more - but none I could find that were 100% compatible with the default SharePoint master pages. If you have done any work with the scrollable areas within the default SharePoint HTML, you know what I am talking about. The way the ribbon and the 'workspace' areas work are a little funky. This plugin gives you the power of sticky within this context - and should also work fine for any situation where you want something to be sticky within a scrollable DIV element.
Usage:
- Include script in page.
- $("<selector>").floater();
Options:
- startOffset When the 'stickiness' should be invoked.
- offsetY When stuck, how close to the parent element should element be.
- stickyClass Css class added to element when stuck. Removed when un-stuck.
- onStart Event to invoke when sticky happens.
- onStop Event to invoke when un-sticky happens.
Custom Content Type Deployment Tip for Visual Studio 2010
Scenario: You add a custom content type to your Visual Studio 2010 project. Because you have been bitten by the lowercase Content Type ID problem before (see here: https://connect.microsoft.com/VisualStudio/feedback/details/709500/visual-studio-2010-sharepoint-project-template-content-type-generated-through-visual-studio-has-id-guid-in-lower-case-causing-custom-actions-to-fail ), you quickly turn the Content Type ID to UPPERCASE using the handing Ctrl+Shift+U shortcut. You are pretty much a shortcut badass. Visual Studio 2010 generates Content Type ID’s lowercase by default.
<ContentType ID="0x010059b2dab8444144e68f7f9baaa134dbf0" …
<ContentType ID="0X010059B2DAB8444144E68F7F9BAAA134DBF0" …
…to ‘avoid’ problems.
Problem: When you try to deploy your solution, you get a ‘Value is out of range’ error. No logged info beyond that. Helpful as always.
Solution: See the ‘X’ near the beginning of the Content Type ID? It MUST be lowercase. When upper-casing it, you may accidentally uppercase that character too. This totally explodes whatever parsing is done on that ID when it is read from the schema file.
<ContentType ID="0x010059B2DAB8444144E68F7F9BAAA134DBF0" …
SharePoint 2013 Chrome Control Parameters List
I had a hard time Google-Binging this information – so here is what I dug directly out of the source:
Param Name | Description |
siteTitle | The title of the site. |
siteUrl | The url of the site. [This is easy!] |
clientTag | ? Tag the page ? |
appWebUrl | The current app web url. |
onCssLoaded | Callback function for when chrome control is done loading. [Great naming there!] |
assetId | ? The app’s id in the catalog ? |
appStartPage | Start page of app web. Need to test this… |
rightToLeft | For those languages that go against the grain. |
appTitle | Title of the app. [Back to easy street!] |
appIconUrl | The url of the app icon. |
appTitleIconUrl | Titles need icons too. |
appHelpPageUrl | The url of your very useful help page. |
appHelpPageOnClick | Use this to alert(‘No help 4 U!’) |
settingsLinks | Array of links to put under the ‘options’ wheel. |
language | ¿QuĂ© diablos? |
bottomHeaderVisible | Hide the bottom header. |
topHeaderVisible | Guessing this may hide the top header. Since chrome control does so much to everything in addition to the top header [sarcasm], I can see never using this option. |
SharePoint s4-notnotdlg: The opposite of s4-notdlg
Use SharePoint Modal Dialog to Prompt for Text
- Use the JavaScript 'window.prompt' method? Too ugly and limited style and validation options.
- Incorporate a jQuery plugin that makes for easy prompting? May or may not work with SharePoint, and even then it will most likely have a UI style that is different.
- Use the SharePoint dialog API to show a modal page? Close - but that means we have to create and deploy an entire ASPX or HTM page to show within the dialog. That is a lot for what boils down to a label and a text box.
- Embed the script below and move on to checking on your Klout status.
Yeah, I like #4 too - except for the Klout part.
What this script does:
- Shows a SharePoint modal dialog and injects content and style, so it looks like the rest of your UI.
- Does not require you to build another page for the dialog UI.
- Returns the text the user entered.
- Validates that the user typed in something by default. You can optionally provide a maximum length or a custom validation function to use.
- Requires jQuery. Probably could be written to be dependency-free, but that would be many more lines of code - especially the CSS cloning part.
Using DispEx in a Link to a SharePoint Document
private string GetFileViewScript(SPFile file)
{
string text = SPUtility.MapToControl(SPContext.Current.Web, file.Name, string.Empty);
string text2 = (file.Item.ParentList.DefaultItemOpen == DefaultItemOpen.Browser) ? "1" : "0";
SPFieldLookupValue sPFieldLookupValue = file.Item["CheckedOutUserId"] as SPFieldLookupValue;
string scriptLiteralToEncode = (sPFieldLookupValue == null) ? string.Empty : sPFieldLookupValue.LookupValue;
string text3 = (SPContext.Current.Web.CurrentUser != null) ? SPContext.Current.Web.CurrentUser.ID.ToString(CultureInfo.InvariantCulture) : string.Empty;
string text4 = file.Item.ParentList.ForceCheckout ? "1" : "0";
return string.Format(CultureInfo.InvariantCulture, "return DispEx(this,event,'{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}')", new object[]
{
"TRUE",
"FALSE",
"FALSE",
text,
text2,
text,
string.Empty,
string.Empty,
SPHttpUtility.EcmaScriptStringLiteralEncode(scriptLiteralToEncode),
text3,
text4,
(string)file.Item["IsCheckedoutToLocal"],
(string)file.Item["PermMask"]
});
}