Admin Dashboard

Manage shows, events, history, team, and community content

@if (activeTab() === 'shows') { @if (shows$ | async; as shows) {

Shows ({{ shows.length }})

@for (show of shows; track show.id) { } @empty { }
Order Title Host Genre Slots Actions
{{ show.display_order }} {{ show.title }} {{ show.host }} {{ show.genre }} @for (slot of show.schedules; track slot.id) { {{ slot.day_label.charAt(0) }} {{ slot.time }} }
No shows yet. Click "Add Show" to create one.
} } @if (activeTab() === 'events') { @if (events$ | async; as events) {

Events ({{ events.length }})

@for (event of events; track event.id) { } @empty { }
Date Title Location Active Actions
{{ event.date }} {{ event.title }} {{ event.location }} {{ event.active ? 'Yes' : 'No' }}
No events yet. Click "Add Event" to create one.
} } @if (activeTab() === 'history') { @if (historyEntries$ | async; as entries) {

History Timeline ({{ entries.length }})

@for (entry of entries; track entry.id) { } @empty { }
Year Title Order Active Actions
{{ entry.year }} {{ entry.title }} {{ entry.display_order }} {{ entry.active ? 'Yes' : 'No' }}
No history entries yet. Click "Add Entry" to create one.
} } @if (activeTab() === 'team') { @if (teamMembers$ | async; as members) {

Team Members ({{ members.length }})

@for (member of members; track member.id) { } @empty { }
Name Title Order Active Actions
{{ member.name }} {{ member.title }} {{ member.display_order }} {{ member.active ? 'Yes' : 'No' }}
No team members yet. Click "Add Member" to create one.
} } @if (activeTab() === 'community') { @if (communityHighlights$ | async; as highlights) {

Community Highlights ({{ highlights.length }})

@for (highlight of highlights; track highlight.id) { } @empty { }
Icon Title Order Active Actions
{{ highlight.icon }} {{ highlight.title }} {{ highlight.display_order }} {{ highlight.active ? 'Yes' : 'No' }}
No highlights yet. Click "Add Highlight" to create one.
} } @if (activeTab() === 'station') { @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)' }}
} } @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') { ✓ }
}
} @if (activeTab() === 'underwriters') { @if (underwriters$ | async; as underwriters) {

Underwriters ({{ underwriters.length }})

@for (uw of underwriters; track uw.id) { } @empty { }
Name Description Website Order Active Actions
{{ uw.name }} {{ uw.description }} @if (uw.website_url) { {{ uw.website_url }} } @else { — } {{ uw.display_order }} {{ uw.active ? 'Yes' : 'No' }}
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.

}

Theme Export

@if (themeJsonStatus$ | async; as status) { @if (status.exists) {
theme.json — ready
Path: {{ status.path }}
Generated: {{ status.generated_at }}
Size: {{ status.size }} bytes
} @else {

theme.json not found at {{ status.path }}

Regenerate to create it from the current station config.

} } @else { @if (themeJsonLoading$ | async) {

Loading...

} }

Create Build Request

Required Files

@if (mobileBuildStatusMessage) {

{{ mobileBuildStatusMessage }}

} @if (mobileBuildErrorMessage) {

{{ mobileBuildErrorMessage }}

}

Build Requests

@if (mobileBuilds$ | async; as builds) { @for (build of builds; track build.id) { } @empty { }
ID Platforms Version Status Preflight Actions
#{{ 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' }}
No build requests yet.
}
@if (selectedMobileBuild; as build) {

Selected Request #{{ build.id }}

@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) { }