diff --git a/src/main/java/com/simisinc/platform/infrastructure/scheduler/SchedulerManager.java b/src/main/java/com/simisinc/platform/infrastructure/scheduler/SchedulerManager.java index 9e741c66..b8ac6270 100644 --- a/src/main/java/com/simisinc/platform/infrastructure/scheduler/SchedulerManager.java +++ b/src/main/java/com/simisinc/platform/infrastructure/scheduler/SchedulerManager.java @@ -34,8 +34,9 @@ import org.jobrunr.storage.StorageProvider; import org.jobrunr.storage.StorageProviderUtils; import org.jobrunr.storage.sql.common.SqlStorageProviderFactory; -import org.jobrunr.utils.mapper.jackson.JacksonJsonMapper; +import org.jobrunr.utils.mapper.jackson3.Jackson3JsonMapper; +import com.simisinc.platform.domain.events.Event; import com.simisinc.platform.infrastructure.database.ConnectionPool; import com.simisinc.platform.infrastructure.instance.InstanceManager; import com.simisinc.platform.infrastructure.scheduler.admin.DatasetsDownloadAndSyncJob; @@ -53,6 +54,8 @@ import com.zeroio.platform.infrastructure.scheduler.cms.RefreshAllDocumentTextIndexesJob; import com.zeroio.platform.infrastructure.scheduler.cms.RefreshAllWebPageTextIndexesJob; +import tools.jackson.databind.jsontype.BasicPolymorphicTypeValidator; + /** * Initializes background jobs to be run on a schedule * @@ -126,7 +129,7 @@ public static void startup(ServletContext servletContext1) { // Initialize the scheduler JobRunr.configure() - .useJsonMapper(new JacksonJsonMapper()) + .useJsonMapper(new Jackson3JsonMapper(BasicPolymorphicTypeValidator.builder().allowIfSubType(Event.class))) .useStorageProvider(jobStorageProvider) // .useJobActivator(new JobActivator() { // public T activateJob(Class aClass) { diff --git a/src/main/java/com/simisinc/platform/presentation/widgets/cms/BlogEditorWidget.java b/src/main/java/com/simisinc/platform/presentation/widgets/cms/BlogEditorWidget.java index eb2e12ce..2ccf40c2 100644 --- a/src/main/java/com/simisinc/platform/presentation/widgets/cms/BlogEditorWidget.java +++ b/src/main/java/com/simisinc/platform/presentation/widgets/cms/BlogEditorWidget.java @@ -92,8 +92,8 @@ public WidgetContext execute(WidgetContext context) { } // Make sure the blog exists if (blog == null) { - // Auto-create it if an admin - if (context.getUserSession().hasRole("admin")) { + // Auto-create the blog and layout of the page + if (context.getUserSession().hasRole("admin") || context.getUserSession().hasRole("content-manager")) { // The Blog needs an administrative record Blog blogBean = new Blog(); blogBean.setName(blogUniqueId); @@ -115,7 +115,7 @@ public WidgetContext execute(WidgetContext context) { try { SaveWebPageCommand.saveWebPage(webPage); } catch (DataException e) { - // No concern yet + LOG.error("Unable to create the blog page for " + blogBean.getUniqueId(), e); } } } diff --git a/src/main/java/com/simisinc/platform/presentation/widgets/cms/DocumentFileListAjax.java b/src/main/java/com/simisinc/platform/presentation/widgets/cms/DocumentFileListAjax.java index 0d767e03..32038dfa 100644 --- a/src/main/java/com/simisinc/platform/presentation/widgets/cms/DocumentFileListAjax.java +++ b/src/main/java/com/simisinc/platform/presentation/widgets/cms/DocumentFileListAjax.java @@ -124,6 +124,7 @@ public JsonServiceContext get(JsonServiceContext context) { .append("\","); sb.append("\"fileLength\":").append(file.getFileLength()).append(","); sb.append("\"url\":\"").append(JsonCommand.toJson(StringUtils.defaultString(file.getUrl()))).append("\","); + sb.append("\"downloadUrl\":\"").append("/assets/file/").append(JsonCommand.toJson(StringUtils.defaultString(file.getUrl()))).append("\","); sb.append("\"downloadCount\":").append(file.getDownloadCount()).append(","); sb.append("\"error\":") .append(isMissingOnServer(file.getFileType(), file.getMimeType(), file.getFileServerPath())).append(","); diff --git a/src/main/resources/database/upgrade/2026/UPGRADE_20260701.1001__regions.sql b/src/main/resources/database/upgrade/2026/UPGRADE_20260701.1001__regions.sql index 864815eb..2962207a 100644 --- a/src/main/resources/database/upgrade/2026/UPGRADE_20260701.1001__regions.sql +++ b/src/main/resources/database/upgrade/2026/UPGRADE_20260701.1001__regions.sql @@ -8,3 +8,11 @@ CREATE TABLE IF NOT EXISTS regions ( name VARCHAR(100), values JSONB ); + +-- Example +-- INSERT INTO regions (level, code, name, values) VALUES (10, 'apac', 'Asia Pacific', '["apac"]'); +-- INSERT INTO regions (level, code, name, values) VALUES (20, 'emea', 'Europe, Middle East, and Africa', '["emea"]'); +-- INSERT INTO regions (level, code, name, values) VALUES (30, 'latam', 'Latin America', '["latam"]'); +-- INSERT INTO regions (level, code, name, values) VALUES (40, 'na', 'North America', '["na", "na-ca", "na-us"]'); +-- INSERT INTO regions (level, code, name, values) VALUES (60, 'global', 'Global', '["na", "na-us", "na-ca", "apac", "emea", "latam"]'); +-- UPDATE site_properties SET property_value = 'true' WHERE property_name = 'site.regions.enabled'; diff --git a/src/main/webapp/WEB-INF/jsp/cms/page-children-widget.jsp b/src/main/webapp/WEB-INF/jsp/cms/page-children-widget.jsp index 51fa974b..74c3d04d 100644 --- a/src/main/webapp/WEB-INF/jsp/cms/page-children-widget.jsp +++ b/src/main/webapp/WEB-INF/jsp/cms/page-children-widget.jsp @@ -20,16 +20,12 @@ .children-pages h4 { margin: 0; color: var(--text); - font-size: 1rem; - font-weight: 700; - letter-spacing: 0.01em; } .page-tree { list-style: none; padding: 0.45rem 0 0; margin: 0; - font-size: 0.92rem; } .tree-item { @@ -56,24 +52,20 @@ .tree-item.level-1 .tree-link { color: var(--accent-1); - font-weight: 700; } .tree-item.level-2 .tree-link { color: var(--accent-2); - font-weight: 600; } .tree-item.level-3 .tree-link { color: var(--accent-3); - font-weight: 600; } .tree-item.level-4 .tree-link, .tree-item.level-5 .tree-link, .tree-item.level-6 .tree-link { color: var(--text); - font-weight: 500; } .tree-indicator { diff --git a/src/main/webapp/WEB-INF/jsp/cms/search-form.jsp b/src/main/webapp/WEB-INF/jsp/cms/search-form.jsp index 41bc9eab..7ed399bc 100644 --- a/src/main/webapp/WEB-INF/jsp/cms/search-form.jsp +++ b/src/main/webapp/WEB-INF/jsp/cms/search-form.jsp @@ -67,6 +67,9 @@ + + + diff --git a/src/main/webapp/javascript/widgets/editor/content-editor-bridge.js b/src/main/webapp/javascript/widgets/editor/content-editor-bridge.js index c0c7674b..1167ff74 100644 --- a/src/main/webapp/javascript/widgets/editor/content-editor-bridge.js +++ b/src/main/webapp/javascript/widgets/editor/content-editor-bridge.js @@ -307,7 +307,7 @@ class ContentEditorBridge { } this.lastPreviewLink = pageLink; - iframe.src = pageLink; + iframe.src = encodeURI(pageLink); // Load content blocks for this page if (this.pageContentBlocksManager) { diff --git a/src/main/webapp/javascript/widgets/editor/properties-panel.js b/src/main/webapp/javascript/widgets/editor/properties-panel.js index eea9035e..62eb9810 100644 --- a/src/main/webapp/javascript/widgets/editor/properties-panel.js +++ b/src/main/webapp/javascript/widgets/editor/properties-panel.js @@ -2590,7 +2590,8 @@ class PropertiesPanel { if (preview) { const iconClass = input.value.trim(); if (iconClass) { - preview.innerHTML = ``; + const escapedIconClass = iconClass.replace(//g, '>').replace(/"/g, '"'); + preview.innerHTML = ``; preview.style.color = '#333'; } else { preview.innerHTML = '';