Phase 2 of Organizr Migration - Front Hall restructure: - Add FrontHallState provider with three modes (dashboard, iframe, settings) - Create QuickLinksPanel widget with categorized links and overflow menus - Add IframeView with platform-aware implementation (web iframe, mobile fallback) - Extract DashboardContent from FrontHallPage - Add QuickLinkSettingsContent placeholder for Phase 4 link editor - Implement QuickLink entity and data layer with Core API datasource - Add default quick links fallback when API unavailable - Update UI_LAYOUT.md with Front Hall panel configurations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
54 lines
1.3 KiB
Dart
54 lines
1.3 KiB
Dart
import 'package:freezed_annotation/freezed_annotation.dart';
|
|
|
|
part 'quick_link.freezed.dart';
|
|
|
|
/// Quick link type for navigation behavior.
|
|
enum QuickLinkType {
|
|
/// Opens in embedded iframe within the app.
|
|
iframe,
|
|
|
|
/// Opens in a new browser tab.
|
|
newTab,
|
|
}
|
|
|
|
/// Quick link entity for Front Hall navigation.
|
|
///
|
|
/// Represents a shortcut link that can either open embedded content
|
|
/// in an iframe or navigate to an external URL in a new tab.
|
|
@freezed
|
|
sealed class QuickLink with _$QuickLink {
|
|
const factory QuickLink({
|
|
/// Unique identifier.
|
|
required String id,
|
|
|
|
/// Display name.
|
|
required String name,
|
|
|
|
/// Target URL.
|
|
required String url,
|
|
|
|
/// Material icon name (e.g., 'home', 'settings', 'movie').
|
|
required String iconName,
|
|
|
|
/// Category for grouping (e.g., 'Home', 'AMP', 'Coding', 'Infrastructure').
|
|
String? category,
|
|
|
|
/// Navigation behavior type.
|
|
@Default(QuickLinkType.iframe) QuickLinkType type,
|
|
|
|
/// Sort order within category.
|
|
@Default(0) int sortOrder,
|
|
|
|
/// Whether the link is active/visible.
|
|
@Default(true) bool isActive,
|
|
}) = _QuickLink;
|
|
|
|
const QuickLink._();
|
|
|
|
/// Whether this link opens in an iframe.
|
|
bool get isIframe => type == QuickLinkType.iframe;
|
|
|
|
/// Whether this link opens in a new tab.
|
|
bool get isNewTab => type == QuickLinkType.newTab;
|
|
}
|