diff --git a/CHANGELOG.md b/CHANGELOG.md index e673051..f1077af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.30.0] - 2026-05-20 + +### Changed +- The "+ New" menu now also creates **Kafka topic**, **URL resource** and **S3 resource** (next to Organization, Dataset, Service). Their pages (`/kafka-topics`, `/url-resources`, `/s3-resources`) are simplified to single-purpose creation forms — listing, editing and deletion are dropped, mirroring the earlier organization/service/dataset reorganization. Listing and deletion of these resources now happen on the Search page (they are CKAN packages, appear in the Datasets group, and owned ones expose the existing Delete action). +- The "Resources" navigation dropdown is removed. Its only remaining entry that is not a catalog-creation flow — **S3 Management** (bucket/object management) — is now a top-level navigation item. + +### Backwards compatibility +- UI-only reorganization. No API behavior, request/response shapes, or routes change. The `/kafka-topics`, `/url-resources`, `/s3-resources` routes remain (now create-only) and `/s3-management` is unchanged. +- Resources registered before the creator-hash feature do not expose a Delete action on Search; no migration is performed. + ## [0.29.0] - 2026-05-19 ### Added diff --git a/api/config/swagger_settings.py b/api/config/swagger_settings.py index e90c11b..9811dfe 100644 --- a/api/config/swagger_settings.py +++ b/api/config/swagger_settings.py @@ -12,7 +12,7 @@ class Settings(BaseSettings): swagger_title: str = "API Documentation" swagger_description: str = "This is the API documentation." - swagger_version: str = "0.29.0" + swagger_version: str = "0.30.0" root_path: str = "" # API root path prefix (e.g., "/test" or "") is_public: bool = True metrics_endpoint: str = "https://federation.ndp.utah.edu/metrics/" diff --git a/ui/src/components/Navigation.js b/ui/src/components/Navigation.js index 6debeaf..1d87f43 100644 --- a/ui/src/components/Navigation.js +++ b/ui/src/components/Navigation.js @@ -10,7 +10,6 @@ import { Search, FileText, LogOut, - FolderOpen, ChevronDown, HardDrive, ShieldAlert, @@ -23,10 +22,6 @@ import { isAccessRequestAdmin, userAPI } from '../services/api'; * Gray background with improved dropdown logic that always closes properly */ const Navigation = () => { - const [isDropdownOpen, setIsDropdownOpen] = useState(false); - const dropdownRef = useRef(null); - const buttonRef = useRef(null); - const timeoutRef = useRef(null); const [isNewMenuOpen, setIsNewMenuOpen] = useState(false); const newMenuRef = useRef(null); const newButtonRef = useRef(null); @@ -60,25 +55,16 @@ const Navigation = () => { }; }, []); - // Clear timeouts on unmount + // Clear timeout on unmount useEffect(() => { return () => { - if (timeoutRef.current) clearTimeout(timeoutRef.current); if (newTimeoutRef.current) clearTimeout(newTimeoutRef.current); }; }, []); - // Close dropdowns when clicking outside + // Close the "+ New" menu when clicking outside useEffect(() => { const handleClickOutside = (event) => { - if ( - dropdownRef.current && - !dropdownRef.current.contains(event.target) && - buttonRef.current && - !buttonRef.current.contains(event.target) - ) { - setIsDropdownOpen(false); - } if ( newMenuRef.current && !newMenuRef.current.contains(event.target) && @@ -95,26 +81,9 @@ const Navigation = () => { }; }, []); - // Improved dropdown handlers with timeout for better UX - const handleDropdownEnter = () => { - if (timeoutRef.current) { - clearTimeout(timeoutRef.current); - } - setIsDropdownOpen(true); - setIsNewMenuOpen(false); - }; - - const handleDropdownLeave = () => { - // Add small delay to prevent accidental closes - timeoutRef.current = setTimeout(() => { - setIsDropdownOpen(false); - }, 150); - }; - const handleNewMenuEnter = () => { if (newTimeoutRef.current) clearTimeout(newTimeoutRef.current); setIsNewMenuOpen(true); - setIsDropdownOpen(false); }; const handleNewMenuLeave = () => { @@ -123,11 +92,9 @@ const Navigation = () => { }, 150); }; - // Handle mouse entering other nav items - close dropdowns immediately + // Handle mouse entering other nav items - close the menu immediately const handleOtherNavEnter = () => { - if (timeoutRef.current) clearTimeout(timeoutRef.current); if (newTimeoutRef.current) clearTimeout(newTimeoutRef.current); - setIsDropdownOpen(false); setIsNewMenuOpen(false); }; @@ -210,52 +177,86 @@ const Navigation = () => { Search - {/* Resources Dropdown */} -
- Register and manage Kafka topics as datasets in your CKAN instance + Register a Kafka topic as a catalog dataset so others can + discover the stream and how to connect to it. Find it (and + remove it) from the Search page once created.