Issue

You tried to save your site as template but it failed with this error:



Sorry, Something went wrong


Sorry, this site can't be saved as a template. It contains app that don't work in templates: ShortPoint SPFx



Reason

This issue is not related to particularity ShortPoint App, it occurs if the site contains apps that can't be saved as part of the template.


Solution

Workaround is to temporarily remove the ShortPoint SPFx app from site content and restore it once the site is saved as template.


Before we begin

  1. Below steps are only valid for ShortPoint SPFx app (ShortPoint version 6.x.x.x onward) . Do not perform these steps for ShortPoint Add-in (ShortPoint version 5.x.x.x and below).
  2. You need to be Site connection Admin to perform these steps.
  3. You need to delete all the Apps from your site content if you get multiple apps in the error above. For example:

    Sorry, this site can't be saved as a template. It contains apps that don't work in templates: 
    ShortPoint SPFx

    Dashboard Designer
    TimeTracker

    Hovewer, we can't guarantee that there would be no consequences after deleting other Apps. Therefore we recommend you to check it with the other App providers
  4. Important: During the process (in particular after Step 3 below) users will not see ShortPoint elements until you finish the process. Plan ahead and implement outside of active working hours.

Step 1: Go to site content

Open the Site contents of the site which you wish to save as template.

Click on the cog wheel in the Suite Bar and choose Site Contents from the drop down:




Step 2: Switch to classic experience

Deleting the app is only allowed in classic experience. 


So switch to classic experience. Click the link called Return to classic SharePoint available at bottom left of your screen:




Step 3: Delete ShortPoint SPFx App

This step will not delete any of your Data so please be assured your work will remain even after you remove ShortPoint SPFx App from site content.


Click More options for ShortPoint SPFx app (three dots) and click REMOVE and confirm the removal by pressing OK in pop up:



As soon as the App is removed, it will go to Recycle bin. Please do not remove the App from recycle bin.


Important: After this step, the viewer will not see the ShortPoint elements in Modern Pages until you finish all below steps. Classic pages will still work though. 



Step 4: Save site as template

Now you can save the site as template since the App is no longer in site. Go to Site settings:


Click Save Site as Template:



Fill up the details and save site as template:



Save site as template is finished.




Step 5: Restore ShortPoint SPFx App from recycle bin

Now is time to bring ShortPoint SPFx back to game. Go to Site settings:



Click Recycle Bin:



Select ShortPoint SPFx and click on Restore Selection:



Go back to Site contents:



Wait for App to get restored.


  • It will look like this in Classic Experience:

  • and like this, in Modern Experience:



Step 6: Verification


Once you have restored the App, you can go back to any Modern Page and make sure the ShortPoint is loading properly. 


Note: in some cases, we found out that you will no longer see ShortPoint Dashboard in your site content.


Modern View:


Classic View:


In that case, you need to run this script in Developer Tool > Console of your browser from your site home page:


var clientContext = new SP.ClientContext(_spPageContextInfo.webAbsoluteUrl);
web = clientContext.get_web();

allLists = web.get_lists();

clientContext.load(allLists, 'Include(DefaultDisplayFormUrl)');
clientContext.executeQueryAsync(function(sender, args) {
    unHideList('__sp__dashboard/');
}, function() {
    alert("Getting list failed");
});

function unHideList(listUrl) {

    try {
        var enumerator = allLists.getEnumerator();

        while (enumerator.moveNext()) {
            var currentList = enumerator.get_current();
            if ((currentList.get_defaultDisplayFormUrl() != null) && (currentList.get_defaultDisplayFormUrl().indexOf(listUrl) != -1)) {
                currentList.set_hidden(false);
                //must be updated before loading
                currentList.update();
                clientContext.executeQueryAsync(function() {});
        alert('Done');
                break;
            }
        }
    } catch (err) {
        alert('Error');
    }
}


Animation


That's it!