Problem

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.


Workaround

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. 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

    In that case, you need to delete all the Apps from your site content and we do not take any guarantee about the consequences you will face by deleting other Apps so you can better check 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. So please plan below steps at non 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 on 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 on more options for ShortPoint SPFx app (three dots) and click on 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 no longer is in site. Go to Site settings:


Click on Save Site as Template



Fill up details and save site as template



Save site as template finished



Step 5: Restore ShortPoint SPFx App from recycle bin

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



Click on Recycle Bin



Select ShortPoint SPFx and click on Restore Selected



go back to site content



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!