diff --git a/application/single_app/admin_settings_nav.py b/application/single_app/admin_settings_nav.py index 00dd71d46..e10f54c75 100644 --- a/application/single_app/admin_settings_nav.py +++ b/application/single_app/admin_settings_nav.py @@ -19,29 +19,35 @@ "icon": "bi-palette", "tabs": [ { - "id": "general", - "label": "General", - "icon": "bi-gear", + "id": "branding", + "label": "Branding", + "icon": "bi-palette", "sections": [ {"id": "branding-section", "label": "Branding", "icon": "bi-palette"}, {"id": "home-page-text-section", "label": "Home Page Text", "icon": "bi-house"}, {"id": "appearance-section", "label": "Appearance", "icon": "bi-brush"}, - {"id": "health-check-section", "label": "Health Check", "icon": "bi-heart-pulse"}, - {"id": "swagger-section", "label": "API Documentation", "icon": "bi-file-earmark-code"}, + ], + }, + { + # Everything the app states to the user before or during use: + # banners, notices and the agreements they must accept. + "id": "notices", + "label": "Notices & Agreements", + "icon": "bi-megaphone", + "sections": [ {"id": "classification-banner-section", "label": "Classification Banner", "icon": "bi-shield-exclamation"}, {"id": "ai-notice-section", "label": "Chat AI Notice", "icon": "bi-robot"}, {"id": "terms-of-use-section", "label": "Terms of Use", "icon": "bi-door-open"}, - {"id": "support-menu-section", "label": "Support", "icon": "bi-life-preserver"}, - {"id": "external-links-section", "label": "External Links", "icon": "bi-box-arrow-up-right"}, - {"id": "system-settings-section", "label": "System Settings", "icon": "bi-gear-fill"}, + {"id": "user-agreement-section", "label": "User Agreement", "icon": "bi-file-earmark-check"}, ], }, { "id": "custom-pages", - "label": "Custom Pages", + "label": "Pages & Links", "icon": "bi-window-plus", "sections": [ {"id": "custom-pages-section", "label": "Static Pages", "icon": "bi-file-earmark-richtext"}, + {"id": "external-links-section", "label": "External Links", "icon": "bi-box-arrow-up-right"}, ], }, ], @@ -138,7 +144,6 @@ {"id": "file-sharing-section", "label": "File Sharing", "icon": "bi-share"}, {"id": "metadata-extraction-section", "label": "Metadata Extraction", "icon": "bi-file-earmark-code"}, {"id": "multimodal-vision-section", "label": "Multi-Modal Vision Analysis", "icon": "bi-eye"}, - {"id": "user-agreement-section", "label": "User Agreement", "icon": "bi-file-earmark-check"}, ], }, { @@ -189,20 +194,40 @@ "icon": "bi-shield-lock", "tabs": [ { - "id": "security", - "label": "Security", - "icon": "bi-shield-lock", + # Who can get in and what role they need. Distinct from Content + # Safety, which is about what may be said once you are in. + "id": "access-roles", + "label": "Access & Roles", + "icon": "bi-person-check", + "sections": [ + {"id": "permissions-section", "label": "Permissions", "icon": "bi-person-check"}, + ], + }, + { + "id": "secrets", + "label": "Secrets", + "icon": "bi-safe", "sections": [ {"id": "keyvault-section", "label": "Key Vault", "icon": "bi-safe"}, ], }, { - "id": "safety", - "label": "Safety", - "icon": "bi-shield-check", + "id": "content-safety", + "label": "Content Safety", + "icon": "bi-shield-exclamation", "sections": [ {"id": "content-safety-section", "label": "Content Safety", "icon": "bi-shield-exclamation"}, - {"id": "permissions-section", "label": "Permissions", "icon": "bi-person-check"}, + ], + }, + { + # Interim home for the mixed System Settings card. Four of its + # eight fields are idle-timeout, which is the plurality; the + # rest are split out to their real homes in a later change. + "id": "session", + "label": "Session", + "icon": "bi-hourglass-split", + "sections": [ + {"id": "system-settings-section", "label": "System Settings", "icon": "bi-sliders"}, ], }, { @@ -348,12 +373,14 @@ }, { "id": "logging", - "label": "Logging", + "label": "Logging & Health", "icon": "bi-journal-text", "sections": [ {"id": "application-insights-section", "label": "Application Insights", "icon": "bi-graph-up"}, {"id": "debug-logging-section", "label": "Debug Logging", "icon": "bi-bug"}, {"id": "file-processing-logs-section", "label": "File Process Logging", "icon": "bi-file-earmark-text"}, + {"id": "health-check-section", "label": "Health Check", "icon": "bi-heart-pulse"}, + {"id": "swagger-section", "label": "API Documentation", "icon": "bi-file-earmark-code"}, ], }, ], @@ -363,6 +390,16 @@ "label": "Help", "icon": "bi-life-preserver", "tabs": [ + { + # Where an admin looks first when a user needs help, ahead of + # raising it with the project. + "id": "support-menu", + "label": "Support Menu", + "icon": "bi-life-preserver", + "sections": [ + {"id": "support-menu-section", "label": "Support", "icon": "bi-life-preserver"}, + ], + }, { "id": "send-feedback", "label": "Send Feedback", @@ -408,6 +445,18 @@ def get_group_for_tab(tab_id): return None +def get_landing_tab_id(): + """Return the tab an admin lands on when no tab is requested. + + This is the first tab of the first group rather than a fixed id, so the + landing pane follows the navigation map as cards are regrouped. Latest + Features is pinned last precisely so it can never win this. + """ + for _, tab in iter_tabs(): + return tab["id"] + return None + + def get_section_ids(): """Return every section target declared across the navigation.""" return [ diff --git a/application/single_app/app.py b/application/single_app/app.py index 35cc2d336..d8f837e33 100644 --- a/application/single_app/app.py +++ b/application/single_app/app.py @@ -31,7 +31,7 @@ from functions_content import * from functions_documents import * from functions_latest_features_nav import should_hide_latest_features_nav -from admin_settings_nav import ADMIN_NAV +from admin_settings_nav import ADMIN_NAV, get_landing_tab_id from functions_search import * from functions_settings import * from functions_mcp_server_config import is_mcp_ui_enabled @@ -600,6 +600,7 @@ def inject_settings(): user_settings=user_settings, custom_pages_nav=custom_pages_nav, admin_nav=ADMIN_NAV, + admin_landing_tab=get_landing_tab_id(), latest_features_current_version=VERSION, latest_features_nav_hidden=latest_features_nav_hidden, latest_features_nav_hidden_by_development=IS_DEVELOPMENT, diff --git a/application/single_app/config.py b/application/single_app/config.py index 0244ed3e0..e1fb9e3b7 100644 --- a/application/single_app/config.py +++ b/application/single_app/config.py @@ -96,7 +96,7 @@ EXECUTOR_TYPE = 'thread' EXECUTOR_MAX_WORKERS = 30 SESSION_TYPE = 'filesystem' -VERSION = "0.260.012" +VERSION = "0.260.013" IS_DEVELOPMENT = is_development_env_enabled() SESSION_COOKIE_SAMESITE = os.getenv('SESSION_COOKIE_SAMESITE', 'Lax') diff --git a/application/single_app/static/js/admin/admin_data_management.js b/application/single_app/static/js/admin/admin_data_management.js index 481b2069f..e8c2761a9 100644 --- a/application/single_app/static/js/admin/admin_data_management.js +++ b/application/single_app/static/js/admin/admin_data_management.js @@ -388,7 +388,8 @@ function bindEvents() { pendingDataManagementBackupDelete = null; }); elements.dataManagementConfirmBackupDeleteBtn?.addEventListener("click", deleteDataManagementBackup); - elements.dataManagementKeyVaultLink?.addEventListener("click", openKeyVaultSettings); + // The Key Vault link carries data-admin-link, so admin_card_links.js + // resolves the owning tab from the DOM and scrolls to the card. elements.dataManagementCosmosEditorOpenDangerBtn?.addEventListener("click", showCosmosEditorDangerModal); elements.datamanagementcosmoseditordangeraccept?.addEventListener("change", updateCosmosEditorDangerAcceptState); elements.dataManagementCosmosEditorAcceptDangerBtn?.addEventListener("click", acceptCosmosEditorDanger); @@ -909,20 +910,6 @@ function setKeyStorageAlert(variant, iconClass, title, message, linkText) { setText(elements.dataManagementKeyVaultLink, linkText); } -function openKeyVaultSettings(event) { - event?.preventDefault(); - const securityTabButton = document.getElementById("security-tab"); - if (securityTabButton && window.bootstrap?.Tab) { - window.bootstrap.Tab.getOrCreateInstance(securityTabButton).show(); - } else if (securityTabButton) { - securityTabButton.click(); - } - window.location.hash = "security"; - window.setTimeout(() => { - document.getElementById("keyvault-section")?.scrollIntoView({ block: "start", behavior: "smooth" }); - }, 100); -} - function collectSettings() { const backupStorageAuthenticationType = getValue(elements.datamanagementstorageauth) || backupStorageAuthManagedIdentity; return { diff --git a/application/single_app/static/js/admin/admin_sidebar_nav.js b/application/single_app/static/js/admin/admin_sidebar_nav.js index edad020d8..706c87e5f 100644 --- a/application/single_app/static/js/admin/admin_sidebar_nav.js +++ b/application/single_app/static/js/admin/admin_sidebar_nav.js @@ -145,12 +145,15 @@ function initAdminSidebarNav() { // Set the initial active tab - but only if no tab is already active. // Latest Features is deliberately excluded so it never opens by default. + // The landing tab is whichever tab the nav map renders first rather than a + // hardcoded id, so it stays correct as the information architecture moves. const activeTab = document.querySelector('.admin-nav-tab.active, .admin-nav-section.active'); if (!activeTab) { - const firstTab = document.querySelector('.admin-nav-tab[data-tab="general"]'); - if (firstTab) { + const firstTab = document.querySelector('.admin-nav-tab[data-tab]'); + const firstTabId = firstTab ? firstTab.getAttribute('data-tab') : null; + if (firstTabId) { firstTab.classList.add('active'); - showAdminTab('general'); + showAdminTab(firstTabId); } } else { console.log('initAdminSidebarNav - Found existing active tab, preserving current state:', activeTab.getAttribute('data-tab')); @@ -288,6 +291,9 @@ function revealAdminGroupForTab(tabId) { const LEGACY_TAB_REDIRECTS = { 'governance': 'feature-governance', 'scale': 'redis-caching', + 'general': 'branding', + 'safety': 'access-roles', + 'security': 'secrets', }; function resolveAdminTabId(tabId) { diff --git a/application/single_app/templates/admin/_panes/access-roles.html b/application/single_app/templates/admin/_panes/access-roles.html new file mode 100644 index 000000000..3e93d9ff7 --- /dev/null +++ b/application/single_app/templates/admin/_panes/access-roles.html @@ -0,0 +1,49 @@ +
Control which users can access specific administrative views related to safety and feedback.
+ + +
+ Required app role value: SafetyViolationAdmin. Assign this role to users or groups in the Enterprise App before enabling the requirement. If disabled, any user with the general Admin app role can access the Safety Violations admin page.
+
+ Required app role value: FeedbackAdmin. Assign this role to users or groups in the Enterprise App before enabling the requirement. If disabled, any user with the general Admin app role can access the User Feedback admin page. Requires Enable User Feedback to be active.
+
Configure AI agents and actions for enhanced functionality. Agents provide AI-driven task automation while Actions extend functionality with custom tools and integrations. diff --git a/application/single_app/templates/admin/_panes/ai-models.html b/application/single_app/templates/admin/_panes/ai-models.html index f12b06236..75437fded 100644 --- a/application/single_app/templates/admin/_panes/ai-models.html +++ b/application/single_app/templates/admin/_panes/ai-models.html @@ -1,4 +1,4 @@ -
Configure all AI model settings including GPT for text generation, embeddings for semantic search, and image generation capabilities. diff --git a/application/single_app/templates/admin/_panes/archiving.html b/application/single_app/templates/admin/_panes/archiving.html index 0d56b6223..d2943f47d 100644 --- a/application/single_app/templates/admin/_panes/archiving.html +++ b/application/single_app/templates/admin/_panes/archiving.html @@ -1,4 +1,4 @@ -
+ Configure general application settings, including the application's title, logo, and landing page text. +
++ Configure your application's title, logo, and branding elements. +
+Configure the text content displayed on your application's home page using Markdown formatting.
+ +Configure the app appearance and theme settings.
+ +Users can still toggle dark mode individually from the navigation bar.
+Users can still toggle the left navigation sidebar individually from the header.
+Configure standard and enhanced citations features for your and group workspaces. diff --git a/application/single_app/templates/admin/_panes/classification.html b/application/single_app/templates/admin/_panes/classification.html index 597736e46..425eeedcf 100644 --- a/application/single_app/templates/admin/_panes/classification.html +++ b/application/single_app/templates/admin/_panes/classification.html @@ -1,4 +1,4 @@ -
Configure content safety, archiving, and user feedback settings. If Content Safety is enabled, user @@ -174,49 +174,6 @@
Control which users can access specific administrative views related to safety and feedback.
- - -
- Required app role value: SafetyViolationAdmin. Assign this role to users or groups in the Enterprise App before enabling the requirement. If disabled, any user with the general Admin app role can access the Safety Violations admin page.
-
- Required app role value: FeedbackAdmin. Assign this role to users or groups in the Enterprise App before enabling the requirement. If disabled, any user with the general Admin app role can access the User Feedback admin page. Requires Enable User Feedback to be active.
-
Configure Control Center access and permissions for administrators.
diff --git a/application/single_app/templates/admin/_panes/cosmos.html b/application/single_app/templates/admin/_panes/cosmos.html index 9d1fa89ca..33cf6b0f3 100644 --- a/application/single_app/templates/admin/_panes/cosmos.html +++ b/application/single_app/templates/admin/_panes/cosmos.html @@ -1,4 +1,4 @@ -Enable trusted deployment-time custom pages and manage metadata for simple static pages served from the application custom_pages folders.
@@ -78,4 +78,56 @@When enabled, external links will be displayed in the navigation bar for easy access to external resources.
+ +Define custom links that will appear in the navigation bar for users to access external resources.
+ +| Label | +URL | +Actions | +
|---|
Configure governance enforcement for endpoint, agent, and action creation or usage. Governance is disabled by default and only enforced when toggled on. diff --git a/application/single_app/templates/admin/_panes/feedback-alerts.html b/application/single_app/templates/admin/_panes/feedback-alerts.html index 4ee6ae562..5488e7242 100644 --- a/application/single_app/templates/admin/_panes/feedback-alerts.html +++ b/application/single_app/templates/admin/_panes/feedback-alerts.html @@ -1,4 +1,4 @@ -
Configure file synchronization for personal, group, and public workspaces.
diff --git a/application/single_app/templates/admin/_panes/general.html b/application/single_app/templates/admin/_panes/general.html deleted file mode 100644 index bd3d5be40..000000000 --- a/application/single_app/templates/admin/_panes/general.html +++ /dev/null @@ -1,682 +0,0 @@ -- Configure general application settings, including the application's title, logo, and landing page text. -
-- Configure your application's title, logo, and branding elements. -
-Configure the text content displayed on your application's home page using Markdown formatting.
- -Configure the app appearance and theme settings.
- -Users can still toggle dark mode individually from the navigation bar.
-Users can still toggle the left navigation sidebar individually from the header.
-Configure health check endpoint for external monitoring systems.
- -Use when your monitoring system can reach a protected route and you want the endpoint governed by the normal app access boundary.
-Best for internal monitors or diagnostics tooling that already authenticates to the application.
-Use when a platform health probe cannot sign in and only needs a lightweight availability response.
-Configure automatic OpenAPI/Swagger documentation for API endpoints.
- -- Provides interactive API documentation, endpoint testing, and schema validation. - Useful for developers, API integration, and system troubleshooting. -
-- Display an administrator-provided reminder directly below the chat input, such as guidance that responses are AI-generated and should be reviewed. -
-- Require users to accept the Terms of Use before using SimpleChat. Standard Microsoft sign-in users see it before authentication; Teams SSO and other passive sign-in flows are gated immediately after the app session is created. -
- -/ or an admin-approved HTTP(S) URL. Signed-in users are locally logged out before this redirect.
- When enabled, external links will be displayed in the navigation bar for easy access to external resources.
- -Define custom links that will appear in the navigation bar for users to access external resources.
- -| Label | -URL | -Actions | -
|---|
- System-level settings that control application behavior, including file size limits, conversation history, - and default prompts. -
-Review the main capabilities introduced in v{{ config['VERSION'] }} and use this page as an admin-facing overview for what to highlight with your teams.
@@ -832,7 +832,7 @@Admins can enable this once and let users see more of the model pipeline, including sending, generating, and responded states with clearer timing information.
+ Display an administrator-provided reminder directly below the chat input, such as guidance that responses are AI-generated and should be reviewed. +
++ Require users to accept the Terms of Use before using SimpleChat. Standard Microsoft sign-in users see it before authentication; Teams SSO and other passive sign-in flows are gated immediately after the app session is created. +
+ +/ or an admin-approved HTTP(S) URL. Signed-in users are locally logged out before this redirect.
+ + Configure a user agreement that users must accept before uploading files. + Supports Markdown formatting. +
+ + +Select where the user agreement should be shown (at least one required):
+Configure Redis cache to improve enterprise scale and performance by caching session data. Enabling Redis allows you to horizontally scale your application across multiple instances without losing session data. diff --git a/application/single_app/templates/admin/_panes/retention.html b/application/single_app/templates/admin/_panes/retention.html index c3aa2258a..a2bc06781 100644 --- a/application/single_app/templates/admin/_panes/retention.html +++ b/application/single_app/templates/admin/_panes/retention.html @@ -1,4 +1,4 @@ -
Configure Azure AI Search, Document Intelligence, and multimedia support settings. diff --git a/application/single_app/templates/admin/_panes/security.html b/application/single_app/templates/admin/_panes/secrets.html similarity index 99% rename from application/single_app/templates/admin/_panes/security.html rename to application/single_app/templates/admin/_panes/secrets.html index 40d43e1a9..dbf36ddc0 100644 --- a/application/single_app/templates/admin/_panes/security.html +++ b/application/single_app/templates/admin/_panes/secrets.html @@ -1,4 +1,4 @@ -
Manage security settings for key vault and other security configurations.
diff --git a/application/single_app/templates/admin/_panes/send-feedback.html b/application/single_app/templates/admin/_panes/send-feedback.html index 1d9cdb365..5acd28833 100644 --- a/application/single_app/templates/admin/_panes/send-feedback.html +++ b/application/single_app/templates/admin/_panes/send-feedback.html @@ -1,4 +1,4 @@ -Prepare a prefilled email draft for bug reports or feature requests. This utility is separate from saved settings and records each submission intent in the activity log before opening your local email client.
diff --git a/application/single_app/templates/admin/_panes/session.html b/application/single_app/templates/admin/_panes/session.html new file mode 100644 index 000000000..cb8fe9abe --- /dev/null +++ b/application/single_app/templates/admin/_panes/session.html @@ -0,0 +1,87 @@ ++ System-level settings that control application behavior, including file size limits, conversation history, + and default prompts. +
+Manage the global authentication profiles that File Sync sources and Actions reuse, so credentials stay scoped and are resolved server-side.
diff --git a/application/single_app/templates/admin/_panes/workspaces.html b/application/single_app/templates/admin/_panes/workspaces.html index 9200f71d9..690a902af 100644 --- a/application/single_app/templates/admin/_panes/workspaces.html +++ b/application/single_app/templates/admin/_panes/workspaces.html @@ -1,4 +1,4 @@ -Configure workspace settings like personal/group access, multimedia support, metadata, and document classification.
@@ -640,107 +640,4 @@- Configure a user agreement that users must accept before uploading files. - Supports Markdown formatting. -
- - -Select where the user agreement should be shown (at least one required):
-