diff --git a/src/app/admin/admin.component.html b/src/app/admin/admin.component.html
index 94dd3a8..863c49d 100644
--- a/src/app/admin/admin.component.html
+++ b/src/app/admin/admin.component.html
@@ -7,670 +7,633 @@
-
-
Shows ({{ shows.length }})
-
-
+ @if (shows$ | async; as shows) {
+
+
+
Shows ({{ shows.length }})
+
+
-
-
-
- | Order |
- Title |
- Host |
- Genre |
- Slots |
- Actions |
-
-
-
- @for (show of shows; track show.id) {
-
- | {{ show.display_order }} |
- {{ show.title }} |
- {{ show.host }} |
- {{ show.genre }} |
-
- @for (slot of show.schedules; track slot.id) {
- {{ slot.day_label.charAt(0) }} {{ slot.time }}
- }
- |
-
-
-
- |
-
- } @empty {
- | No shows yet. Click "Add Show" to create one. |
+
+
+
+ | Order |
+ Title |
+ Host |
+ Genre |
+ Slots |
+ Actions |
+
+
+
+ @for (show of shows; track show.id) {
+
+ | {{ show.display_order }} |
+ {{ show.title }} |
+ {{ show.host }} |
+ {{ show.genre }} |
+
+ @for (slot of show.schedules; track slot.id) {
+ {{ slot.day_label.charAt(0) }} {{ slot.time }}
}
- |
-
-
- }
+
+
+
+
+ |
+
+ } @empty {
+
+ | No shows yet. Click "Add Show" to create one. |
+
+ }
+
+
+
+ }
}
@if (activeTab() === 'events') {
- @if (events$ | async; as events) {
-
-
-
Events ({{ events.length }})
-
-
+ @if (events$ | async; as events) {
+
+
+
Events ({{ events.length }})
+
+
-
-
-
- | Date |
- Title |
- Location |
- Active |
- Actions |
-
-
-
- @for (event of events; track event.id) {
-
- | {{ event.date }} |
- {{ event.title }} |
- {{ event.location }} |
- {{ event.active ? 'Yes' : 'No' }} |
-
-
-
- |
-
- } @empty {
- | No events yet. Click "Add Event" to create one. |
- }
-
-
-
- }
+
+
+
+ | Date |
+ Title |
+ Location |
+ Active |
+ Actions |
+
+
+
+ @for (event of events; track event.id) {
+
+ | {{ event.date }} |
+ {{ event.title }} |
+ {{ event.location }} |
+ {{ event.active ? 'Yes' : 'No' }} |
+
+
+
+ |
+
+ } @empty {
+
+ | No events yet. Click "Add Event" to create one. |
+
+ }
+
+
+
+ }
}
@if (activeTab() === 'history') {
- @if (historyEntries$ | async; as entries) {
-
-
-
History Timeline ({{ entries.length }})
-
-
+ @if (historyEntries$ | async; as entries) {
+
+
+
History Timeline ({{ entries.length }})
+
+
-
-
-
- | Year |
- Title |
- Order |
- Active |
- Actions |
-
-
-
- @for (entry of entries; track entry.id) {
-
- | {{ entry.year }} |
- {{ entry.title }} |
- {{ entry.display_order }} |
- {{ entry.active ? 'Yes' : 'No' }} |
-
-
-
- |
-
- } @empty {
- | No history entries yet. Click "Add Entry" to create one. |
- }
-
-
-
- }
+
+
+
+ | Year |
+ Title |
+ Order |
+ Active |
+ Actions |
+
+
+
+ @for (entry of entries; track entry.id) {
+
+ | {{ entry.year }} |
+ {{ entry.title }} |
+ {{ entry.display_order }} |
+ {{ entry.active ? 'Yes' : 'No' }} |
+
+
+
+ |
+
+ } @empty {
+
+ | No history entries yet. Click "Add Entry" to create one. |
+
+ }
+
+
+
+ }
}
@if (activeTab() === 'team') {
- @if (teamMembers$ | async; as members) {
-
-
-
Team Members ({{ members.length }})
-
-
+ @if (teamMembers$ | async; as members) {
+
+
+
Team Members ({{ members.length }})
+
+
-
-
-
- | Name |
- Title |
- Order |
- Active |
- Actions |
-
-
-
- @for (member of members; track member.id) {
-
- | {{ member.name }} |
- {{ member.title }} |
- {{ member.display_order }} |
- {{ member.active ? 'Yes' : 'No' }} |
-
-
-
- |
-
- } @empty {
- | No team members yet. Click "Add Member" to create one. |
- }
-
-
-
- }
+
+
+
+ | Name |
+ Title |
+ Order |
+ Active |
+ Actions |
+
+
+
+ @for (member of members; track member.id) {
+
+ | {{ member.name }} |
+ {{ member.title }} |
+ {{ member.display_order }} |
+ {{ member.active ? 'Yes' : 'No' }} |
+
+
+
+ |
+
+ } @empty {
+
+ | No team members yet. Click "Add Member" to create one. |
+
+ }
+
+
+
+ }
}
@if (activeTab() === 'community') {
- @if (communityHighlights$ | async; as highlights) {
-
-
-
Community Highlights ({{ highlights.length }})
-
-
+ @if (communityHighlights$ | async; as highlights) {
+
+
+
Community Highlights ({{ highlights.length }})
+
+
-
-
-
- | Icon |
- Title |
- Order |
- Active |
- Actions |
-
-
-
- @for (highlight of highlights; track highlight.id) {
-
- | {{ highlight.icon }} |
- {{ highlight.title }} |
- {{ highlight.display_order }} |
- {{ highlight.active ? 'Yes' : 'No' }} |
-
-
-
- |
-
- } @empty {
- | No highlights yet. Click "Add Highlight" to create one. |
- }
-
-
-
- }
+
+
+
+ | Icon |
+ Title |
+ Order |
+ Active |
+ Actions |
+
+
+
+ @for (highlight of highlights; track highlight.id) {
+
+ | {{ highlight.icon }} |
+ {{ highlight.title }} |
+ {{ highlight.display_order }} |
+ {{ highlight.active ? 'Yes' : 'No' }} |
+
+
+
+ |
+
+ } @empty {
+
+ | No highlights yet. Click "Add Highlight" to create one. |
+
+ }
+
+
+
+ }
}
@if (activeTab() === 'station') {
- @if (stationConfig$ | async; as config) {
-
-
-
Station Configuration
-
-
+ @if (stationConfig$ | async; as config) {
+
+
+
Station Configuration
+
+
-
-
- Callsign
- {{ config.callsign }}
-
-
- Name
- {{ config.name_primary }} {{ config.name_secondary }}
-
-
- Tagline
- {{ config.tagline }}
-
-
- Frequency
- {{ config.frequency }}
-
-
- Founded
- {{ config.founded_year }}
-
-
- Nonprofit
- {{ config.nonprofit_type }} — EIN {{ config.ein }}
-
-
- Email
- {{ config.email }}
-
-
- Phone
- {{ config.phone }}
-
-
- Website
- {{ config.website }}
-
-
- Donation URL
- {{ config.donation_url || '(not set)' }}
-
-
- Play Store URL
- {{ config.play_store_url || '(not set)' }}
-
-
- App Store Embed
- {{ config.app_store_embed_html ? 'Configured' : '(not set)' }}
-
-
+
+
+ Callsign
+ {{ config.callsign }}
- }
+
+ Name
+ {{ config.name_primary }} {{ config.name_secondary }}
+
+
+ Tagline
+ {{ config.tagline }}
+
+
+ Frequency
+ {{ config.frequency }}
+
+
+ Founded
+ {{ config.founded_year }}
+
+
+ Nonprofit
+ {{ config.nonprofit_type }} — EIN {{ config.ein }}
+
+
+ Email
+ {{ config.email }}
+
+
+ Phone
+ {{ config.phone }}
+
+
+ Website
+ {{ config.website }}
+
+
+ Donation URL
+ {{ config.donation_url || '(not set)' }}
+
+
+ Play Store URL
+ {{ config.play_store_url || '(not set)' }}
+
+
+ App Store Embed
+ {{ config.app_store_embed_html ? 'Configured' : '(not set)' }}
+
+
+
+ }
}
@if (activeTab() === 'theme') {
-
-
-
Color Theme
-
-
-
-
- Harmony:
- {{ getHarmonyLabel() }}
-
-
-
-
- @if (themeSaveSuccess) {
-
{{ themeSaveSuccess }}
- }
- @if (themeSaveError) {
-
{{ themeSaveError }}
- }
-
-
-
- @for (role of colorRoles; track role.field) {
-
-
-
-
-
- {{ role.label }}
- {{ themeColors[role.field] }}
-
-
- @if (hasHarmonyIssue(role.field)) {
- ⚠
- } @else if (role.group !== 'neutral') {
- ✓
- }
-
-
- }
-
-
-
-
-
-
-
+
+
+
Color Theme
+
+
+
+ Harmony:
+ {{ getHarmonyLabel() }}
+
+
+
+
+ @if (themeSaveSuccess) {
+
{{ themeSaveSuccess }}
+ }
+ @if (themeSaveError) {
+
{{ themeSaveError }}
+ }
+
+
+
+ @for (role of colorRoles; track role.field) {
+
+
+
+
+
+ {{ role.label }}
+ {{ themeColors[role.field] }}
+
+
+ @if (hasHarmonyIssue(role.field)) {
+ ⚠
+ } @else if (role.group !== 'neutral') {
+ ✓
+ }
+
+
+ }
+
+
+
+
+
+
+
+
}
@if (activeTab() === 'underwriters') {
- @if (underwriters$ | async; as underwriters) {
-
-
-
Underwriters ({{ underwriters.length }})
-
-
+ @if (underwriters$ | async; as underwriters) {
+
+
+
Underwriters ({{ underwriters.length }})
+
+
-
-
-
- | Name |
- Description |
- Website |
- Order |
- Active |
- Actions |
-
-
-
- @for (uw of underwriters; track uw.id) {
-
- | {{ uw.name }} |
- {{ uw.description }} |
-
- @if (uw.website_url) {
- {{ uw.website_url }}
- } @else {
- —
- }
- |
- {{ uw.display_order }} |
- {{ uw.active ? 'Yes' : 'No' }} |
-
-
-
- |
-
- } @empty {
- | No underwriters yet. Click "Add Underwriter" to create one. |
+
+
+
+ | Name |
+ Description |
+ Website |
+ Order |
+ Active |
+ Actions |
+
+
+
+ @for (uw of underwriters; track uw.id) {
+
+ | {{ uw.name }} |
+ {{ uw.description }} |
+
+ @if (uw.website_url) {
+ {{ uw.website_url }}
+ } @else {
+ —
}
- |
-
-
- }
+
+ {{ uw.display_order }} |
+ {{ uw.active ? 'Yes' : 'No' }} |
+
+
+
+ |
+
+ } @empty {
+
+ | No underwriters yet. Click "Add Underwriter" to create one. |
+
+ }
+
+
+
+ }
}
@if (activeTab() === 'mobile-builds') {
-
-
-
Mobile Build Orchestration
-
-
-
-
-
- Derived Defaults
- @if (mobileBuildDefaults; as defaults) {
-
-
Tenant: {{ defaults.tenant_key }}
-
App Name: {{ defaults.app_name }}
-
Support Email: {{ defaults.support_email }}
-
Website: {{ defaults.website }}
-
Stream URL: {{ defaults.stream_url || '(not set)' }}
-
- } @else {
- Defaults unavailable. Check station config.
- }
-
-
-
-
+
+
+
Mobile Build Orchestration
+
+
+
- Build Requests
- @if (mobileBuilds$ | async; as builds) {
-
-
-
- | ID |
- Platforms |
- Version |
- Status |
- Preflight |
- Actions |
-
-
-
- @for (build of builds; track build.id) {
-
- | #{{ build.id }} |
-
- {{ build.platform_android ? 'Android' : '' }}
- {{ build.platform_android && build.platform_ios ? ' + ' : '' }}
- {{ build.platform_ios ? 'iOS' : '' }}
- |
- {{ build.version_name }} ({{ build.build_number }}) |
- {{ build.status }} |
- {{ build.preflight_passed ? 'Passed' : 'Pending/Failed' }} |
-
-
- |
-
- } @empty {
- | No build requests yet. |
- }
-
-
+ Derived Defaults
+ @if (mobileBuildDefaults; as defaults) {
+
+
Tenant: {{ defaults.tenant_key }}
+
App Name: {{ defaults.app_name }}
+
Support Email: {{ defaults.support_email }}
+
Website: {{ defaults.website }}
+
Stream URL: {{ defaults.stream_url || '(not set)' }}
+
+ } @else {
+ Defaults unavailable. Check station config.
}
- @if (selectedMobileBuild; as build) {
-
+
+
+ Build Requests
+ @if (mobileBuilds$ | async; as builds) {
+
+
+
+ | ID |
+ Platforms |
+ Version |
+ Status |
+ Preflight |
+ Actions |
+
+
+
+ @for (build of builds; track build.id) {
+
+ | #{{ build.id }} |
+
+ {{ build.platform_android ? 'Android' : '' }}
+ {{ build.platform_android && build.platform_ios ? ' + ' : '' }}
+ {{ build.platform_ios ? 'iOS' : '' }}
+ |
+ {{ build.version_name }} ({{ build.build_number }}) |
+ {{ build.status }} |
+ {{ build.preflight_passed ? 'Passed' : 'Pending/Failed' }} |
+
+
+ |
+
+ } @empty {
+
+ | No build requests yet. |
+
+ }
+
+
+ }
+
+
+ @if (selectedMobileBuild; as build) {
+
+
+
+ @if (mobileBuildPreflightIssues.length > 0) {
+
+
Preflight issues:
+
+ @for (issue of mobileBuildPreflightIssues; track issue) {
+ - {{ issue }}
+ }
+
+
+ }
+
+ @if (build.error_message) {
+ Error: {{ build.error_message }}
+ }
+
+ Artifacts
+
+ @for (artifact of build.artifacts; track artifact.id) {
+
+
+
{{ artifact.file_name }}
+
{{ artifact.platform }} • {{ artifact.artifact_type }} • {{
+ artifact.sha256.slice(0, 12) }}…
+
+
Download
+
+ } @empty {
+
No artifacts available yet.
+ }
+
+
+ Build Log
+ {{ build.build_log || 'No logs yet.' }}
+
+ }
+
}
@if (activeTab() === 'stats') {
-
+
}
@if (showShowForm) {
-
+
}
@if (showEventForm) {
-
+
}
@if (showStationForm) {
-
+
}
@if (showHistoryForm) {
-
+
}
@if (showTeamForm) {
-
+
}
@if (showCommunityForm) {
-
+
}
@if (showUnderwriterForm) {
-
+
}
\ No newline at end of file
diff --git a/src/app/admin/admin.component.scss b/src/app/admin/admin.component.scss
index d771886..02f85e4 100644
--- a/src/app/admin/admin.component.scss
+++ b/src/app/admin/admin.component.scss
@@ -547,4 +547,4 @@
.action-group {
flex-wrap: wrap;
}
-}
+}
\ No newline at end of file