Merge pull request #6044 from sbwalker/dev

improve cache busting for module/theme static assets (ie. do not require a restart)
This commit is contained in:
Shaun Walker
2026-02-17 09:31:54 -05:00
committed by GitHub
8 changed files with 38 additions and 4 deletions

View File

@@ -46,6 +46,7 @@
</div> </div>
</div> </div>
</form> </form>
<br />
<Section Name="Information" ResourceKey="Information"> <Section Name="Information" ResourceKey="Information">
<div class="container"> <div class="container">
<div class="row mb-1 align-items-center"> <div class="row mb-1 align-items-center">
@@ -97,6 +98,12 @@
} }
</div> </div>
</div> </div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="fingerprint" HelpText="A unique identifier for the module's static resources. This value can be changed by clicking the Save option below (ie. cache busting)." ResourceKey="Fingerprint">Fingerprint: </Label>
<div class="col-sm-9">
<input id="fingerprint" class="form-control" @bind="@_fingerprint" disabled />
</div>
</div>
</div> </div>
</Section> </Section>
<br /> <br />
@@ -231,6 +238,7 @@
private string _url = ""; private string _url = "";
private string _contact = ""; private string _contact = "";
private string _license = ""; private string _license = "";
private string _fingerprint = "";
private List<Permission> _permissions = null; private List<Permission> _permissions = null;
private string _createdby; private string _createdby;
private DateTime _createdon; private DateTime _createdon;
@@ -266,6 +274,7 @@
_url = moduleDefinition.Url; _url = moduleDefinition.Url;
_contact = moduleDefinition.Contact; _contact = moduleDefinition.Contact;
_license = moduleDefinition.License; _license = moduleDefinition.License;
_fingerprint = moduleDefinition.Fingerprint;
_permissions = moduleDefinition.PermissionList; _permissions = moduleDefinition.PermissionList;
_createdby = moduleDefinition.CreatedBy; _createdby = moduleDefinition.CreatedBy;
_createdon = moduleDefinition.CreatedOn; _createdon = moduleDefinition.CreatedOn;

View File

@@ -30,6 +30,7 @@
</div> </div>
</div> </div>
</form> </form>
<br />
<Section Name="Information" ResourceKey="Information" Heading="Information"> <Section Name="Information" ResourceKey="Information" Heading="Information">
<div class="container"> <div class="container">
<div class="row mb-1 align-items-center"> <div class="row mb-1 align-items-center">
@@ -81,6 +82,12 @@
} }
</div> </div>
</div> </div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="fingerprint" HelpText="A unique identifier for the theme's static resources. This value can be changed by clicking the Save option below (ie. cache busting)." ResourceKey="Fingerprint">Fingerprint: </Label>
<div class="col-sm-9">
<input id="fingerprint" class="form-control" @bind="@_fingerprint" disabled />
</div>
</div>
</div> </div>
</Section> </Section>
<br /> <br />
@@ -117,6 +124,7 @@
private string _url = ""; private string _url = "";
private string _contact = ""; private string _contact = "";
private string _license = ""; private string _license = "";
private string _fingerprint = "";
private List<Permission> _permissions = null; private List<Permission> _permissions = null;
private string _createdby; private string _createdby;
private DateTime _createdon; private DateTime _createdon;
@@ -143,6 +151,7 @@
_url = theme.Url; _url = theme.Url;
_contact = theme.Contact; _contact = theme.Contact;
_license = theme.License; _license = theme.License;
_fingerprint = theme.Fingerprint;
_permissions = theme.PermissionList; _permissions = theme.PermissionList;
_createdby = theme.CreatedBy; _createdby = theme.CreatedBy;
_createdon = theme.CreatedOn; _createdon = theme.CreatedOn;

View File

@@ -234,4 +234,10 @@
<data name="Pages.Heading" xml:space="preserve"> <data name="Pages.Heading" xml:space="preserve">
<value>Pages</value> <value>Pages</value>
</data> </data>
<data name="Fingerprint.Text" xml:space="preserve">
<value>Fingerprint:</value>
</data>
<data name="Fingerprint.HelpText" xml:space="preserve">
<value>A unique identifier for the module's static resources. This value can be changed by clicking the Save option below (ie. cache busting).</value>
</data>
</root> </root>

View File

@@ -186,4 +186,10 @@
<data name="Permissions.Heading" xml:space="preserve"> <data name="Permissions.Heading" xml:space="preserve">
<value>Permissions</value> <value>Permissions</value>
</data> </data>
<data name="Fingerprint.Text" xml:space="preserve">
<value>Fingerprint:</value>
</data>
<data name="Fingerprint.HelpText" xml:space="preserve">
<value>A unique identifier for the theme's static resources. This value can be changed by clicking the Save option below (ie. cache busting).</value>
</data>
</root> </root>

View File

@@ -164,6 +164,7 @@ namespace Oqtane.Controllers
{ {
_moduleDefinitions.UpdateModuleDefinition(moduleDefinition); _moduleDefinitions.UpdateModuleDefinition(moduleDefinition);
_syncManager.AddSyncEvent(_alias, EntityNames.ModuleDefinition, moduleDefinition.ModuleDefinitionId, SyncEventActions.Update); _syncManager.AddSyncEvent(_alias, EntityNames.ModuleDefinition, moduleDefinition.ModuleDefinitionId, SyncEventActions.Update);
_syncManager.AddSyncEvent(_alias, EntityNames.Site, _alias.SiteId, SyncEventActions.Refresh); // fingerprint changed
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Module Definition Updated {ModuleDefinition}", moduleDefinition); _logger.Log(LogLevel.Information, this, LogFunction.Update, "Module Definition Updated {ModuleDefinition}", moduleDefinition);
} }
else else

View File

@@ -117,6 +117,7 @@ namespace Oqtane.Controllers
{ {
_themes.UpdateTheme(theme); _themes.UpdateTheme(theme);
_syncManager.AddSyncEvent(_alias, EntityNames.Theme, theme.ThemeId, SyncEventActions.Update); _syncManager.AddSyncEvent(_alias, EntityNames.Theme, theme.ThemeId, SyncEventActions.Update);
_syncManager.AddSyncEvent(_alias, EntityNames.Site, _alias.SiteId, SyncEventActions.Refresh); // fingerprint changed
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Theme Updated {Theme}", theme); _logger.Log(LogLevel.Information, this, LogFunction.Update, "Theme Updated {Theme}", theme);
} }
else else

View File

@@ -113,7 +113,7 @@ namespace Oqtane.Repository
ModuleDefinition.Resources = moduleDefinition.Resources; ModuleDefinition.Resources = moduleDefinition.Resources;
ModuleDefinition.IsEnabled = moduleDefinition.IsEnabled; ModuleDefinition.IsEnabled = moduleDefinition.IsEnabled;
ModuleDefinition.PackageName = moduleDefinition.PackageName; ModuleDefinition.PackageName = moduleDefinition.PackageName;
ModuleDefinition.Fingerprint = Utilities.GenerateSimpleHash(moduleDefinition.ModifiedOn.ToString("yyyyMMddHHmm")); ModuleDefinition.Fingerprint = moduleDefinition.Fingerprint;
} }
return ModuleDefinition; return ModuleDefinition;
@@ -186,6 +186,7 @@ namespace Oqtane.Repository
ModuleDefinition.CreatedOn = moduledefinition.CreatedOn; ModuleDefinition.CreatedOn = moduledefinition.CreatedOn;
ModuleDefinition.ModifiedBy = moduledefinition.ModifiedBy; ModuleDefinition.ModifiedBy = moduledefinition.ModifiedBy;
ModuleDefinition.ModifiedOn = moduledefinition.ModifiedOn; ModuleDefinition.ModifiedOn = moduledefinition.ModifiedOn;
ModuleDefinition.Fingerprint = Utilities.GenerateSimpleHash(moduledefinition.ModifiedOn.ToString("yyyyMMddHHmm"));
} }
// any remaining module definitions are orphans // any remaining module definitions are orphans

View File

@@ -99,7 +99,7 @@ namespace Oqtane.Repository
Theme.ContainerSettingsType = theme.ContainerSettingsType; Theme.ContainerSettingsType = theme.ContainerSettingsType;
Theme.PackageName = theme.PackageName; Theme.PackageName = theme.PackageName;
Theme.PermissionList = theme.PermissionList; Theme.PermissionList = theme.PermissionList;
Theme.Fingerprint = Utilities.GenerateSimpleHash(theme.ModifiedOn.ToString("yyyyMMddHHmm")); Theme.Fingerprint = theme.Fingerprint;
Themes.Add(Theme); Themes.Add(Theme);
} }
@@ -165,6 +165,7 @@ namespace Oqtane.Repository
Theme.CreatedOn = theme.CreatedOn; Theme.CreatedOn = theme.CreatedOn;
Theme.ModifiedBy = theme.ModifiedBy; Theme.ModifiedBy = theme.ModifiedBy;
Theme.ModifiedOn = theme.ModifiedOn; Theme.ModifiedOn = theme.ModifiedOn;
Theme.Fingerprint = Utilities.GenerateSimpleHash(theme.ModifiedOn.ToString("yyyyMMddHHmm"));
} }
// any remaining themes are orphans // any remaining themes are orphans