Have a custom page and admin panel point at the same widget?

We've a need to create an admin panel which shows the content from a particular (custom) widget, and also have a custom URL/page that shows the same widget. The admin page displays the widget correctly, but the custom page is blank & doesn't contain the widget.

If I disable the admin panel, the widget then shows up on the custom page.

I assume the admin panel has got there first, and made the widget somehow unavailable to the custom page.. is there any way around that?

using System;
using Telligent.Evolution.Extensibility.Urls.Version1;

namespace Blah.CustomPages
    public class CustomPages : INavigable
		public string Name => "Custom Pages";
		public string Description => "Custom Pages";
		public void Initialize() { }

        void INavigable.RegisterUrls(IUrlController controller)
            AddWidgetToPage(controller, "my-pages", "/my/url", "Page List", "d3ab728c-5e18-4fec-9e89-fe8f6b174faa");

        // Small helper to cut down on the clutter above
        void AddWidgetToPage(IUrlController controller, string InternalPageName, string URL, string PageName, string WidgetGUID)
            controller.AddPage(InternalPageName, URL, null, null, PageName, GetSinglePageWidgetDefinition(InternalPageName, WidgetGUID));

        // Helper method that simplifies adding a single widget to a custom page
        PageDefinitionOptions GetSinglePageWidgetDefinition(string InternalPageName, string WidgetGUID)
            return new PageDefinitionOptions
                HasApplicationContext = false,
                SetCustomPageOutput = (context, outputController) => { },
                ParseContext = (context) => { },
                Validate = (context, accessController) => { },
                DefaultPageXml = GetSinglePageWidgetFragment(InternalPageName, WidgetGUID)

        // Return a standard XML fragment that represents a single widget on a page
        string GetSinglePageWidgetFragment(string InternalPageName, string WidgetGUID)
            WidgetGUID = WidgetGUID.Replace("-", "");

            return $@"<contentFragmentPage pageName=""{InternalPageName}"" isCustom=""false"" layout=""Content"">
                      <region regionName=""Content"" >
                          <contentFragment type=""Telligent.Evolution.ScriptedContentFragments.ScriptedContentFragment, Telligent.Evolution.Platform::{WidgetGUID}"" showHeader=""False"" cssClassAddition=""no-wrapper with-spacing responsive-1"" isLocked=""False"" configuration="""" />
                    <contentFragmentTabs />

using System;
using System.Configuration;
using System.Collections.Specialized;
using Telligent.Evolution.Components;
using Telligent.Evolution.Extensibility.Administration.Version1;
using Telligent.Evolution.Extensibility.UI.Version1;
using Telligent.Evolution.Extensibility.Urls.Version1;
using Telligent.Evolution.Extensibility.Version1;

namespace Blah.AdminPanels

    public class PageList : IPlugin, IScriptablePlugin, IScriptedContentFragmentFactoryDefaultProvider, IAdministrationPanel, IPanel

        private readonly Guid _factoryDefaultProviderId = new Guid("feb7cbc2-0d7d-44d9-987c-07d17872d919"); // Random GUID
        private readonly Guid _contentFragmentId = new Guid("d3ab728c-5e18-4fec-9e89-fe8f6b174faa"); // Points at a widget
        private readonly Guid _id = new Guid("1c434984-79f8-4886-a461-1204028ce75b"); // Random GUID
        private IScriptedContentFragmentController _widgetController;

        private readonly ISecurityService securityService = Telligent.Common.Services.Get<ISecurityService>();
        private readonly IContextService contextService = Telligent.Common.Services.Get<IContextService>();

        public string Name => "Page List";

        public string Description => "List of all our custom pages";

        public string PanelName => "Admin Page List";

        public string PanelDescription => this._widgetController.GetMetadata(this._contentFragmentId).Description;

        public void Initialize()

        public void Register(IScriptedContentFragmentController controller)
            this._widgetController = controller;
            ScriptedContentFragmentOptions options = new ScriptedContentFragmentOptions(this._contentFragmentId)
                IsEditable = true,
                CanBeThemeVersioned = true,
                CanHaveHeader = false,
                CanHaveWrapperCss = true,
                CanReadPluginConfiguration = true,
                HasAccess = (Func<int, PageContext, bool>)((userId, pageContext) => this.HasAccess(userId))
            options.Extensions.Add((IContextualScriptedContentFragmentExtension)new PageList.PanelContext());

        public Guid ScriptedContentFragmentFactoryDefaultIdentifier => this._factoryDefaultProviderId;

        public Guid AdministrationPanelCategoryId => AdminPanelCategory.Id; // Our own top-level panel

        public bool HasAccess(int userId) => this.securityService.For((ISecuredItem)Telligent.Evolution.Components.Node.Root).Does(this.contextService.GetExecutionContext().User).Have((Permission)SitePermission.ManageSettings);

        public string GetViewHtml() => this._widgetController.RenderContent(this._contentFragmentId, new NameValueCollection());

        public Guid PanelId => this._id;

        public int? DisplayOrder => new int?();

        public bool IsCacheable => this._widgetController.GetMetadata(this._contentFragmentId).IsCacheable;

        public bool VaryCacheByUser => this._widgetController.GetMetadata(this._contentFragmentId).VaryCacheByUser;

        public string CssClass => this._widgetController.GetMetadata(this._contentFragmentId).CssClass;

        public class PanelContext : IContextualScriptedContentFragmentExtension
            public string ExtensionName => "context";

            public object GetExtension(NameValueCollection context) => (object)new PageList.ContextApi();

        public class ContextApi
            private readonly IThemeOrchestrationService ThemeOrchestrationService = Telligent.Common.Services.Get<IThemeOrchestrationService>();

            public string Dummy(string iterations, string connectionString, string containerName, string operation)
                return "not implemented";

If it isn't possible to do this, that's fine (I guess).. but it feels like it should be possible & I've just neglected a setting somewhere.

[edited by: Matt at 9:16 AM (GMT 0) on Mon, Oct 4 2021]