Plugin Directory

Changeset 3490312


Ignore:
Timestamp:
03/24/2026 07:15:09 PM (8 days ago)
Author:
bmltenabled
Message:

Deploy version 1.8.8

Location:
mayo-events-manager
Files:
213 added
12 edited

Legend:

Unmodified
Added
Removed
  • mayo-events-manager/trunk/CLAUDE.md

    r3446645 r3490312  
    101101
    102102### How to Update
    103 1. **Add a new version section** at the top of the changelog (after `== Changelog ==`)
    104 2. **Increment version number** appropriately:
    105    - Patch (X.X.1): Bug fixes, minor improvements
    106    - Minor (X.1.0): New features, non-breaking changes
    107    - Major (1.X.0): Breaking changes, major rewrites
    108 3. **Write clear, user-focused descriptions**:
     1031. **Add entries to the current (unreleased) version section** at the top of the changelog. Do NOT create a new version section or bump version numbers unless explicitly asked — versions are only bumped at release time.
     1042. **Write clear, user-focused descriptions**:
    109105   - Start with action words (Fixed, Added, Improved, etc.)
    110106   - Describe the user impact, not technical details
     
    123119
    124120### Version Consistency
    125 Also update the version number in:
     121Only bump version numbers when explicitly asked to cut a release. When bumping, update in:
    126122- `mayo-events-manager.php` (line 23: `MAYO_VERSION` constant)
    127123- `readme.txt` (line 8: `Stable tag`)
  • mayo-events-manager/trunk/assets/css/admin.css

    r3432200 r3490312  
    429429}
    430430
     431.mayo-source-id-row {
     432    display: inline-flex;
     433    align-items: center;
     434    gap: 8px;
     435    margin-bottom: 8px;
     436}
     437
    431438.mayo-source-id {
    432439    font-family: monospace;
     
    437444    border-radius: 3px;
    438445    border: 1px solid #c5d9ed;
     446    user-select: all;
     447}
     448
     449.mayo-copy-id {
     450    display: inline-flex;
     451    align-items: center;
     452    padding: 2px 4px;
     453    background: none;
     454    border: 1px solid #c5d9ed;
     455    border-radius: 3px;
     456    cursor: pointer;
     457    color: #2271b1;
     458}
     459
     460.mayo-copy-id:hover {
     461    background: #f0f7fc;
    439462}
    440463
  • mayo-events-manager/trunk/assets/js/dist/admin.bundle.js

    r3442218 r3490312  
    11/*! For license information please see admin.bundle.js.LICENSE.txt */
    2 (()=>{"use strict";const e=wp.element,t=function(){return React.createElement("div",{className:"wrap mayo-docs"},React.createElement("h1",null,"Shortcodes"),React.createElement("div",{className:"card",style:{marginBottom:"20px"}},React.createElement("h2",null,"Table of Contents"),React.createElement("ul",{style:{listStyle:"disc",marginLeft:"20px",lineHeight:"2"}},React.createElement("li",null,React.createElement("a",{href:"#event-list"},"[mayo_event_list] - Event List Shortcode")),React.createElement("li",null,React.createElement("a",{href:"#event-form"},"[mayo_event_form] - Event Submission Form Shortcode")),React.createElement("li",null,React.createElement("a",{href:"#announcement"},"[mayo_announcement] - Announcement Shortcode")),React.createElement("li",null,React.createElement("a",{href:"#announcement-form"},"[mayo_announcement_form] - Announcement Submission Form Shortcode")),React.createElement("li",null,React.createElement("a",{href:"#subscribe"},"[mayo_subscribe] - Email Subscription Form Shortcode")))),React.createElement("div",{className:"card",id:"event-list"},React.createElement("h2",null,"Event List Shortcode"),React.createElement("p",null,"Use this shortcode to display a list of upcoming events:"),React.createElement("pre",null,React.createElement("code",null,"[mayo_event_list]")),React.createElement("h3",null,"Optional Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Description"),React.createElement("th",null,"Default"),React.createElement("th",null,"Options"),React.createElement("th",null,"Overridable via Querystring?"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,"infinite_scroll"),React.createElement("td",null,"Enable automatic loading of more events as user scrolls down the page"),React.createElement("td",null,"true"),React.createElement("td",null,"true, false"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"autoexpand"),React.createElement("td",null,"Automatically expand all events when the page loads"),React.createElement("td",null,"false"),React.createElement("td",null,"true, false"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"categories"),React.createElement("td",null,"Filter by category slugs (comma-separated). Prefix a slug with a minus sign (-) to exclude it."),React.createElement("td",null,"empty (all categories)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"meetings,workshops")," or ",React.createElement("pre",null,"-meetings,-workshops")," (exclude meetings and workshops)"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"category_relation"),React.createElement("td",null,"How to match multiple categories: AND (must have all) or OR (must have any)"),React.createElement("td",null,"OR"),React.createElement("td",null,"AND, OR"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"tags"),React.createElement("td",null,"Filter by tag slugs (comma-separated). Prefix a slug with a minus sign (-) to exclude it."),React.createElement("td",null,"empty (all tags)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"featured,ticketed")," (include only featured or ticketed), ",React.createElement("pre",null,"featured+ticketed")," (is an and condition), or ",React.createElement("pre",null,"-featured,-ticketed")," (exclude featured and ticketed). For more information see the Wordpress documentation on ",React.createElement("a",{target:"_blank",href:"https://developer.wordpress.org/reference/classes/wp_query/#tag-parameters"},"Tag Parameters"),"."),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"event_type"),React.createElement("td",null,"Filter by event type"),React.createElement("td",null,"empty (all types)"),React.createElement("td",null,"Service, Activity"),React.createElement("td",null,"Yes (only one event type at a time)")),React.createElement("tr",null,React.createElement("td",null,"time_format"),React.createElement("td",null,"Format for displaying time"),React.createElement("td",null,"12hour"),React.createElement("td",null,"12hour, 24hour"),React.createElement("td",null,"No")),React.createElement("tr",null,React.createElement("td",null,"per_page"),React.createElement("td",null,"Number of events to show per page"),React.createElement("td",null,"10"),React.createElement("td",null,"Any positive number"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"status"),React.createElement("td",null,"Shows events with a given status"),React.createElement("td",null,"publish"),React.createElement("td",null,"publish, pending"),React.createElement("td",null,"Yes (only one status at a time)")),React.createElement("tr",null,React.createElement("td",null,"service_body"),React.createElement("td",null,"Filter events by service body IDs (comma-separated)"),React.createElement("td",null,"empty (all service bodies)"),React.createElement("td",null,'e.g., "1,2,3" (shows events from any of the specified service bodies)'),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"source_ids"),React.createElement("td",null,"Filter events by source IDs (comma-separated)"),React.createElement("td",null,"empty (local events only)"),React.createElement("td",null,'e.g., "local,source_123,source_456"'),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"archive"),React.createElement("td",null,"Show only past events that have completely ended (excluding current and future events)"),React.createElement("td",null,"false"),React.createElement("td",null,"true, false"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"order"),React.createElement("td",null,"Sort order for events by start date and time"),React.createElement("td",null,"ASC"),React.createElement("td",null,"ASC (earliest first), DESC (latest first)"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"timezone"),React.createElement("td",null,"Timezone to use for date filtering"),React.createElement("td",null,"Browser's timezone"),React.createElement("td",null,'Any valid IANA timezone (e.g., "America/New_York", "Europe/London")'),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"view"),React.createElement("td",null,"Default view mode for displaying events"),React.createElement("td",null,"list"),React.createElement("td",null,"list, calendar"),React.createElement("td",null,"Yes")))),React.createElement("h3",null,"Example with Parameters"),React.createElement("pre",null,React.createElement("code",null,'[mayo_event_list time_format="24hour" per_page="5" categories="meetings,workshops" tags="featured" event_type="Service" service_body="1,2,3" source_ids="local,source_123" archive="false" order="ASC" timezone="America/New_York" view="calendar"]')),React.createElement("h3",null,"Example with Category/Tag Exclusions"),React.createElement("pre",null,React.createElement("code",null,'[mayo_event_list categories="-announcements,-alerts" tags="-archived"]')),React.createElement("p",null,React.createElement("em",null,'Shows all events except those with the "announcements" or "alerts" categories, and excludes the "archived" tag.')),React.createElement("h3",null,"Example with Querystring Overrides"),React.createElement("pre",null,React.createElement("code",null,'https://example.com/events?status=pending&categories=meetings,workshops&event_type=Service&service_body="1,2,3"&source_ids=local,source_123&archive=true&order=DESC&timezone=America/New_York&infinite_scroll=false&per_page=20&view=calendar')),React.createElement("h3",null,"Notes"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Prefix category or tag slugs with a minus sign (-) to exclude them from the event list"),React.createElement("li",null,"You can mix inclusions and exclusions: ",React.createElement("code",null,'categories="meetings,-cancelled"')," shows meetings but not cancelled ones"),React.createElement("li",null,"The ",React.createElement("code",null,"view")," parameter allows you to display events in either a list or calendar format. Users can toggle between views using the buttons in the header."),React.createElement("li",null,"Local events are always included by default unless specifically excluded"),React.createElement("li",null,"To include only local events, use ",React.createElement("code",null,'source_ids="local"')),React.createElement("li",null,"To exclude local events, specify only external source IDs (e.g., ",React.createElement("code",null,'source_ids="source_123,source_456"'),")"),React.createElement("li",null,"To include all events (local and external), leave source_ids empty"),React.createElement("li",null,"When ",React.createElement("code",null,'archive="true"'),", only past events that have completely ended will be shown (excludes current and future events)"),React.createElement("li",null,"When ",React.createElement("code",null,'archive="false"')," (default), only upcoming and ongoing events will be shown"),React.createElement("li",null,"Use ",React.createElement("code",null,'order="DESC"')," with ",React.createElement("code",null,'archive="true"')," to show most recent past events first"),React.createElement("li",null,"Use ",React.createElement("code",null,'order="ASC"')," (default) to show events in chronological order (earliest first)"),React.createElement("li",null,"The ",React.createElement("code",null,"timezone")," parameter ensures date filtering is accurate across different time zones"),React.createElement("li",null,"Events are loaded using infinite scroll automatically as the user scrolls down the page"))),React.createElement("div",{className:"card",id:"event-form"},React.createElement("h2",null,"Event Submission Form Shortcode"),React.createElement("p",null,"The Event Submission Form Shortcode allows users to submit new events to your site. The form includes fields for event name, type, start date, end date, and more."),React.createElement("p",null,"When a new event is submitted, an email notification will be sent to the email addresses configured in the plugin settings. Multiple email addresses can be specified, separated by commas or semicolons."),React.createElement("h3",null,"Shortcode"),React.createElement("code",null,"[mayo_event_form]"),React.createElement("h3",null,"Default Required Fields"),React.createElement("p",null,"The following fields are always required and cannot be overridden:"),React.createElement("ul",null,React.createElement("li",null,"Event Name (event_name)"),React.createElement("li",null,"Event Type (event_type)"),React.createElement("li",null,"Service Body (service_body)"),React.createElement("li",null,"Email (email)"),React.createElement("li",null,"Start Date (event_start_date)"),React.createElement("li",null,"Start Time (event_start_time)"),React.createElement("li",null,"End Date (event_end_date)"),React.createElement("li",null,"End Time (event_end_time)"),React.createElement("li",null,"Timezone (timezone)")),React.createElement("h3",null,"Optional Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Description"),React.createElement("th",null,"Default"),React.createElement("th",null,"Available Fields"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,"additional_required_fields"),React.createElement("td",null,"Comma-separated list of additional fields that should be required"),React.createElement("td",null,"empty (no additional required fields)"),React.createElement("td",null,React.createElement("ul",null,React.createElement("li",null,"description"),React.createElement("li",null,"location_name"),React.createElement("li",null,"location_address"),React.createElement("li",null,"location_details"),React.createElement("li",null,"flyer")))),React.createElement("tr",null,React.createElement("td",null,"categories"),React.createElement("td",null,"Comma-separated list of category slugs that should be available in the form. Prefix a category with a minus sign (-) to exclude it."),React.createElement("td",null,"empty (all categories)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"meetings,workshops")," to show only meetings and workshops, or ",React.createElement("pre",null,"-meetings,-workshops")," to show all categories except meetings and workshops")),React.createElement("tr",null,React.createElement("td",null,"tags"),React.createElement("td",null,"Comma-separated list of tag slugs that should be available in the form. Prefix a tag with a minus sign (-) to exclude it. Tag slugs are always compared in lowercase."),React.createElement("td",null,"empty (all tags)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"featured,ticketed")," to show only featured and ticketed tags, or ",React.createElement("pre",null,"-featured,-ticketed")," to show all tags except featured and ticketed")),React.createElement("tr",null,React.createElement("td",null,"default_service_bodies"),React.createElement("td",null,"Comma-separated list of service body IDs to restrict the form to specific service bodies. Perfect for multi-site setups where each site should only allow events for specific service bodies."),React.createElement("td",null,"empty (all service bodies)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"1,2,3")," to allow only service bodies 1, 2, and 3, or ",React.createElement("pre",null,"0")," for only Unaffiliated events. If only one service body is specified, the field will be hidden and auto-selected.")))),React.createElement("h3",null,"Examples"),React.createElement("h4",null,"Standard Form with Additional Requirements"),React.createElement("pre",null,React.createElement("code",null,'[mayo_event_form additional_required_fields="flyer,location_name,location_address" categories="meetings,workshops" tags="featured,-ticketed"]')),React.createElement("h4",null,"Multi-Site Configuration - Restrict to Specific Service Bodies"),React.createElement("pre",null,React.createElement("code",null,'[mayo_event_form default_service_bodies="1,2,5" categories="meetings"]')),React.createElement("p",null,React.createElement("em",null,"Perfect for multi-site setups where each subsite should only allow events for specific service bodies.")),React.createElement("h4",null,"Single Service Body (Auto-Hidden)"),React.createElement("pre",null,React.createElement("code",null,'[mayo_event_form default_service_bodies="3"]')),React.createElement("p",null,React.createElement("em",null,"When only one service body is specified, the service body field is hidden and automatically selected.")),React.createElement("h3",null,"Notes"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Default required fields are always enforced"),React.createElement("li",null,"Additional required fields will be marked with an asterisk (*)"),React.createElement("li",null,"Form validation will ensure all required fields are filled"))),React.createElement("div",{className:"card",id:"announcement"},React.createElement("h2",null,"Announcement Shortcode"),React.createElement("p",null,"Use this shortcode to display announcements as banners or modals. Announcements are managed separately from events and are useful for:"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Meeting closures or changes"),React.createElement("li",null,"Weather alerts"),React.createElement("li",null,"Breaking news or important updates"),React.createElement("li",null,"Promoting upcoming events (can be linked to events)"),React.createElement("li",null,"Post-event thank you messages")),React.createElement("pre",null,React.createElement("code",null,"[mayo_announcement]")),React.createElement("h3",null,"How It Works"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Announcements have their own display window (",React.createElement("code",null,"display_start_date")," and ",React.createElement("code",null,"display_end_date"),")"),React.createElement("li",null,"Can optionally be linked to one or more events"),React.createElement("li",null,"Priority levels (low/normal/high/urgent) affect display order and styling"),React.createElement("li",null,React.createElement("strong",null,"Banner mode:")," Shows a fixed bar at the top of the viewport with carousel navigation for multiple announcements"),React.createElement("li",null,React.createElement("strong",null,"Modal mode:")," Shows a centered popup with a list of all matching announcements"),React.createElement("li",null,"When dismissed, announcements stay hidden for 24 hours but can be re-opened via a bell icon in the bottom-right corner")),React.createElement("h3",null,"Optional Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Description"),React.createElement("th",null,"Default"),React.createElement("th",null,"Options"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,"mode"),React.createElement("td",null,"Display mode for announcements"),React.createElement("td",null,"banner"),React.createElement("td",null,"banner (sticky top bar), modal (popup)")),React.createElement("tr",null,React.createElement("td",null,"categories"),React.createElement("td",null,"Filter by category slugs (comma-separated)"),React.createElement("td",null,"empty (all categories)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"announcements,alerts"))),React.createElement("tr",null,React.createElement("td",null,"category_relation"),React.createElement("td",null,"How to match multiple categories: AND (must have all) or OR (must have any)"),React.createElement("td",null,"OR"),React.createElement("td",null,"AND, OR")),React.createElement("tr",null,React.createElement("td",null,"tags"),React.createElement("td",null,"Filter by tag slugs (comma-separated)"),React.createElement("td",null,"empty (all tags)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"urgent,featured")," (include only urgent or featured), ",React.createElement("pre",null,"urgent+featured")," (is an and condition), or ",React.createElement("pre",null,"-urgent,-featured")," (exclude urgent and featured)")),React.createElement("tr",null,React.createElement("td",null,"priority"),React.createElement("td",null,"Filter by priority level"),React.createElement("td",null,"empty (all priorities)"),React.createElement("td",null,"low, normal, high, urgent")),React.createElement("tr",null,React.createElement("td",null,"show_linked_events"),React.createElement("td",null,"Show linked event titles with the announcement"),React.createElement("td",null,"false"),React.createElement("td",null,"true, false")),React.createElement("tr",null,React.createElement("td",null,"time_format"),React.createElement("td",null,"Format for displaying time"),React.createElement("td",null,"12hour"),React.createElement("td",null,"12hour, 24hour")),React.createElement("tr",null,React.createElement("td",null,"background_color"),React.createElement("td",null,"Custom background color for the banner/modal header/bell icon"),React.createElement("td",null,"empty (uses CSS default)"),React.createElement("td",null,"Any hex color, e.g., ",React.createElement("pre",null,"#ff6600"))),React.createElement("tr",null,React.createElement("td",null,"text_color"),React.createElement("td",null,"Custom text color for the banner/modal header/bell icon"),React.createElement("td",null,"empty (uses CSS default)"),React.createElement("td",null,"Any hex color, e.g., ",React.createElement("pre",null,"#ffffff"))),React.createElement("tr",null,React.createElement("td",null,"orderby"),React.createElement("td",null,"Field to sort announcements by"),React.createElement("td",null,"date"),React.createElement("td",null,"date (display start date), title (alphabetical), created (post creation date)")),React.createElement("tr",null,React.createElement("td",null,"order"),React.createElement("td",null,"Sort direction"),React.createElement("td",null,"DESC for date/created, ASC for title"),React.createElement("td",null,"ASC (ascending), DESC (descending)")))),React.createElement("h3",null,"Examples"),React.createElement("h4",null,"Default Banner Mode"),React.createElement("pre",null,React.createElement("code",null,"[mayo_announcement]")),React.createElement("h4",null,"Modal Popup"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement mode="modal"]')),React.createElement("h4",null,"Filter by Category"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement categories="announcements,alerts"]')),React.createElement("h4",null,"Show Only Urgent Announcements"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement priority="urgent"]')),React.createElement("h4",null,"Show Linked Events"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement show_linked_events="true"]')),React.createElement("h4",null,"Combined Parameters"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement mode="banner" categories="announcements" tags="urgent" priority="high" time_format="24hour"]')),React.createElement("h4",null,"Custom Colors"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement background_color="#ff6600" text_color="#ffffff"]')),React.createElement("h4",null,"Red Alert Style"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement background_color="#dc3545" text_color="#fff" priority="urgent"]')),React.createElement("h4",null,"Sort by Title (Alphabetical)"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement orderby="title"]')),React.createElement("h4",null,"Sort by Created Date (Newest First)"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement orderby="created" order="DESC"]')),React.createElement("h3",null,"Widget Usage"),React.createElement("p",null,"For site-wide announcements without editing templates, use the ",React.createElement("strong",null,'"Mayo Event Announcements"')," widget:"),React.createElement("ol",null,React.createElement("li",null,"Go to ",React.createElement("strong",null,"Appearance → Widgets")),React.createElement("li",null,'Add the "Mayo Event Announcements" widget to any widget area (footer recommended for site-wide display)'),React.createElement("li",null,"Configure the display mode, categories, tags, priority, and time format")),React.createElement("h3",null,"Creating Announcements"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Go to ",React.createElement("strong",null,"Mayo → Announcements → Add New")),React.createElement("li",null,"Enter the announcement title and content"),React.createElement("li",null,"Set the ",React.createElement("strong",null,"Display Start Date")," to when you want the announcement to start showing"),React.createElement("li",null,"Set the ",React.createElement("strong",null,"Display End Date")," to when you want the announcement to stop showing"),React.createElement("li",null,"Choose a ",React.createElement("strong",null,"Priority Level")," (urgent announcements appear first)"),React.createElement("li",null,"Optionally ",React.createElement("strong",null,"link to events")," if this announcement relates to specific events")),React.createElement("h3",null,"Linking Events"),React.createElement("p",null,"Announcements can be linked to events in two ways:"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("strong",null,"From the Announcement editor:"),' Search and add events in the "Linked Events" panel'),React.createElement("li",null,React.createElement("strong",null,"From the Event editor:"),' Click "Create Announcement for This Event" in the "Linked Announcements" panel')),React.createElement("h3",null,"Notes"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Announcements have independent display windows from events"),React.createElement("li",null,"Use announcements to promote events before they start, or recap after they end"),React.createElement("li",null,"Priority levels: ",React.createElement("strong",null,"urgent")," (red), ",React.createElement("strong",null,"high")," (orange), ",React.createElement("strong",null,"normal")," (blue), ",React.createElement("strong",null,"low")," (gray)"),React.createElement("li",null,"Use categories or tags to control which announcements appear"),React.createElement("li",null,"Multiple announcements are shown as a carousel in banner mode, or as a list in modal mode"))),React.createElement("div",{className:"card",id:"announcement-form"},React.createElement("h2",null,"Announcement Submission Form Shortcode"),React.createElement("p",null,"The Announcement Submission Form Shortcode allows users to submit new announcements to your site. This works similarly to the event form but for announcements."),React.createElement("p",null,'When a new announcement is submitted, an email notification will be sent to the email addresses configured in the plugin settings. The announcement will have a "pending" status until approved by an administrator.'),React.createElement("h3",null,"Shortcode"),React.createElement("code",null,"[mayo_announcement_form]"),React.createElement("h3",null,"Default Required Fields"),React.createElement("p",null,"The following fields are always required:"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Announcement Title (title)"),React.createElement("li",null,"Description (description)"),React.createElement("li",null,"Service Body (service_body)"),React.createElement("li",null,"Point of Contact Name (contact_name)"),React.createElement("li",null,"Point of Contact Email (email)")),React.createElement("h3",null,"Optional Fields"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Start Date (start_date) - When the announcement should start displaying"),React.createElement("li",null,"Start Time (start_time) - Time of day the announcement should start"),React.createElement("li",null,"End Date (end_date) - When the announcement should stop displaying"),React.createElement("li",null,"End Time (end_time) - Time of day the announcement should end"),React.createElement("li",null,"Image/Flyer (flyer) - An image attachment for the announcement"),React.createElement("li",null,"Categories - Standard WordPress categories"),React.createElement("li",null,"Tags - Standard WordPress tags")),React.createElement("h3",null,"Optional Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Description"),React.createElement("th",null,"Default"),React.createElement("th",null,"Options"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,"additional_required_fields"),React.createElement("td",null,"Comma-separated list of additional fields that should be required"),React.createElement("td",null,"empty (no additional required fields)"),React.createElement("td",null,React.createElement("ul",null,React.createElement("li",null,"start_date"),React.createElement("li",null,"start_time"),React.createElement("li",null,"end_date"),React.createElement("li",null,"end_time"),React.createElement("li",null,"flyer")))),React.createElement("tr",null,React.createElement("td",null,"categories"),React.createElement("td",null,"Comma-separated list of category slugs that should be available in the form. Prefix a category with a minus sign (-) to exclude it."),React.createElement("td",null,"empty (uses subscription settings)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"announcements,alerts")," or ",React.createElement("pre",null,"-internal"))),React.createElement("tr",null,React.createElement("td",null,"tags"),React.createElement("td",null,"Comma-separated list of tag slugs that should be available in the form. Prefix a tag with a minus sign (-) to exclude it."),React.createElement("td",null,"empty (uses subscription settings)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"urgent,featured")," or ",React.createElement("pre",null,"-archived"))),React.createElement("tr",null,React.createElement("td",null,"default_service_bodies"),React.createElement("td",null,"Comma-separated list of service body IDs to restrict the form to specific service bodies."),React.createElement("td",null,"empty (uses subscription settings)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"1,2,3")," or ",React.createElement("pre",null,"0")," for Unaffiliated. If only one is specified, the field is hidden and auto-selected.")),React.createElement("tr",null,React.createElement("td",null,"show_flyer"),React.createElement("td",null,"Show the image/flyer upload field"),React.createElement("td",null,"false"),React.createElement("td",null,"true, false")))),React.createElement("h3",null,"Examples"),React.createElement("h4",null,"Basic Form"),React.createElement("pre",null,React.createElement("code",null,"[mayo_announcement_form]")),React.createElement("h4",null,"With Flyer Upload"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form show_flyer="true"]')),React.createElement("h4",null,"With Required Dates"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form additional_required_fields="start_date,end_date"]')),React.createElement("h4",null,"Restricted to Specific Service Bodies"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form default_service_bodies="1,2,5"]')),React.createElement("h4",null,"Single Service Body (Auto-Hidden)"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form default_service_bodies="3"]')),React.createElement("p",null,React.createElement("em",null,"When only one service body is specified, the field is hidden and automatically selected.")),React.createElement("h4",null,"Filter Categories and Tags"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form categories="announcements,alerts" tags="urgent,featured"]')),React.createElement("h4",null,"Full Configuration"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form show_flyer="true" additional_required_fields="start_date,end_date,flyer" default_service_bodies="1,2" categories="announcements"]')),React.createElement("h3",null,"Notes"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Categories, tags, and service bodies are filtered by subscription settings configured in ",React.createElement("strong",null,"Mayo → Settings → Subscription Preferences")),React.createElement("li",null,"Shortcode parameters further restrict the available options (intersection of both)"),React.createElement("li",null,"Contact name and email are private fields used for admin communication only"),React.createElement("li",null,'Submitted announcements are set to "pending" status and require admin approval'),React.createElement("li",null,"Admin receives email notification when new announcements are submitted"),React.createElement("li",null,"Start/end dates correspond to the announcement's display window"))),React.createElement("div",{className:"card",id:"subscribe"},React.createElement("h2",null,"Email Subscription Form Shortcode"),React.createElement("p",null,"Use this shortcode to display an email subscription form. Users can subscribe to receive announcement notifications via email:"),React.createElement("pre",null,React.createElement("code",null,"[mayo_subscribe]")),React.createElement("h3",null,"How It Works"),React.createElement("ol",{style:{marginLeft:"20px",lineHeight:"1.8"}},React.createElement("li",null,React.createElement("strong",null,"User enters email:")," A simple form with an email input field"),React.createElement("li",null,React.createElement("strong",null,"Confirmation email sent:")," User receives an email with a confirmation link (double opt-in)"),React.createElement("li",null,React.createElement("strong",null,"User confirms:")," Clicking the link activates their subscription"),React.createElement("li",null,React.createElement("strong",null,"Receive announcements:")," When announcements are published, subscribers get an email with the full content"),React.createElement("li",null,React.createElement("strong",null,"Easy unsubscribe:")," Each email includes a one-click unsubscribe link")),React.createElement("h3",null,"Features"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("strong",null,"Double opt-in:")," Confirmation email ensures valid addresses and prevents spam"),React.createElement("li",null,React.createElement("strong",null,"Full content delivery:")," Announcement emails include the complete content plus a link to view on site"),React.createElement("li",null,React.createElement("strong",null,"Token-based security:")," Unsubscribe links use cryptographically secure tokens (no login required)"),React.createElement("li",null,React.createElement("strong",null,"Spam folder reminder:")," Users are reminded to check spam/junk folders for the confirmation email"),React.createElement("li",null,React.createElement("strong",null,"Re-subscription support:")," Previously unsubscribed users can re-subscribe")),React.createElement("h3",null,"Example"),React.createElement("pre",null,React.createElement("code",null,"[mayo_subscribe]")),React.createElement("h3",null,"Email Flow"),React.createElement("h4",null,"Confirmation Email"),React.createElement("p",null,"Sent immediately when a user subscribes:"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,'Subject: "Please confirm your subscription to [Site Name] announcements"'),React.createElement("li",null,"Contains a unique confirmation link"),React.createElement("li",null,"Includes note about checking spam folder")),React.createElement("h4",null,"Announcement Email"),React.createElement("p",null,"Sent to all confirmed subscribers when an announcement is published:"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,'Subject: "[Site Name] [Announcement Title]"'),React.createElement("li",null,"Full announcement content in plain text"),React.createElement("li",null,"Link to view on site"),React.createElement("li",null,"One-click unsubscribe link")),React.createElement("h3",null,"Notes"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Emails are sent using WordPress's ",React.createElement("code",null,"wp_mail()")," function"),React.createElement("li",null,'The "From" address uses your WordPress email settings'),React.createElement("li",null,"Subscribers are stored in a custom database table (",React.createElement("code",null,"wp_mayo_subscribers"),")"),React.createElement("li",null,"Emails are only sent when announcements are first published (not on updates)"),React.createElement("li",null,"The preferences column is reserved for future filtering options"))))},n=wp.components;function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function l(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",c=n.toStringTag||"@@toStringTag";function o(n,a,l,c){var o=a&&a.prototype instanceof u?a:u,s=Object.create(o.prototype);return r(s,"_invoke",function(n,a,l){var r,c,o,u=0,s=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,c=0,o=e,d.n=n,i}};function p(n,a){for(c=n,o=a,t=0;!m&&u&&!l&&t<s.length;t++){var l,r=s[t],p=d.p,E=r[2];n>3?(l=E===a)&&(o=r[(c=r[4])?5:(c=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(c=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,c=0))}if(l||n>1)return i;throw m=!0,a}return function(l,s,E){if(u>1)throw TypeError("Generator is already running");for(m&&1===s&&p(s,E),c=s,o=E;(t=c<2?e:o)||!m;){r||(c?c<3?(c>1&&(d.n=-1),p(c,o)):d.n=o:d.v=o);try{if(u=2,r){if(c||(l="next"),t=r[l]){if(!(t=t.call(r,o)))throw TypeError("iterator result is not an object");if(!t.done)return t;o=t.value,c<2&&(c=0)}else 1===c&&(t=r.return)&&t.call(r),c<2&&(o=TypeError("The iterator does not provide a '"+l+"' method"),c=1);r=e}else if((t=(m=d.n<0)?o:n.call(a,d))!==i)break}catch(t){r=e,c=1,o=t}finally{u=1}}return{value:t,done:m}}}(n,l,c),!0),s}var i={};function u(){}function s(){}function m(){}t=Object.getPrototypeOf;var d=[][a]?t(t([][a]())):(r(t={},a,function(){return this}),t),p=m.prototype=u.prototype=Object.create(d);function E(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,m):(e.__proto__=m,r(e,c,"GeneratorFunction")),e.prototype=Object.create(p),e}return s.prototype=m,r(p,"constructor",m),r(m,"constructor",s),s.displayName="GeneratorFunction",r(m,c,"GeneratorFunction"),r(p),r(p,c,"Generator"),r(p,a,function(){return this}),r(p,"toString",function(){return"[object Generator]"}),(l=function(){return{w:o,m:E}})()}function r(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}r=function(e,t,n,a){function c(t,n){r(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(c("next",0),c("throw",1),c("return",2))},r(e,t,n,a)}function c(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?c(Object(n),!0).forEach(function(t){i(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):c(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function i(e,t,n){return(t=function(e){var t=function(e){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=a(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==a(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function u(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}var s=function(){var e,t=(e=l().m(function e(t){var n,a,r,c,i,u,s,m,d,p=arguments;return l().w(function(e){for(;;)switch(e.p=e.n){case 0:return r=p.length>1&&void 0!==p[1]?p[1]:{},(c=(null===(n=window.mayoApiSettings)||void 0===n?void 0:n.root)||(null===(a=window.wpApiSettings)||void 0===a?void 0:a.root)||"/wp-json/").endsWith("/")||(c+="/"),i="".concat(c,"event-manager/v1").concat(t),u="",window.mayoApiSettings&&window.mayoApiSettings.nonce?u=window.mayoApiSettings.nonce:window.wpApiSettings&&window.wpApiSettings.nonce&&(u=window.wpApiSettings.nonce),s=o(o({},{credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":u}}),r),e.p=1,e.n=2,fetch(i,s);case 2:if((m=e.v).ok){e.n=3;break}throw new Error("API error: ".concat(m.status," ").concat(m.statusText));case 3:return e.n=4,m.json();case 4:return e.a(2,e.v);case 5:throw e.p=5,d=e.v,console.error("API fetch error:",d),d;case 6:return e.a(2)}},e,null,[[1,5]])}),function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){u(r,a,l,c,o,"next",e)}function o(e){u(r,a,l,c,o,"throw",e)}c(void 0)})});return function(e){return t.apply(this,arguments)}}();function m(e){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m(e)}function d(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",l=n.toStringTag||"@@toStringTag";function r(n,a,l,r){var i=a&&a.prototype instanceof o?a:o,u=Object.create(i.prototype);return p(u,"_invoke",function(n,a,l){var r,o,i,u=0,s=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,o=0,i=e,d.n=n,c}};function p(n,a){for(o=n,i=a,t=0;!m&&u&&!l&&t<s.length;t++){var l,r=s[t],p=d.p,E=r[2];n>3?(l=E===a)&&(i=r[(o=r[4])?5:(o=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(o=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,o=0))}if(l||n>1)return c;throw m=!0,a}return function(l,s,E){if(u>1)throw TypeError("Generator is already running");for(m&&1===s&&p(s,E),o=s,i=E;(t=o<2?e:i)||!m;){r||(o?o<3?(o>1&&(d.n=-1),p(o,i)):d.n=i:d.v=i);try{if(u=2,r){if(o||(l="next"),t=r[l]){if(!(t=t.call(r,i)))throw TypeError("iterator result is not an object");if(!t.done)return t;i=t.value,o<2&&(o=0)}else 1===o&&(t=r.return)&&t.call(r),o<2&&(i=TypeError("The iterator does not provide a '"+l+"' method"),o=1);r=e}else if((t=(m=d.n<0)?i:n.call(a,d))!==c)break}catch(t){r=e,o=1,i=t}finally{u=1}}return{value:t,done:m}}}(n,l,r),!0),u}var c={};function o(){}function i(){}function u(){}t=Object.getPrototypeOf;var s=[][a]?t(t([][a]())):(p(t={},a,function(){return this}),t),m=u.prototype=o.prototype=Object.create(s);function E(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,u):(e.__proto__=u,p(e,l,"GeneratorFunction")),e.prototype=Object.create(m),e}return i.prototype=u,p(m,"constructor",u),p(u,"constructor",i),i.displayName="GeneratorFunction",p(u,l,"GeneratorFunction"),p(m),p(m,l,"Generator"),p(m,a,function(){return this}),p(m,"toString",function(){return"[object Generator]"}),(d=function(){return{w:r,m:E}})()}function p(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}p=function(e,t,n,a){function r(t,n){p(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},p(e,t,n,a)}function E(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}function f(e){return function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){E(r,a,l,c,o,"next",e)}function o(e){E(r,a,l,c,o,"throw",e)}c(void 0)})}}function R(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,u=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){u=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw l}}return o}}(e,t)||b(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function y(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?v(Object(n),!0).forEach(function(t){g(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):v(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function g(e,t,n){return(t=function(e){var t=function(e){if("object"!=m(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==m(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function h(e){return function(e){if(Array.isArray(e))return _(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||b(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function b(e,t){if(e){if("string"==typeof e)return _(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_(e,t):void 0}}function _(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var S=function(e){if(!e)return!1;try{return"https:"===new URL(e).protocol}catch(e){return!1}},w=function(e){return!e||e.split(/[,;]/).map(function(e){return e.trim()}).filter(function(e){return e}).every(function(e){return function(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}(e)})};const x=function(){var t=R((0,e.useState)({bmlt_root_server:"",notification_email:"",default_service_bodies:""}),2),a=t[0],l=t[1],r=R((0,e.useState)(!0),2),c=r[0],o=r[1],i=R((0,e.useState)(!1),2),u=i[0],m=i[1],p=R((0,e.useState)(null),2),E=p[0],v=p[1],b=R((0,e.useState)(null),2),_=b[0],x=b[1],k=R((0,e.useState)([]),2),C=k[0],T=k[1],A=R((0,e.useState)(null),2),N=A[0],P=A[1],O=R((0,e.useState)(null),2),D=O[0],j=O[1],B=R((0,e.useState)(!1),2),M=B[0],L=B[1],I=R((0,e.useState)({subscription_categories:[],subscription_tags:[],subscription_service_bodies:[],subscription_new_option_behavior:"auto_include"}),2),F=I[0],z=I[1],G=R((0,e.useState)([]),2),U=G[0],W=G[1],H=R((0,e.useState)([]),2),Y=H[0],q=H[1],J=R((0,e.useState)([]),2),$=J[0],K=J[1];(0,e.useEffect)(function(){var e=function(){var e=f(d().m(function e(){var t,n,a,r,c,i,u,m,p,E;return d().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,o(!0),v(null),e.n=1,s("/settings");case 1:return t=e.v,l({bmlt_root_server:t.bmlt_root_server||"",notification_email:t.notification_email||"",default_service_bodies:t.default_service_bodies||""}),T(Array.isArray(t.external_sources)?t.external_sources:[]),z({subscription_categories:t.subscription_categories||[],subscription_tags:t.subscription_tags||[],subscription_service_bodies:t.subscription_service_bodies||[],subscription_new_option_behavior:t.subscription_new_option_behavior||"opt_in"}),e.p=2,e.n=3,fetch("/wp-json/wp/v2/categories?per_page=100");case 3:if(!(n=e.v).ok){e.n=5;break}return e.n=4,n.json();case 4:a=e.v,W(a.map(function(e){return{id:e.id,name:e.name}}));case 5:e.n=7;break;case 6:e.p=6,m=e.v,console.error("Failed to load categories:",m);case 7:return e.p=7,e.n=8,fetch("/wp-json/wp/v2/tags?per_page=100");case 8:if(!(r=e.v).ok){e.n=10;break}return e.n=9,r.json();case 9:c=e.v,q(c.map(function(e){return{id:e.id,name:e.name}}));case 10:e.n=12;break;case 11:e.p=11,p=e.v,console.error("Failed to load tags:",p);case 12:if(!t.bmlt_root_server){e.n=18;break}return e.p=13,e.n=14,fetch(t.bmlt_root_server+"/client_interface/json/?switcher=GetServiceBodies");case 14:if(!(i=e.v).ok){e.n=16;break}return e.n=15,i.json();case 15:u=e.v,K(u.map(function(e){return{id:e.id,name:e.name,parent_id:e.parent_id||"0"}}));case 16:e.n=18;break;case 17:e.p=17,E=e.v,console.error("Failed to load service bodies:",E);case 18:e.n=20;break;case 19:e.p=19,e.v,v("Failed to load settings. Please refresh the page and try again.");case 20:return e.p=20,o(!1),e.f(20);case 21:return e.a(2)}},e,null,[[13,17],[7,11],[2,6],[0,19,20,21]])}));return function(){return e.apply(this,arguments)}}();e()},[]);var V=function(e,t){l(function(n){return y(y({},n),{},g({},e,t))})},Z=function(){var e=f(d().m(function e(){var t,n,l,r;return d().w(function(e){for(;;)switch(e.p=e.n){case 0:if(e.p=0,m(!0),v(null),S(D.url)){e.n=1;break}throw new Error("External source URL must use HTTPS protocol.");case 1:return t=y(y({},D),{},{event_type:D.event_type||""}),n=h(C),null!==N?n[N]=t:M&&n.push(t),e.n=2,s("/settings",{method:"POST",body:JSON.stringify(y(y({},a),{},{external_sources:n}))});case 2:l=e.v,T(l.settings.external_sources),j(null),P(null),L(!1),x("External source saved successfully!"),setTimeout(function(){return x(null)},3e3),e.n=4;break;case 3:e.p=3,r=e.v,v(r.message||"Failed to save external source.");case 4:return e.p=4,m(!1),e.f(4);case 5:return e.a(2)}},e,null,[[0,3,4,5]])}));return function(){return e.apply(this,arguments)}}(),Q=function(){var e=f(d().m(function e(t){var n;return d().w(function(e){for(;;)switch(e.p=e.n){case 0:if(confirm("Are you sure you want to delete this external source?")){e.n=1;break}return e.a(2);case 1:return e.p=1,m(!0),n=C.filter(function(e,n){return n!==t}),e.n=2,s("/settings",{method:"POST",body:JSON.stringify(y(y({},a),{},{external_sources:n}))});case 2:T(n),j(null),P(null),L(!1),x("External source deleted successfully!"),setTimeout(function(){return x(null)},3e3),e.n=4;break;case 3:e.p=3,e.v,v("Failed to delete external source.");case 4:return e.p=4,m(!1),e.f(4);case 5:return e.a(2)}},e,null,[[1,3,4,5]])}));return function(t){return e.apply(this,arguments)}}(),X=function(e,t){z(function(n){var a=n[e]||[],l=a.includes(t);return y(y({},n),{},g({},e,l?a.filter(function(e){return e!==t}):[].concat(h(a),[t])))})},ee=function(){var e=f(d().m(function e(){var t;return d().w(function(e){for(;;)switch(e.p=e.n){case 0:if(e.p=0,m(!0),v(null),S(a.bmlt_root_server)){e.n=1;break}throw new Error("BMLT Root Server URL must use HTTPS protocol.");case 1:if(!a.notification_email||w(a.notification_email)){e.n=2;break}throw new Error("Please enter valid email addresses for notifications. Multiple emails can be separated by commas or semicolons.");case 2:return e.n=3,s("/settings",{method:"POST",body:JSON.stringify({bmlt_root_server:a.bmlt_root_server,notification_email:a.notification_email,default_service_bodies:a.default_service_bodies,external_sources:C,subscription_categories:F.subscription_categories,subscription_tags:F.subscription_tags,subscription_service_bodies:F.subscription_service_bodies,subscription_new_option_behavior:F.subscription_new_option_behavior})});case 3:e.v,x("Settings saved successfully!"),setTimeout(function(){return x(null)},3e3),e.n=5;break;case 4:e.p=4,t=e.v,v(t.message||"Failed to save settings.");case 5:return e.p=5,m(!1),e.f(5);case 6:return e.a(2)}},e,null,[[0,4,5,6]])}));return function(){return e.apply(this,arguments)}}();return c?React.createElement("div",{className:"mayo-settings-loading"},React.createElement(n.Spinner,null)," Loading settings..."):React.createElement("div",{className:"mayo-settings-page"},React.createElement("h1",null,"Mayo Events Manager Settings"),React.createElement(n.Notice,{status:"warning",isDismissible:!1},React.createElement("p",null,React.createElement("strong",null,"Important:"),' This plugin requires Pretty Permalinks to be enabled for the REST API to function correctly. If you\'re experiencing 404 errors when accessing external source or settings  BMLT server, please ensure your WordPress site is using Pretty Permalinks (Settings → Permalinks) and not the "Plain" setting.')),E&&React.createElement(n.Notice,{status:"error",isDismissible:!0,onRemove:function(){return v(null)}},E),_&&React.createElement(n.Notice,{status:"success",isDismissible:!0,onRemove:function(){return x(null)}},_),React.createElement(n.Panel,null,React.createElement(n.PanelBody,{title:"BMLT Settings",initialOpen:!0},React.createElement(n.PanelRow,null,React.createElement(n.TextControl,{label:"BMLT Root Server URL",value:a.bmlt_root_server,onChange:function(e){return V("bmlt_root_server",e)},help:a.bmlt_root_server&&!S(a.bmlt_root_server)?"URL must start with 'https://'":"Enter the URL of your BMLT root server (e.g., https://bmlt.example.org/main_server)",className:a.bmlt_root_server&&!S(a.bmlt_root_server)?"mayo-invalid-url":"",__next40pxDefaultSize:!0})),React.createElement(n.PanelRow,null,React.createElement(n.TextControl,{label:"Notification Email",value:a.notification_email,onChange:function(e){return V("notification_email",e)},help:a.notification_email&&!w(a.notification_email)?"Please enter valid email addresses. Multiple emails can be separated by commas or semicolons.":"Email addresses to receive event submission notifications. Multiple emails can be separated by commas or semicolons. Leave empty to send to all admins.",className:a.notification_email&&!w(a.notification_email)?"mayo-invalid-email":"",__next40pxDefaultSize:!0}))),React.createElement(n.PanelBody,{title:"Service Body Configuration",initialOpen:!0},React.createElement(n.PanelRow,null,React.createElement(n.TextControl,{label:"Restricted Service Bodies",value:a.default_service_bodies,onChange:function(e){return V("default_service_bodies",e)},help:"Comma-separated list of service body IDs (e.g., 1,2,3). When specified, only these service bodies will be available for event submission. Leave empty to allow all service bodies. Use '0' for Unaffiliated. Perfect for multi-site setups where each site should only show specific service bodies.",placeholder:"e.g., 1,2,3,0",__next40pxDefaultSize:!0})),React.createElement(n.PanelRow,null,React.createElement(n.Button,{isPrimary:!0,onClick:ee,isBusy:u,disabled:u||a.bmlt_root_server&&!S(a.bmlt_root_server)||a.notification_email&&!w(a.notification_email)},u?"Saving...":"Save Settings")))),React.createElement(n.Panel,null,React.createElement(n.PanelBody,{title:"External Event Sources",initialOpen:!0},React.createElement("div",{className:"mayo-external-sources-list"},C.map(function(e,t){return React.createElement("div",{key:e.id,className:"mayo-external-source-item"},React.createElement("div",{className:"mayo-external-source-info"},React.createElement("strong",null,e.name||e.url),React.createElement("div",{className:"mayo-external-source-details"},React.createElement("span",{className:"mayo-source-id"},"ID: ",e.id),e.event_type&&React.createElement("span",null,"Type: ",e.event_type),e.service_body&&React.createElement("span",null,"Service Body: ",e.service_body),React.createElement("span",{className:"mayo-source-status ".concat(e.enabled?"enabled":"disabled")},e.enabled?"Enabled":"Disabled"))),React.createElement("div",{className:"mayo-external-source-actions"},React.createElement(n.Button,{isSecondary:!0,onClick:function(){return function(e,t){j(e),P(t)}(e,t)}},"Edit"),React.createElement(n.Button,{isDestructive:!0,onClick:function(){return Q(t)}},"Delete")))})),React.createElement("div",{className:"mayo-external-sources-actions"},React.createElement(n.Button,{isPrimary:!0,onClick:function(){j({id:"",name:"",url:"",event_type:"",service_body:"",categories:"",tags:"",enabled:!0}),L(!0)},className:"mayo-add-source-button",disabled:M||null!==N},"Add New External Source")),(M||null!==N)&&D&&React.createElement("div",{className:"mayo-external-source-form"},React.createElement(n.TextControl,{label:"Site URL",value:D.url,onChange:function(e){return j(y(y({},D),{},{url:e}))},help:"Enter the URL of the WordPress site (e.g., https://example.com)",__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Source Name",value:D.name,onChange:function(e){return j(y(y({},D),{},{name:e}))},help:"Enter a friendly name for this source (e.g., District 5 Website)",__next40pxDefaultSize:!0}),React.createElement(n.SelectControl,{label:"Event Type",value:D.event_type||"",options:[{label:"Select an event type",value:""},{label:"Activity",value:"Activity"},{label:"Service",value:"Service"}],onChange:function(e){j(y(y({},D),{},{event_type:e}))},help:"Select the event type",__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Service Body",value:D.service_body,onChange:function(e){return j(y(y({},D),{},{service_body:e}))},help:"Filter by service body (optional)",__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Categories",value:D.categories,onChange:function(e){return j(y(y({},D),{},{categories:e}))},help:"Filter by categories (comma-separated)",__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Tags",value:D.tags,onChange:function(e){return j(y(y({},D),{},{tags:e}))},help:"Filter by tags (comma-separated)",__next40pxDefaultSize:!0}),React.createElement(n.ToggleControl,{label:"Enable Source",checked:D.enabled,onChange:function(e){return j(y(y({},D),{},{enabled:e}))}}),React.createElement("div",{className:"mayo-form-actions"},React.createElement(n.Button,{isPrimary:!0,onClick:Z,isBusy:u},u?"Saving...":"Save Source"),React.createElement(n.Button,{isSecondary:!0,onClick:function(){j(null),P(null),L(!1)}},"Cancel"))))),React.createElement(n.Panel,null,React.createElement(n.PanelBody,{title:"Subscription Preferences",initialOpen:!0},React.createElement("p",{className:"mayo-settings-description"},"Configure which categories, tags, and service bodies are available for subscribers to choose from when signing up for announcement notifications."),U.length>0&&React.createElement("div",{className:"mayo-subscription-section"},React.createElement("h4",null,"Categories available for subscription:"),React.createElement("div",{className:"mayo-checkbox-list",style:{border:"1px solid #ddd",borderRadius:"4px",background:"#fff",padding:"12px 16px",maxHeight:"300px",overflowY:"auto"}},U.map(function(e){return React.createElement(n.CheckboxControl,{key:e.id,label:e.name,checked:F.subscription_categories.includes(e.id),onChange:function(){return X("subscription_categories",e.id)}})}))),Y.length>0&&React.createElement("div",{className:"mayo-subscription-section"},React.createElement("h4",null,"Tags available for subscription:"),React.createElement("div",{className:"mayo-checkbox-list",style:{border:"1px solid #ddd",borderRadius:"4px",background:"#fff",padding:"12px 16px",maxHeight:"300px",overflowY:"auto"}},Y.map(function(e){return React.createElement(n.CheckboxControl,{key:e.id,label:e.name,checked:F.subscription_tags.includes(e.id),onChange:function(){return X("subscription_tags",e.id)}})}))),$.length>0&&React.createElement("div",{className:"mayo-subscription-section"},React.createElement("h4",null,"Service Bodies available for subscription:"),React.createElement("div",{className:"mayo-service-body-tree"},function(e){var t=h(e).sort(function(e,t){return e.name.localeCompare(t.name)}),n={},a=[];t.forEach(function(e){n[e.id]=[]}),t.forEach(function(e){var t=String(e.parent_id);"0"!==t&&n[t]?n[t].push(e):a.push(e)});var l=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=[];return e.forEach(function(e){var r;a.push(y(y({},e),{},{depth:t})),(null===(r=n[e.id])||void 0===r?void 0:r.length)>0&&(a=a.concat(l(n[e.id],t+1)))}),a};return l(a)}($).map(function(e){return React.createElement("div",{key:e.id,className:"mayo-tree-item",style:{paddingLeft:"".concat(24*e.depth,"px")}},React.createElement(n.CheckboxControl,{label:"".concat(e.name," (").concat(e.id,")"),checked:F.subscription_service_bodies.includes(e.id),onChange:function(){return X("subscription_service_bodies",e.id)}}))}))),React.createElement("div",{className:"mayo-subscription-section"},React.createElement("h4",null,"When new options are added:"),React.createElement(n.RadioControl,{selected:F.subscription_new_option_behavior,options:[{label:"Auto-include: Automatically add to existing subscribers",value:"auto_include"},{label:"Opt-in: Existing subscribers must manually add new options",value:"opt_in"}],onChange:function(e){return function(e,t){z(function(e){return y(y({},e),{},g({},"subscription_new_option_behavior",t))})}(0,e)}})),React.createElement(n.PanelRow,null,React.createElement(n.Button,{isPrimary:!0,onClick:ee,isBusy:u,disabled:u||a.bmlt_root_server&&!S(a.bmlt_root_server)||a.notification_email&&!w(a.notification_email)},u?"Saving...":"Save Settings")))))};function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}const C=function(){var t,n,a=(t=(0,e.useState)((new Date).toLocaleString()),n=1,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,u=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){u=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw l}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return k(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?k(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];return React.createElement("div",{className:"wrap mayo-docs"},React.createElement("h1",null,"CSS Classes Documentation"),React.createElement("div",{className:"card"},React.createElement("div",{className:"mayo-docs-header"},React.createElement("h2",null,"Dynamic CSS Classes"),React.createElement("div",{className:"mayo-docs-meta"},React.createElement("span",{className:"mayo-docs-last-updated"},"Last updated: ",a))),React.createElement("div",{className:"notice notice-warning"},React.createElement("p",null,React.createElement("strong",null,"Important:"),' This plugin does not include a built-in CSS editor. To style the event cards, you need to use another plugin like "Simple Custom CSS" or add CSS to your theme\'s stylesheet.')),React.createElement("p",null,"This documentation explains the dynamic CSS classes used in the Event Card and Calendar View components. These classes are generated based on event properties and can be used to style specific events."),React.createElement("div",{className:"mayo-tab-content"},React.createElement("h3",null,"Dynamic Classes"),React.createElement("p",null,"These classes are dynamically generated based on event properties:"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Class Pattern"),React.createElement("th",null,"Based On"),React.createElement("th",null,"Example"))),React.createElement("tbody",null,[{pattern:"mayo-event-category-{category-slug}",baseName:"mayo-event-category",description:"Class for event categories"},{pattern:"mayo-event-tag-{tag-slug}",baseName:"mayo-event-tag",description:"Class for event tags"},{pattern:"mayo-event-type-{event-type-slug}",baseName:"mayo-event-type",description:"Class for event types"},{pattern:"mayo-event-service-body-{service-body-slug}",baseName:"mayo-event-service-body",description:"Class for service bodies"}].map(function(e,t){var n="",a="";return e.baseName.includes("category")?(n="Event categories",a="mayo-event-category-meetings"):e.baseName.includes("tag")?(n="Event tags",a="mayo-event-tag-featured"):e.baseName.includes("type")?(n="Event type",a="mayo-event-type-service"):e.baseName.includes("service-body")&&(n="Service body",a="mayo-event-service-body-district-1"),React.createElement("tr",{key:t},React.createElement("td",null,React.createElement("code",null,e.pattern)),React.createElement("td",null,n),React.createElement("td",null,React.createElement("code",null,a)))}))),React.createElement("h4",null,"Special Characters Handling"),React.createElement("p",null,"Special characters and emojis in category, tag, event type, and service body names are converted to Unicode codes to ensure valid CSS class names:"),React.createElement("pre",null,React.createElement("code",null,'// Example: "Meeting 🎉" becomes "mayo-event-category-meeting-u127881"')),React.createElement("h4",null,"Small Variants"),React.createElement("p",null,"Categories and tags in the event brief section use small variants:"),React.createElement("ul",null,React.createElement("li",null,React.createElement("code",null,"mayo-event-category-small")),React.createElement("li",null,React.createElement("code",null,"mayo-event-tag-small"))),React.createElement("h4",null,"How to Add Custom CSS"),React.createElement("p",null,"To style the event cards, you need to add CSS to your theme or use a custom CSS plugin. Here are some recommended plugins:"),React.createElement("ul",null,React.createElement("li",null,React.createElement("a",{href:"https://wordpress.org/plugins/simple-custom-css/",target:"_blank",rel:"noopener noreferrer"},"Simple Custom CSS")),React.createElement("li",null,React.createElement("a",{href:"https://wordpress.org/plugins/custom-css-js/",target:"_blank",rel:"noopener noreferrer"},"Custom CSS and JS")),React.createElement("li",null,React.createElement("a",{href:"https://wordpress.org/plugins/advanced-custom-css/",target:"_blank",rel:"noopener noreferrer"},"Advanced Custom CSS"))),React.createElement("h4",null,"List View vs Calendar View Styling"),React.createElement("p",null,"The same dynamic classes are applied to both list view and calendar view events. This means your existing styles will automatically work in both views:"),React.createElement("pre",null,React.createElement("code",null,"\n/* This styles events in BOTH list and calendar views */\n.mayo-event-category-meetings {\n    border-left: 4px solid #4a90e2;\n}\n                    ")),React.createElement("p",null,"If you want ",React.createElement("strong",null,"different")," styling for each view, use the base element class as a prefix:"),React.createElement("ul",null,React.createElement("li",null,React.createElement("code",null,".mayo-event-card")," - List view event cards"),React.createElement("li",null,React.createElement("code",null,".mayo-calendar-event")," - Calendar view event pills")),React.createElement("pre",null,React.createElement("code",null,"\n/* List view only */\n.mayo-event-card.mayo-event-category-meetings {\n    border-left: 4px solid #4a90e2;\n}\n\n/* Calendar view only */\n.mayo-calendar-event.mayo-event-category-meetings {\n    background-color: #e3f2fd;\n    border-left: 3px solid #1976d2;\n}\n                    ")),React.createElement("h4",null,"Customization Example"),React.createElement("p",null,"Once you have a CSS editor, you can add rules like these:"),React.createElement("pre",null,React.createElement("code",null,'\n/* Style events with the "meetings" category (both views) */\n.mayo-event-category-meetings {\n    border-left: 4px solid #4a90e2;\n}\n\n/* Style events with the "workshops" category (both views) */\n.mayo-event-category-workshops {\n    border-left: 4px solid #e2844a;\n}\n\n/* Style service events (both views) */\n.mayo-event-type-service {\n    background-color: #f0f7ff;\n}\n\n/* Style events from a specific service body (both views) */\n.mayo-event-service-body-district-1 {\n    border-top: 2px solid #4a90e2;\n}\n\n/* Calendar view only: different background for activity events */\n.mayo-calendar-event.mayo-event-type-activity {\n    background-color: #fff3e0;\n}\n                    ')))))},T=function(){var e=window.location.origin;return React.createElement("div",{className:"wrap mayo-docs"},React.createElement("h1",null,"API Documentation"),React.createElement("div",{className:"card"},React.createElement("h2",null,"Overview"),React.createElement("p",null,"The Mayo Events Manager provides a REST API for programmatic access to events and announcements. All endpoints use the namespace ",React.createElement("code",null,"event-manager/v1"),"."),React.createElement("p",null,React.createElement("strong",null,"Base URL:")," ",React.createElement("code",null,e,"/wp-json/event-manager/v1"))),React.createElement("div",{className:"card"},React.createElement("h2",null,"Table of Contents"),React.createElement("h3",null,"Event Endpoints"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("a",{href:"#get-events"},"GET /events")," - List events with filtering"),React.createElement("li",null,React.createElement("a",{href:"#get-event-slug"},"GET /event/","{slug}")," - Get event by slug"),React.createElement("li",null,React.createElement("a",{href:"#get-event-id"},"GET /events/","{id}")," - Get event by ID"),React.createElement("li",null,React.createElement("a",{href:"#search-events"},"GET /events/search")," - Search events"),React.createElement("li",null,React.createElement("a",{href:"#post-submit-event"},"POST /submit-event")," - Submit a new event")),React.createElement("h3",null,"Announcement Endpoints"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("a",{href:"#get-announcements"},"GET /announcements")," - List announcements"),React.createElement("li",null,React.createElement("a",{href:"#get-announcement-id"},"GET /announcement/","{id}")," - Get announcement by ID")),React.createElement("h3",null,"Settings Endpoints"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("a",{href:"#get-settings"},"GET /settings")," - Get plugin settings"),React.createElement("li",null,React.createElement("a",{href:"#post-settings"},"POST /settings")," - Update plugin settings")),React.createElement("h3",null,"Reference"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("a",{href:"#event-meta-fields"},"Event Meta Fields")),React.createElement("li",null,React.createElement("a",{href:"#announcement-response"},"Announcement Response Object")),React.createElement("li",null,React.createElement("a",{href:"#wordpress-rest-api"},"WordPress REST API")),React.createElement("li",null,React.createElement("a",{href:"#usage-examples"},"Usage Examples")))),React.createElement("div",{className:"card",id:"get-events"},React.createElement("h2",null,"GET /events"),React.createElement("p",null,"Retrieve a list of events with optional filtering and pagination."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/events")),React.createElement("h3",null,"Query Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Default"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"page")),React.createElement("td",null,"integer"),React.createElement("td",null,"1"),React.createElement("td",null,"Page number for pagination")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"per_page")),React.createElement("td",null,"integer"),React.createElement("td",null,"10"),React.createElement("td",null,"Number of events per page")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"status")),React.createElement("td",null,"string"),React.createElement("td",null,"publish"),React.createElement("td",null,"Post status filter (",React.createElement("code",null,"publish"),", ",React.createElement("code",null,"pending"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_type")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Filter by event type (e.g., ",React.createElement("code",null,"Service"),", ",React.createElement("code",null,"Activity"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"service_body")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated service body IDs (e.g., ",React.createElement("code",null,"1,2,3"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"categories")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated category slugs. Prefix with ",React.createElement("code",null,"-")," to exclude (e.g., ",React.createElement("code",null,"meetings,-cancelled"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"tags")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated tag slugs. Prefix with ",React.createElement("code",null,"-")," to exclude")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"archive")),React.createElement("td",null,"boolean"),React.createElement("td",null,"false"),React.createElement("td",null,"When ",React.createElement("code",null,"true"),", returns only past events")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"order")),React.createElement("td",null,"string"),React.createElement("td",null,"ASC"),React.createElement("td",null,"Sort order: ",React.createElement("code",null,"ASC")," (earliest first) or ",React.createElement("code",null,"DESC")," (latest first)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"timezone")),React.createElement("td",null,"string"),React.createElement("td",null,"Server timezone"),React.createElement("td",null,"IANA timezone for date filtering (e.g., ",React.createElement("code",null,"America/New_York"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"start_date")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Filter events starting from this date (YYYY-MM-DD format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"end_date")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Filter events ending before this date (YYYY-MM-DD format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"source_ids")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated source IDs. Use ",React.createElement("code",null,"local")," for local events, or external source IDs")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"relation")),React.createElement("td",null,"string"),React.createElement("td",null,"AND"),React.createElement("td",null,"Relation between meta query conditions (",React.createElement("code",null,"AND")," or ",React.createElement("code",null,"OR"),")")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/events?per_page=5&categories=meetings&order=ASC"))),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "events": [\n        {\n            "id": 123,\n            "title": {\n                "rendered": "Monthly Meeting"\n            },\n            "content": {\n                "rendered": "<p>Event description...</p>"\n            },\n            "link": "'.concat(e,'/mayo/monthly-meeting/",\n            "meta": {\n                "event_start_date": "2024-03-15",\n                "event_end_date": "2024-03-15",\n                "event_start_time": "19:00:00",\n                "event_end_time": "21:00:00",\n                "timezone": "America/New_York",\n                "event_type": "Service",\n                "service_body": "1",\n                "location_name": "Community Center",\n                "location_address": "123 Main St",\n                "location_details": "Room 101"\n            },\n            "featured_image": "').concat(e,'/wp-content/uploads/2024/03/flyer.jpg",\n            "categories": [\n                {\n                    "id": 5,\n                    "name": "Meetings",\n                    "slug": "meetings",\n                    "link": "').concat(e,'/category/meetings/"\n                }\n            ],\n            "tags": [],\n            "source": {\n                "id": "local",\n                "name": "Local Events",\n                "url": "').concat(e,'"\n            }\n        }\n    ],\n    "pagination": {\n        "total": 25,\n        "per_page": 5,\n        "current_page": 1,\n        "total_pages": 5\n    }\n}')))),React.createElement("div",{className:"card",id:"get-event-slug"},React.createElement("h2",null,"GET /event/","{slug}"),React.createElement("p",null,"Retrieve details for a single event by its slug."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/event/","{slug}")),React.createElement("h3",null,"Path Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"slug")),React.createElement("td",null,"string"),React.createElement("td",null,"The event's URL slug")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/event/monthly-meeting"))),React.createElement("h3",null,"Response"),React.createElement("p",null,"Returns a single event object (same structure as events in the list response)."),React.createElement("h3",null,"Error Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "code": "no_event",\n    "message": "Event not found",\n    "data": {\n        "status": 404\n    }\n}'))),React.createElement("div",{className:"card",id:"get-event-id"},React.createElement("h2",null,"GET /events/","{id}"),React.createElement("p",null,"Retrieve a single event by its post ID."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/events/","{id}")),React.createElement("h3",null,"Path Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"id")),React.createElement("td",null,"integer"),React.createElement("td",null,"The event's post ID")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/events/123"))),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "id": 123,\n    "title": "Monthly Meeting",\n    "start_date": "2024-03-15",\n    "end_date": "2024-03-15",\n    "start_time": "19:00:00",\n    "end_time": "21:00:00",\n    "permalink": "'.concat(e,'/mayo/monthly-meeting/",\n    "edit_link": "').concat(e,'/wp-admin/post.php?post=123&action=edit"\n}'))),React.createElement("h3",null,"Error Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "code": "not_found",\n    "message": "Event not found",\n    "data": {\n        "status": 404\n    }\n}'))),React.createElement("div",{className:"card",id:"search-events"},React.createElement("h2",null,"GET /events/search"),React.createElement("p",null,"Search events by title. Useful for finding events to link to announcements."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/events/search")),React.createElement("h3",null,"Query Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Default"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"search")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Search term to match against event titles")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"limit")),React.createElement("td",null,"integer"),React.createElement("td",null,"20"),React.createElement("td",null,"Maximum number of results to return")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"include")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated event IDs to fetch specific events")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/events/search?search=meeting&limit=10"))),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "events": [\n        {\n            "id": 123,\n            "title": "Monthly Meeting",\n            "start_date": "2024-03-15",\n            "permalink": "'.concat(e,'/mayo/monthly-meeting/",\n            "edit_link": "').concat(e,'/wp-admin/post.php?post=123&action=edit"\n        },\n        {\n            "id": 456,\n            "title": "Regional Meeting",\n            "start_date": "2024-04-01",\n            "permalink": "').concat(e,'/mayo/regional-meeting/",\n            "edit_link": "').concat(e,'/wp-admin/post.php?post=456&action=edit"\n        }\n    ]\n}')))),React.createElement("div",{className:"card",id:"post-submit-event"},React.createElement("h2",null,"POST /submit-event"),React.createElement("p",null,"Submit a new event. Events are created with ",React.createElement("code",null,"pending")," status and require admin approval."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"POST ",e,"/wp-json/event-manager/v1/submit-event")),React.createElement("h3",null,"Authentication"),React.createElement("p",null,"This endpoint is publicly accessible (no authentication required)."),React.createElement("h3",null,"Request Body (multipart/form-data)"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Field"),React.createElement("th",null,"Type"),React.createElement("th",null,"Required"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_name")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Event title")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_type")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Event type (e.g., ",React.createElement("code",null,"Service"),", ",React.createElement("code",null,"Activity"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"service_body")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Service body ID (use ",React.createElement("code",null,"0")," for Unaffiliated)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"email")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Contact email address")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"contact_name")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Contact person's name")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_start_date")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Start date (YYYY-MM-DD format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_end_date")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"End date (YYYY-MM-DD format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_start_time")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Start time (HH:MM:SS format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_end_time")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"End time (HH:MM:SS format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"timezone")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"IANA timezone (e.g., ",React.createElement("code",null,"America/New_York"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"description")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Event description (HTML allowed)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_name")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Venue name")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_address")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Street address")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_details")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Additional location info (room number, etc.)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"categories")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Comma-separated category IDs")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"tags")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Comma-separated tag names or IDs")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"recurring_pattern")),React.createElement("td",null,"JSON string"),React.createElement("td",null,"No"),React.createElement("td",null,"Recurring event configuration (see below)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"flyer")),React.createElement("td",null,"file"),React.createElement("td",null,"No"),React.createElement("td",null,"Event flyer image (set as featured image)")))),React.createElement("h3",null,"Recurring Pattern Object"),React.createElement("pre",null,React.createElement("code",null,'{\n    "type": "weekly",           // "none", "daily", "weekly", "monthly"\n    "interval": 1,              // Repeat every N days/weeks/months\n    "weekdays": [1, 3, 5],      // For weekly: days of week (0=Sun, 6=Sat)\n    "monthlyType": "date",      // For monthly: "date" or "weekday"\n    "monthlyDate": 15,          // For monthly by date: day of month\n    "monthlyWeekday": "2,4",    // For monthly by weekday: "week,day" (e.g., "2,4" = 2nd Thursday)\n    "endDate": "2024-12-31"     // When recurring pattern ends\n}')),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "id": 456,\n    "title": {\n        "rendered": "New Community Event"\n    },\n    "content": {\n        "rendered": "<p>Event description...</p>"\n    },\n    "link": "'.concat(e,'/mayo/new-community-event/",\n    "meta": {\n        "event_start_date": "2024-04-01",\n        "event_end_date": "2024-04-01",\n        "event_start_time": "14:00:00",\n        "event_end_time": "16:00:00",\n        "timezone": "America/Los_Angeles",\n        "event_type": "Activity",\n        "service_body": "5",\n        "location_name": "Park Pavilion",\n        "location_address": "456 Oak Ave",\n        "location_details": ""\n    },\n    "categories": [],\n    "tags": []\n}')))),React.createElement("div",{className:"card",id:"get-announcements"},React.createElement("h2",null,"GET /announcements"),React.createElement("p",null,"Retrieve a list of announcements with optional filtering. By default, only returns announcements within their active display window."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/announcements")),React.createElement("h3",null,"Query Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Default"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"priority")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Filter by priority level: ",React.createElement("code",null,"low"),", ",React.createElement("code",null,"normal"),", ",React.createElement("code",null,"high"),", ",React.createElement("code",null,"urgent"))),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"categories")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated category slugs")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"tags")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated tag slugs")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"linked_event")),React.createElement("td",null,"integer"),React.createElement("td",null,"empty"),React.createElement("td",null,"Filter by linked event ID")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"active")),React.createElement("td",null,"string"),React.createElement("td",null,"true"),React.createElement("td",null,"Set to ",React.createElement("code",null,"false")," to include announcements outside their display window")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/announcements?priority=urgent"))),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "announcements": [\n        {\n            "id": 789,\n            "title": "Weather Closure Notice",\n            "content": "<p>Due to severe weather...</p>",\n            "excerpt": "Due to severe weather...",\n            "link": "'.concat(e,'/announcement/weather-closure/",\n            "display_start_date": "2024-03-14",\n            "display_end_date": "2024-03-16",\n            "priority": "urgent",\n            "linked_events": [\n                {\n                    "id": 123,\n                    "title": "Monthly Meeting",\n                    "permalink": "').concat(e,'/mayo/monthly-meeting/",\n                    "start_date": "2024-03-15"\n                }\n            ],\n            "featured_image": null,\n            "categories": [],\n            "tags": []\n        }\n    ],\n    "total": 1\n}')))),React.createElement("div",{className:"card",id:"get-announcement-id"},React.createElement("h2",null,"GET /announcement/","{id}"),React.createElement("p",null,"Retrieve a single announcement by its post ID."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/announcement/","{id}")),React.createElement("h3",null,"Path Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"id")),React.createElement("td",null,"integer"),React.createElement("td",null,"The announcement's post ID")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/announcement/789"))),React.createElement("h3",null,"Response"),React.createElement("p",null,"Returns a single announcement object (same structure as announcements in the list response)."),React.createElement("h3",null,"Error Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "code": "not_found",\n    "message": "Announcement not found",\n    "data": {\n        "status": 404\n    }\n}'))),React.createElement("div",{className:"card",id:"get-settings"},React.createElement("h2",null,"GET /settings"),React.createElement("p",null,"Retrieve plugin settings. This endpoint is publicly accessible for frontend configuration."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/settings")),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "bmlt_root_server": "https://bmlt.example.org/main_server",\n    "notification_email": "events@example.org",\n    "default_service_bodies": "1,2,3",\n    "external_sources": [\n        {\n            "id": "source_abc123",\n            "url": "https://other-site.org",\n            "name": "Other Site Events",\n            "event_type": "",\n            "service_body": "",\n            "categories": "",\n            "tags": "",\n            "enabled": true\n        }\n    ]\n}'))),React.createElement("div",{className:"card",id:"post-settings"},React.createElement("h2",null,"POST /settings"),React.createElement("p",null,"Update plugin settings. ",React.createElement("strong",null,"Requires administrator authentication.")),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"POST ",e,"/wp-json/event-manager/v1/settings")),React.createElement("h3",null,"Authentication"),React.createElement("p",null,"Requires a logged-in user with ",React.createElement("code",null,"manage_options")," capability (administrator)."),React.createElement("p",null,"Include the WordPress REST API nonce in your request:"),React.createElement("pre",null,React.createElement("code",null,"// Using wp-api-fetch (recommended)\nimport apiFetch from '@wordpress/api-fetch';\napiFetch({ path: '/event-manager/v1/settings', method: 'POST', data: {...} });\n\n// Using fetch with nonce\nfetch('".concat(e,"/wp-json/event-manager/v1/settings', {\n    method: 'POST',\n    headers: {\n        'Content-Type': 'application/json',\n        'X-WP-Nonce': wpApiSettings.nonce\n    },\n    body: JSON.stringify({...})\n});"))),React.createElement("h3",null,"Request Body (JSON)"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Field"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"bmlt_root_server")),React.createElement("td",null,"string"),React.createElement("td",null,"BMLT root server URL")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"notification_email")),React.createElement("td",null,"string"),React.createElement("td",null,"Email address(es) for event submission notifications")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"default_service_bodies")),React.createElement("td",null,"string"),React.createElement("td",null,"Comma-separated service body IDs to restrict submissions")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"external_sources")),React.createElement("td",null,"array"),React.createElement("td",null,"Array of external source configurations")))),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "success": true,\n    "settings": {\n        "bmlt_root_server": "https://bmlt.example.org/main_server",\n        "notification_email": "events@example.org",\n        "default_service_bodies": "1,2,3",\n        "external_sources": []\n    }\n}')),React.createElement("h3",null,"Error Response (Unauthorized)"),React.createElement("pre",null,React.createElement("code",null,'{\n    "code": "rest_forbidden",\n    "message": "Sorry, you are not allowed to update settings.",\n    "data": {\n        "status": 401\n    }\n}'))),React.createElement("div",{className:"card",id:"event-meta-fields"},React.createElement("h2",null,"Event Meta Fields"),React.createElement("p",null,"Events use the following meta fields, which are exposed via the WordPress REST API for the ",React.createElement("code",null,"mayo_event")," post type:"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Meta Key"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_type")),React.createElement("td",null,"string"),React.createElement("td",null,"Event type (Service, Activity, etc.)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"service_body")),React.createElement("td",null,"string"),React.createElement("td",null,"Service body ID")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_start_date")),React.createElement("td",null,"string"),React.createElement("td",null,"Start date (YYYY-MM-DD)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_end_date")),React.createElement("td",null,"string"),React.createElement("td",null,"End date (YYYY-MM-DD)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_start_time")),React.createElement("td",null,"string"),React.createElement("td",null,"Start time (HH:MM:SS)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_end_time")),React.createElement("td",null,"string"),React.createElement("td",null,"End time (HH:MM:SS)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"timezone")),React.createElement("td",null,"string"),React.createElement("td",null,"IANA timezone identifier")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_name")),React.createElement("td",null,"string"),React.createElement("td",null,"Venue name")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_address")),React.createElement("td",null,"string"),React.createElement("td",null,"Street address")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_details")),React.createElement("td",null,"string"),React.createElement("td",null,"Additional location information")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"contact_name")),React.createElement("td",null,"string"),React.createElement("td",null,"Contact person's name")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"email")),React.createElement("td",null,"string"),React.createElement("td",null,"Contact email address")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"recurring_pattern")),React.createElement("td",null,"object"),React.createElement("td",null,"Recurring event configuration")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"skipped_occurrences")),React.createElement("td",null,"array"),React.createElement("td",null,"Array of skipped dates for recurring events"))))),React.createElement("div",{className:"card",id:"announcement-response"},React.createElement("h2",null,"Announcement Response Object"),React.createElement("p",null,"Announcements returned from the API include the following fields:"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Field"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"id")),React.createElement("td",null,"integer"),React.createElement("td",null,"The announcement's post ID")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"title")),React.createElement("td",null,"string"),React.createElement("td",null,"Announcement title")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"content")),React.createElement("td",null,"string"),React.createElement("td",null,"Full announcement content (HTML)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"excerpt")),React.createElement("td",null,"string"),React.createElement("td",null,"Short excerpt of the announcement")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"link")),React.createElement("td",null,"string"),React.createElement("td",null,"Permalink to the announcement")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"edit_link")),React.createElement("td",null,"string"),React.createElement("td",null,"Admin edit URL for the announcement")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"display_start_date")),React.createElement("td",null,"string"),React.createElement("td",null,"When the announcement starts showing (YYYY-MM-DD)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"display_end_date")),React.createElement("td",null,"string"),React.createElement("td",null,"When the announcement stops showing (YYYY-MM-DD)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"priority")),React.createElement("td",null,"string"),React.createElement("td",null,"Priority level: ",React.createElement("code",null,"low"),", ",React.createElement("code",null,"normal"),", ",React.createElement("code",null,"high"),", or ",React.createElement("code",null,"urgent"))),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"linked_events")),React.createElement("td",null,"array"),React.createElement("td",null,"Array of linked event objects with ",React.createElement("code",null,"id"),", ",React.createElement("code",null,"title"),", ",React.createElement("code",null,"permalink"),", ",React.createElement("code",null,"start_date"))),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"is_active")),React.createElement("td",null,"boolean"),React.createElement("td",null,"Whether the announcement is currently within its display window")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"featured_image")),React.createElement("td",null,"string|null"),React.createElement("td",null,"URL of the featured image, if set")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"categories")),React.createElement("td",null,"array"),React.createElement("td",null,"Array of category objects")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"tags")),React.createElement("td",null,"array"),React.createElement("td",null,"Array of tag objects"))))),React.createElement("div",{className:"card",id:"wordpress-rest-api"},React.createElement("h2",null,"WordPress REST API"),React.createElement("p",null,"Events are also accessible via the standard WordPress REST API at ",React.createElement("code",null,"/wp-json/wp/v2/mayo_event"),"."),React.createElement("h3",null,"Example"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/wp/v2/mayo_event?per_page=10&status=publish"))),React.createElement("p",null,"This provides access to all standard WordPress post fields plus the registered meta fields above.")),React.createElement("div",{className:"card",id:"usage-examples"},React.createElement("h2",null,"Usage Examples"),React.createElement("h3",null,"JavaScript (Fetch API)"),React.createElement("pre",null,React.createElement("code",null,"// Get upcoming events\nfetch('".concat(e,"/wp-json/event-manager/v1/events?per_page=10')\n    .then(response => response.json())\n    .then(data => {\n        console.log('Events:', data.events);\n        console.log('Total:', data.pagination.total);\n    });\n\n// Get events for a specific service body\nfetch('").concat(e,"/wp-json/event-manager/v1/events?service_body=1,2')\n    .then(response => response.json())\n    .then(data => console.log(data));\n\n// Get past events (archive)\nfetch('").concat(e,"/wp-json/event-manager/v1/events?archive=true&order=DESC')\n    .then(response => response.json())\n    .then(data => console.log(data));\n\n// Get active announcements\nfetch('").concat(e,"/wp-json/event-manager/v1/announcements')\n    .then(response => response.json())\n    .then(data => console.log(data.announcements));\n\n// Get urgent announcements only\nfetch('").concat(e,"/wp-json/event-manager/v1/announcements?priority=urgent')\n    .then(response => response.json())\n    .then(data => console.log(data));"))),React.createElement("h3",null,"PHP (WordPress)"),React.createElement("pre",null,React.createElement("code",null,"// Get events using wp_remote_get\n$response = wp_remote_get('".concat(e,"/wp-json/event-manager/v1/events?per_page=5');\n\nif (!is_wp_error($response)) {\n    $body = wp_remote_retrieve_body($response);\n    $data = json_decode($body, true);\n\n    foreach ($data['events'] as $event) {\n        echo $event['title']['rendered'] . '<br>';\n    }\n}"))),React.createElement("h3",null,"cURL"),React.createElement("pre",null,React.createElement("code",null,'# Get events\ncurl "'.concat(e,'/wp-json/event-manager/v1/events?per_page=5"\n\n# Get a single event\ncurl "').concat(e,'/wp-json/event-manager/v1/event/monthly-meeting"\n\n# Get settings\ncurl "').concat(e,'/wp-json/event-manager/v1/settings"\n\n# Get announcements\ncurl "').concat(e,'/wp-json/event-manager/v1/announcements"\n\n# Get announcements for a specific event (use linked_event filter)\ncurl "').concat(e,'/wp-json/event-manager/v1/announcements?linked_event=123"')))))};function A(e){return A="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},A(e)}function N(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",l=n.toStringTag||"@@toStringTag";function r(n,a,l,r){var i=a&&a.prototype instanceof o?a:o,u=Object.create(i.prototype);return P(u,"_invoke",function(n,a,l){var r,o,i,u=0,s=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,o=0,i=e,d.n=n,c}};function p(n,a){for(o=n,i=a,t=0;!m&&u&&!l&&t<s.length;t++){var l,r=s[t],p=d.p,E=r[2];n>3?(l=E===a)&&(i=r[(o=r[4])?5:(o=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(o=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,o=0))}if(l||n>1)return c;throw m=!0,a}return function(l,s,E){if(u>1)throw TypeError("Generator is already running");for(m&&1===s&&p(s,E),o=s,i=E;(t=o<2?e:i)||!m;){r||(o?o<3?(o>1&&(d.n=-1),p(o,i)):d.n=i:d.v=i);try{if(u=2,r){if(o||(l="next"),t=r[l]){if(!(t=t.call(r,i)))throw TypeError("iterator result is not an object");if(!t.done)return t;i=t.value,o<2&&(o=0)}else 1===o&&(t=r.return)&&t.call(r),o<2&&(i=TypeError("The iterator does not provide a '"+l+"' method"),o=1);r=e}else if((t=(m=d.n<0)?i:n.call(a,d))!==c)break}catch(t){r=e,o=1,i=t}finally{u=1}}return{value:t,done:m}}}(n,l,r),!0),u}var c={};function o(){}function i(){}function u(){}t=Object.getPrototypeOf;var s=[][a]?t(t([][a]())):(P(t={},a,function(){return this}),t),m=u.prototype=o.prototype=Object.create(s);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,u):(e.__proto__=u,P(e,l,"GeneratorFunction")),e.prototype=Object.create(m),e}return i.prototype=u,P(m,"constructor",u),P(u,"constructor",i),i.displayName="GeneratorFunction",P(u,l,"GeneratorFunction"),P(m),P(m,l,"Generator"),P(m,a,function(){return this}),P(m,"toString",function(){return"[object Generator]"}),(N=function(){return{w:r,m:d}})()}function P(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}P=function(e,t,n,a){function r(t,n){P(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},P(e,t,n,a)}function O(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}function D(e){return function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){O(r,a,l,c,o,"next",e)}function o(e){O(r,a,l,c,o,"throw",e)}c(void 0)})}}function j(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function B(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?j(Object(n),!0).forEach(function(t){M(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):j(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function M(e,t,n){return(t=function(e){var t=function(e){if("object"!=A(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=A(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==A(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function L(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,u=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){u=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw l}}return o}}(e,t)||I(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function I(e,t){if(e){if("string"==typeof e)return F(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?F(e,t):void 0}}function F(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var z=function(t){var a,l,r,c,o,i,u=t.subscriber,s=t.options,m=t.onSave,d=t.onClose,p=t.saving,E=L((0,e.useState)(u.status),2),f=E[0],R=E[1],v=L((0,e.useState)(function(){var e=u.preferences||{};return{categories:(e.categories||[]).map(function(e){return Number(e)}),tags:(e.tags||[]).map(function(e){return Number(e)}),service_bodies:(e.service_bodies||[]).map(function(e){return String(e)})}}),2),y=v[0],g=v[1],h=function(e,t,n){g(function(a){var l,r=a[e]||[];return B(B({},a),{},M({},e,n?[].concat(function(e){if(Array.isArray(e))return F(e)}(l=r)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(l)||I(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),[t]):r.filter(function(e){return e!==t})))})};return React.createElement(n.Modal,{title:"Edit Subscriber: ".concat(u.email),onRequestClose:d,className:"mayo-subscriber-edit-modal"},React.createElement("div",{style:{minWidth:"400px"}},React.createElement(n.SelectControl,{label:"Status",value:f,options:[{label:"Active",value:"active"},{label:"Pending",value:"pending"},{label:"Unsubscribed",value:"unsubscribed"}],onChange:R}),React.createElement("div",{style:{marginTop:"16px"}},React.createElement("h4",{style:{marginBottom:"8px"}},"Subscription Preferences"),React.createElement("p",{className:"description",style:{marginBottom:"12px"}},"Select which categories, tags, and service bodies this subscriber should receive notifications for. If none are selected, they will receive all announcements."),(null==s||null===(a=s.categories)||void 0===a?void 0:a.length)>0&&React.createElement("div",{style:{marginBottom:"16px"}},React.createElement("strong",{style:{display:"block",marginBottom:"8px"}},"Categories"),s.categories.map(function(e){return React.createElement(n.CheckboxControl,{key:e.id,label:e.name,checked:(t=e.id,y.categories.some(function(e){return Number(e)===Number(t)})),onChange:function(t){return h("categories",Number(e.id),t)}});var t})),(null==s||null===(l=s.tags)||void 0===l?void 0:l.length)>0&&React.createElement("div",{style:{marginBottom:"16px"}},React.createElement("strong",{style:{display:"block",marginBottom:"8px"}},"Tags"),s.tags.map(function(e){return React.createElement(n.CheckboxControl,{key:e.id,label:e.name,checked:(t=e.id,y.tags.some(function(e){return Number(e)===Number(t)})),onChange:function(t){return h("tags",Number(e.id),t)}});var t})),(null==s||null===(r=s.service_bodies)||void 0===r?void 0:r.length)>0&&React.createElement("div",{style:{marginBottom:"16px"}},React.createElement("strong",{style:{display:"block",marginBottom:"8px"}},"Service Bodies"),s.service_bodies.map(function(e){return React.createElement(n.CheckboxControl,{key:e.id,label:e.name,checked:(t=e.id,y.service_bodies.some(function(e){return String(e)===String(t)})),onChange:function(t){return h("service_bodies",String(e.id),t)}});var t})),!(null!=s&&null!==(c=s.categories)&&void 0!==c&&c.length)&&!(null!=s&&null!==(o=s.tags)&&void 0!==o&&o.length)&&!(null!=s&&null!==(i=s.service_bodies)&&void 0!==i&&i.length)&&React.createElement("p",{style:{color:"#646970",fontStyle:"italic"}},"No subscription options configured. Configure them in the Settings page.")),React.createElement("div",{style:{marginTop:"20px",display:"flex",gap:"8px",justifyContent:"flex-end"}},React.createElement(n.Button,{isSecondary:!0,onClick:d,disabled:p},"Cancel"),React.createElement(n.Button,{isPrimary:!0,onClick:function(){m(u.id,{status:f,preferences:y})},disabled:p},p?"Saving...":"Save Changes"))))};const G=function(){var t=L((0,e.useState)([]),2),a=t[0],l=t[1],r=L((0,e.useState)(!0),2),c=r[0],o=r[1],i=L((0,e.useState)(null),2),u=i[0],m=i[1],d=L((0,e.useState)("all"),2),p=d[0],E=d[1],f=L((0,e.useState)(""),2),R=f[0],v=f[1],y=L((0,e.useState)(null),2),g=y[0],h=y[1],b=L((0,e.useState)(null),2),_=b[0],S=b[1],w=L((0,e.useState)(!1),2),x=w[0],k=w[1];(0,e.useEffect)(function(){var e=function(){var e=D(N().m(function e(){var t,n,a,r,c;return N().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,Promise.all([s("/subscribers"),s("/subscription-options")]);case 1:t=e.v,n=L(t,2),a=n[0],r=n[1],l(a),S(r),e.n=3;break;case 2:e.p=2,c=e.v,m(c.message||"Failed to load subscribers");case 3:return e.p=3,o(!1),e.f(3);case 4:return e.a(2)}},e,null,[[0,2,3,4]])}));return function(){return e.apply(this,arguments)}}();e()},[]);var C=function(){var e=D(N().m(function e(t,n){var a,r;return N().w(function(e){for(;;)switch(e.p=e.n){case 0:return k(!0),e.p=1,e.n=2,s("/subscribers/".concat(t),{method:"PUT",body:JSON.stringify(n)});case 2:return e.n=3,s("/subscribers");case 3:a=e.v,l(a),h(null),e.n=5;break;case 4:e.p=4,r=e.v,alert("Failed to update subscriber: "+(r.message||"Unknown error"));case 5:return e.p=5,k(!1),e.f(5);case 6:return e.a(2)}},e,null,[[1,4,5,6]])}));return function(t,n){return e.apply(this,arguments)}}(),T=function(){var e=D(N().m(function e(t,n){var r;return N().w(function(e){for(;;)switch(e.p=e.n){case 0:if(t.preventDefault(),window.confirm('Are you sure you want to delete subscriber "'.concat(n.email,'"? This action cannot be undone.'))){e.n=1;break}return e.a(2);case 1:return e.p=1,e.n=2,s("/subscribers/".concat(n.id),{method:"DELETE"});case 2:l(a.filter(function(e){return e.id!==n.id})),e.n=4;break;case 3:e.p=3,r=e.v,alert("Failed to delete subscriber: "+(r.message||"Unknown error"));case 4:return e.a(2)}},e,null,[[1,3]])}));return function(t,n){return e.apply(this,arguments)}}(),A=(0,e.useMemo)(function(){return a.filter(function(e){return!("all"!==p&&e.status!==p||R&&!e.email.toLowerCase().includes(R.toLowerCase()))})},[a,p,R]),P=(0,e.useMemo)(function(){var e={all:a.length,active:0,pending:0,unsubscribed:0};return a.forEach(function(t){void 0!==e[t.status]&&e[t.status]++}),e},[a]),O=function(e){return e?new Date(e).toLocaleDateString("en-US",{year:"numeric",month:"2-digit",day:"2-digit"}):"—"},j={category:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#e3f2fd",color:"#1565c0",borderRadius:"3px",marginRight:"4px",marginBottom:"4px"},tag:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#fff3e0",color:"#e65100",borderRadius:"3px",marginRight:"4px",marginBottom:"4px"},serviceBody:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#e8f5e9",color:"#2e7d32",borderRadius:"3px",marginRight:"4px",marginBottom:"4px"},all:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#f0f0f0",color:"#666",borderRadius:"3px"}};return c?React.createElement("div",{className:"wrap"},React.createElement("h1",{className:"wp-heading-inline"},"Subscribers"),React.createElement("hr",{className:"wp-header-end"}),React.createElement("div",{style:{padding:"20px",textAlign:"center"}},React.createElement(n.Spinner,null))):u?React.createElement("div",{className:"wrap"},React.createElement("h1",{className:"wp-heading-inline"},"Subscribers"),React.createElement("hr",{className:"wp-header-end"}),React.createElement("div",{className:"notice notice-error"},React.createElement("p",null,u))):React.createElement("div",{className:"wrap"},React.createElement("h1",{className:"wp-heading-inline"},"Subscribers"),React.createElement("hr",{className:"wp-header-end"}),React.createElement("ul",{className:"subsubsub"},React.createElement("li",{className:"all"},React.createElement("a",{href:"#",className:"all"===p?"current":"",onClick:function(e){e.preventDefault(),E("all")}},"All ",React.createElement("span",{className:"count"},"(",P.all,")"))," |"),React.createElement("li",{className:"active"},React.createElement("a",{href:"#",className:"active"===p?"current":"",onClick:function(e){e.preventDefault(),E("active")}},"Active ",React.createElement("span",{className:"count"},"(",P.active,")"))," |"),React.createElement("li",{className:"pending"},React.createElement("a",{href:"#",className:"pending"===p?"current":"",onClick:function(e){e.preventDefault(),E("pending")}},"Pending ",React.createElement("span",{className:"count"},"(",P.pending,")"))," |"),React.createElement("li",{className:"unsubscribed"},React.createElement("a",{href:"#",className:"unsubscribed"===p?"current":"",onClick:function(e){e.preventDefault(),E("unsubscribed")}},"Unsubscribed ",React.createElement("span",{className:"count"},"(",P.unsubscribed,")")))),React.createElement("p",{className:"search-box"},React.createElement("label",{className:"screen-reader-text",htmlFor:"subscriber-search-input"},"Search Subscribers:"),React.createElement("input",{type:"search",id:"subscriber-search-input",value:R,onChange:function(e){return v(e.target.value)},placeholder:"Search by email..."})),React.createElement("div",{style:{clear:"both"}}),React.createElement("table",{className:"wp-list-table widefat fixed striped table-view-list"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",{scope:"col",className:"manage-column column-email column-primary"},"Email"),React.createElement("th",{scope:"col",className:"manage-column column-status"},"Status"),React.createElement("th",{scope:"col",className:"manage-column column-date"},"Subscribed"),React.createElement("th",{scope:"col",className:"manage-column column-date"},"Confirmed"),React.createElement("th",{scope:"col",className:"manage-column column-preferences"},"Preferences"))),React.createElement("tbody",{id:"the-list"},0===A.length?React.createElement("tr",{className:"no-items"},React.createElement("td",{className:"colspanchange",colSpan:"5"},"No subscribers found.")):A.map(function(t){var n,a,l,r,c,o,i;return React.createElement(e.Fragment,{key:t.id},React.createElement("tr",null,React.createElement("td",{className:"email column-email column-primary","data-colname":"Email"},React.createElement("strong",null,t.email),React.createElement("div",{className:"row-actions visible",style:{visibility:"visible"}},React.createElement("span",{className:"edit"},React.createElement("button",{type:"button",className:"button button-small button-primary",onClick:function(){return h(t)},style:{marginRight:"4px"}},"Edit")),React.createElement("span",{className:"delete"},React.createElement("button",{type:"button",className:"button button-small button-link-delete",onClick:function(e){return T(e,t)},style:{color:"#b32d2e"}},"Delete")))),React.createElement("td",{className:"status column-status","data-colname":"Status"},React.createElement("span",{className:"mayo-subscriber-status mayo-status-".concat(t.status)},t.status.charAt(0).toUpperCase()+t.status.slice(1))),React.createElement("td",{className:"date column-date","data-colname":"Subscribed"},O(t.created_at)),React.createElement("td",{className:"date column-date","data-colname":"Confirmed"},O(t.confirmed_at)),React.createElement("td",{className:"preferences column-preferences","data-colname":"Preferences"},React.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"2px"}},((r=t.preferences)?((null===(c=r.categories)||void 0===c?void 0:c.length)||0)+((null===(o=r.tags)||void 0===o?void 0:o.length)||0)+((null===(i=r.service_bodies)||void 0===i?void 0:i.length)||0):0)>0?React.createElement(React.Fragment,null,null===(n=t.preferences.categories)||void 0===n?void 0:n.map(function(e,n){var a;return React.createElement("span",{key:"cat-".concat(e),style:j.category},(null===(a=t.preferences_display)||void 0===a||null===(a=a.categories)||void 0===a?void 0:a[n])||function(e){var t,n=null==_||null===(t=_.categories)||void 0===t?void 0:t.find(function(t){return String(t.id)===String(e)});return(null==n?void 0:n.name)||"Category ".concat(e)}(e))}),null===(a=t.preferences.tags)||void 0===a?void 0:a.map(function(e,n){var a;return React.createElement("span",{key:"tag-".concat(e),style:j.tag},(null===(a=t.preferences_display)||void 0===a||null===(a=a.tags)||void 0===a?void 0:a[n])||function(e){var t,n=null==_||null===(t=_.tags)||void 0===t?void 0:t.find(function(t){return String(t.id)===String(e)});return(null==n?void 0:n.name)||"Tag ".concat(e)}(e))}),null===(l=t.preferences.service_bodies)||void 0===l?void 0:l.map(function(e,n){var a;return React.createElement("span",{key:"sb-".concat(e),style:j.serviceBody},(null===(a=t.preferences_display)||void 0===a||null===(a=a.service_bodies)||void 0===a?void 0:a[n])||function(e){var t,n=null==_||null===(t=_.service_bodies)||void 0===t?void 0:t.find(function(t){return String(t.id)===String(e)});return(null==n?void 0:n.name)||"Service Body ".concat(e)}(e))})):React.createElement("span",{style:j.all},"All announcements")))))})),React.createElement("tfoot",null,React.createElement("tr",null,React.createElement("th",{scope:"col",className:"manage-column column-email column-primary"},"Email"),React.createElement("th",{scope:"col",className:"manage-column column-status"},"Status"),React.createElement("th",{scope:"col",className:"manage-column column-date"},"Subscribed"),React.createElement("th",{scope:"col",className:"manage-column column-date"},"Confirmed"),React.createElement("th",{scope:"col",className:"manage-column column-preferences"},"Preferences")))),React.createElement("div",{className:"tablenav bottom"},React.createElement("div",{className:"tablenav-pages one-page"},React.createElement("span",{className:"displaying-num"},A.length," item",1!==A.length?"s":""))),g&&React.createElement(z,{subscriber:g,options:_,onSave:C,onClose:function(){return h(null)},saving:x}))},U=wp.plugins,W=React;function H(e){return H="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},H(e)}function Y(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function q(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Y(Object(n),!0).forEach(function(t){J(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Y(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function J(e,t,n){return(t=function(e){var t=function(e){if("object"!=H(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=H(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==H(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function $(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",l=n.toStringTag||"@@toStringTag";function r(n,a,l,r){var i=a&&a.prototype instanceof o?a:o,u=Object.create(i.prototype);return K(u,"_invoke",function(n,a,l){var r,o,i,u=0,s=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,o=0,i=e,d.n=n,c}};function p(n,a){for(o=n,i=a,t=0;!m&&u&&!l&&t<s.length;t++){var l,r=s[t],p=d.p,E=r[2];n>3?(l=E===a)&&(i=r[(o=r[4])?5:(o=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(o=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,o=0))}if(l||n>1)return c;throw m=!0,a}return function(l,s,E){if(u>1)throw TypeError("Generator is already running");for(m&&1===s&&p(s,E),o=s,i=E;(t=o<2?e:i)||!m;){r||(o?o<3?(o>1&&(d.n=-1),p(o,i)):d.n=i:d.v=i);try{if(u=2,r){if(o||(l="next"),t=r[l]){if(!(t=t.call(r,i)))throw TypeError("iterator result is not an object");if(!t.done)return t;i=t.value,o<2&&(o=0)}else 1===o&&(t=r.return)&&t.call(r),o<2&&(i=TypeError("The iterator does not provide a '"+l+"' method"),o=1);r=e}else if((t=(m=d.n<0)?i:n.call(a,d))!==c)break}catch(t){r=e,o=1,i=t}finally{u=1}}return{value:t,done:m}}}(n,l,r),!0),u}var c={};function o(){}function i(){}function u(){}t=Object.getPrototypeOf;var s=[][a]?t(t([][a]())):(K(t={},a,function(){return this}),t),m=u.prototype=o.prototype=Object.create(s);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,u):(e.__proto__=u,K(e,l,"GeneratorFunction")),e.prototype=Object.create(m),e}return i.prototype=u,K(m,"constructor",u),K(u,"constructor",i),i.displayName="GeneratorFunction",K(u,l,"GeneratorFunction"),K(m),K(m,l,"Generator"),K(m,a,function(){return this}),K(m,"toString",function(){return"[object Generator]"}),($=function(){return{w:r,m:d}})()}function K(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}K=function(e,t,n,a){function r(t,n){K(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},K(e,t,n,a)}function V(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}function Z(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,u=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){u=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw l}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Q(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Q(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Q(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var X=(0,W.createContext)(),ee=function(){return(0,W.useContext)(X)},te=function(e){var t=e.children,n=Z((0,W.useState)([]),2),a=n[0],l=n[1],r=Z((0,W.useState)({}),2),c=r[0],o=r[1],i=Z((0,W.useState)(!0),2),u=i[0],m=i[1];return(0,W.useEffect)(function(){var e=function(){var e,t=(e=$().m(function e(){var t,n,a,r,c,o;return $().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,m(!0),e.n=1,s("/settings");case 1:if(t=e.v,n=t.bmlt_root_server){e.n=2;break}throw new Error("BMLT root server URL not set");case 2:return e.n=3,fetch("".concat(n,"/client_interface/json/?switcher=GetServiceBodies"));case 3:return a=e.v,e.n=4,a.json();case 4:r=e.v,c=r.sort(function(e,t){return e.name.localeCompare(t.name)}),l(c),e.n=6;break;case 5:e.p=5,o=e.v,console.error("Error fetching service bodies:",o),setError("Failed to load service bodies");case 6:return e.p=6,m(!1),e.f(6);case 7:return e.a(2)}},e,null,[[0,5,6,7]])}),function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){V(r,a,l,c,o,"next",e)}function o(e){V(r,a,l,c,o,"throw",e)}c(void 0)})});return function(){return t.apply(this,arguments)}}();e()},[]),React.createElement(X.Provider,{value:{serviceBodies:a,getServiceBodyName:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"local";if("local"===t){var n=a.find(function(t){return t.id===e});return(null==n?void 0:n.name)||"Out of Area"}if(c[t]){var l=c[t].find(function(t){return t.id===e});return(null==l?void 0:l.name)||"Out of Area"}return"Out of Area"},updateExternalServiceBodies:function(e,t){t&&Array.isArray(t)&&0!==t.length&&o(function(n){return q(q({},n),{},J({},e,t))})}}},u?React.createElement("div",null,"Loading..."):t)};const ne=wp.editor,ae=wp.data;wp.i18n;var le=[{label:"Eastern Time (US/Canada)",value:"America/New_York",region:"North America"},{label:"Central Time (US/Canada)",value:"America/Chicago",region:"North America"},{label:"Mountain Time (US/Canada)",value:"America/Denver",region:"North America"},{label:"Pacific Time (US/Canada)",value:"America/Los_Angeles",region:"North America"},{label:"Alaska Time (US)",value:"America/Anchorage",region:"North America"},{label:"Hawaii Time (US)",value:"Pacific/Honolulu",region:"North America"},{label:"Atlantic Time (Canada)",value:"America/Halifax",region:"North America"},{label:"Newfoundland Time (Canada)",value:"America/St_Johns",region:"North America"},{label:"Mexico City Time",value:"America/Mexico_City",region:"North America"},{label:"London (GMT/BST)",value:"Europe/London",region:"Europe"},{label:"Paris (CET/CEST)",value:"Europe/Paris",region:"Europe"},{label:"Berlin (CET/CEST)",value:"Europe/Berlin",region:"Europe"},{label:"Rome (CET/CEST)",value:"Europe/Rome",region:"Europe"},{label:"Madrid (CET/CEST)",value:"Europe/Madrid",region:"Europe"},{label:"Amsterdam (CET/CEST)",value:"Europe/Amsterdam",region:"Europe"},{label:"Brussels (CET/CEST)",value:"Europe/Brussels",region:"Europe"},{label:"Zurich (CET/CEST)",value:"Europe/Zurich",region:"Europe"},{label:"Vienna (CET/CEST)",value:"Europe/Vienna",region:"Europe"},{label:"Stockholm (CET/CEST)",value:"Europe/Stockholm",region:"Europe"},{label:"Oslo (CET/CEST)",value:"Europe/Oslo",region:"Europe"},{label:"Copenhagen (CET/CEST)",value:"Europe/Copenhagen",region:"Europe"},{label:"Helsinki (EET/EEST)",value:"Europe/Helsinki",region:"Europe"},{label:"Athens (EET/EEST)",value:"Europe/Athens",region:"Europe"},{label:"Istanbul (TRT)",value:"Europe/Istanbul",region:"Europe"},{label:"Moscow (MSK)",value:"Europe/Moscow",region:"Europe"},{label:"Dublin (GMT/IST)",value:"Europe/Dublin",region:"Europe"},{label:"Lisbon (WET/WEST)",value:"Europe/Lisbon",region:"Europe"},{label:"Tokyo (JST)",value:"Asia/Tokyo",region:"Asia"},{label:"Shanghai (CST)",value:"Asia/Shanghai",region:"Asia"},{label:"Hong Kong (HKT)",value:"Asia/Hong_Kong",region:"Asia"},{label:"Singapore (SGT)",value:"Asia/Singapore",region:"Asia"},{label:"Seoul (KST)",value:"Asia/Seoul",region:"Asia"},{label:"Bangkok (ICT)",value:"Asia/Bangkok",region:"Asia"},{label:"Manila (PHT)",value:"Asia/Manila",region:"Asia"},{label:"Jakarta (WIB)",value:"Asia/Jakarta",region:"Asia"},{label:"Mumbai (IST)",value:"Asia/Kolkata",region:"Asia"},{label:"Dubai (GST)",value:"Asia/Dubai",region:"Asia"},{label:"Riyadh (AST)",value:"Asia/Riyadh",region:"Asia"},{label:"Tel Aviv (IST)",value:"Asia/Jerusalem",region:"Asia"},{label:"Dhaka (BST)",value:"Asia/Dhaka",region:"Asia"},{label:"Karachi (PKT)",value:"Asia/Karachi",region:"Asia"},{label:"Tashkent (UZT)",value:"Asia/Tashkent",region:"Asia"},{label:"Sydney (AEST/AEDT)",value:"Australia/Sydney",region:"Australia & Oceania"},{label:"Melbourne (AEST/AEDT)",value:"Australia/Melbourne",region:"Australia & Oceania"},{label:"Brisbane (AEST)",value:"Australia/Brisbane",region:"Australia & Oceania"},{label:"Perth (AWST)",value:"Australia/Perth",region:"Australia & Oceania"},{label:"Adelaide (ACST/ACDT)",value:"Australia/Adelaide",region:"Australia & Oceania"},{label:"Darwin (ACST)",value:"Australia/Darwin",region:"Australia & Oceania"},{label:"Hobart (AEST/AEDT)",value:"Australia/Hobart",region:"Australia & Oceania"},{label:"Auckland (NZST/NZDT)",value:"Pacific/Auckland",region:"Australia & Oceania"},{label:"Wellington (NZST/NZDT)",value:"Pacific/Auckland",region:"Australia & Oceania"},{label:"Fiji (FJT)",value:"Pacific/Fiji",region:"Australia & Oceania"},{label:"Cairo (EET)",value:"Africa/Cairo",region:"Africa"},{label:"Cape Town (SAST)",value:"Africa/Johannesburg",region:"Africa"},{label:"Lagos (WAT)",value:"Africa/Lagos",region:"Africa"},{label:"Nairobi (EAT)",value:"Africa/Nairobi",region:"Africa"},{label:"Casablanca (WET)",value:"Africa/Casablanca",region:"Africa"},{label:"Tunis (CET)",value:"Africa/Tunis",region:"Africa"},{label:"São Paulo (BRT)",value:"America/Sao_Paulo",region:"South America"},{label:"Buenos Aires (ART)",value:"America/Argentina/Buenos_Aires",region:"South America"},{label:"Santiago (CLT)",value:"America/Santiago",region:"South America"},{label:"Lima (PET)",value:"America/Lima",region:"South America"},{label:"Bogotá (COT)",value:"America/Bogota",region:"South America"},{label:"Caracas (VET)",value:"America/Caracas",region:"South America"}],re=function(){return le.map(function(e){return{label:e.label,value:e.value}})},ce=function(){try{var e=Intl.DateTimeFormat().resolvedOptions().timeZone;return le.find(function(t){return t.value===e})?e:"America/New_York"}catch(e){return"America/New_York"}};function oe(e){return oe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},oe(e)}function ie(e){return function(e){if(Array.isArray(e))return ve(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||Re(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ue(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function se(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ue(Object(n),!0).forEach(function(t){me(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ue(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function me(e,t,n){return(t=function(e){var t=function(e){if("object"!=oe(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=oe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==oe(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function de(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",l=n.toStringTag||"@@toStringTag";function r(n,a,l,r){var i=a&&a.prototype instanceof o?a:o,u=Object.create(i.prototype);return pe(u,"_invoke",function(n,a,l){var r,o,i,u=0,s=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,o=0,i=e,d.n=n,c}};function p(n,a){for(o=n,i=a,t=0;!m&&u&&!l&&t<s.length;t++){var l,r=s[t],p=d.p,E=r[2];n>3?(l=E===a)&&(i=r[(o=r[4])?5:(o=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(o=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,o=0))}if(l||n>1)return c;throw m=!0,a}return function(l,s,E){if(u>1)throw TypeError("Generator is already running");for(m&&1===s&&p(s,E),o=s,i=E;(t=o<2?e:i)||!m;){r||(o?o<3?(o>1&&(d.n=-1),p(o,i)):d.n=i:d.v=i);try{if(u=2,r){if(o||(l="next"),t=r[l]){if(!(t=t.call(r,i)))throw TypeError("iterator result is not an object");if(!t.done)return t;i=t.value,o<2&&(o=0)}else 1===o&&(t=r.return)&&t.call(r),o<2&&(i=TypeError("The iterator does not provide a '"+l+"' method"),o=1);r=e}else if((t=(m=d.n<0)?i:n.call(a,d))!==c)break}catch(t){r=e,o=1,i=t}finally{u=1}}return{value:t,done:m}}}(n,l,r),!0),u}var c={};function o(){}function i(){}function u(){}t=Object.getPrototypeOf;var s=[][a]?t(t([][a]())):(pe(t={},a,function(){return this}),t),m=u.prototype=o.prototype=Object.create(s);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,u):(e.__proto__=u,pe(e,l,"GeneratorFunction")),e.prototype=Object.create(m),e}return i.prototype=u,pe(m,"constructor",u),pe(u,"constructor",i),i.displayName="GeneratorFunction",pe(u,l,"GeneratorFunction"),pe(m),pe(m,l,"Generator"),pe(m,a,function(){return this}),pe(m,"toString",function(){return"[object Generator]"}),(de=function(){return{w:r,m:d}})()}function pe(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}pe=function(e,t,n,a){function r(t,n){pe(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},pe(e,t,n,a)}function Ee(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}function fe(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,u=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){u=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw l}}return o}}(e,t)||Re(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Re(e,t){if(e){if("string"==typeof e)return ve(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ve(e,t):void 0}}function ve(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}const ye=function(){var t,a,l=ee().serviceBodies,r=fe((0,e.useState)(!1),2),c=r[0],o=r[1],i=fe((0,e.useState)(""),2),u=i[0],m=i[1],d=fe((0,e.useState)([]),2),p=d[0],E=d[1],f=fe((0,e.useState)(!1),2),R=f[0],v=f[1],y=(0,ae.useSelect)(function(e){return e("core/editor").getCurrentPostType()}),g=(0,ae.useSelect)(function(e){return e("core/editor").getCurrentPostId()}),h=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("meta")||{}}),b=(0,ae.useDispatch)("core/editor").editPost,_=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("status")});if((0,e.useEffect)(function(){if("mayo_event"===y&&g&&"auto-draft"!==_){var e=function(){var e,t=(e=de().m(function e(){var t,n;return de().w(function(e){for(;;)switch(e.p=e.n){case 0:return v(!0),e.p=1,e.n=2,s("/announcements?linked_event=".concat(g));case 2:t=e.v,E(t.announcements||[]),e.n=4;break;case 3:e.p=3,n=e.v,console.error("Error fetching linked announcements:",n),E([]);case 4:v(!1);case 5:return e.a(2)}},e,null,[[1,3]])}),function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){Ee(r,a,l,c,o,"next",e)}function o(e){Ee(r,a,l,c,o,"throw",e)}c(void 0)})});return function(){return t.apply(this,arguments)}}();e()}},[y,g,_]),"mayo_event"!==y)return null;var S="auto-draft"===_,w=function(e,t){b({meta:se(se({},h),{},me({},e,t))})};(0,e.useEffect)(function(){if(S&&!h.timezone){var e=ce();w("timezone",e)}},[S,h.timezone]);var x=h.recurring_pattern||{type:"none",interval:1,weekdays:[],endDate:"",monthlyType:"date",monthlyDate:"",monthlyWeekday:""},k=function(e){var t=se(se(se({},x),e),{},{weekdays:e.weekdays||x.weekdays||[]});w("recurring_pattern",t)},C=h.skipped_occurrences||[],T=[{value:0,label:"Sunday"},{value:1,label:"Monday"},{value:2,label:"Tuesday"},{value:3,label:"Wednesday"},{value:4,label:"Thursday"},{value:5,label:"Friday"},{value:6,label:"Saturday"}],A=function(){return h.event_start_date?new Date(h.event_start_date).getDate().toString():""},N=function(){if(h.event_start_date){var e=new Date(h.event_start_date),t=Math.ceil(e.getDate()/7);return"".concat(t,",").concat(e.getDay())}return""};return React.createElement(React.Fragment,null,React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-event-details",title:"Event Details",className:"mayo-event-details"},React.createElement(n.SelectControl,{label:"Event Type",value:h.event_type,options:[{label:"Select Event Type",value:""},{label:"Service",value:"Service"},{label:"Activity",value:"Activity"}],onChange:function(e){return w("event_type",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.PanelBody,{title:"Event Date & Time",initialOpen:!0},React.createElement("div",{className:"mayo-sidebar-datetime"},React.createElement("p",{className:"mayo-sidebar-label"},"Start Date/Time"),React.createElement("div",{className:"mayo-sidebar-datetime-inputs"},React.createElement(n.TextControl,{type:"date",value:h.event_start_date,onChange:function(e){return w("event_start_date",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{type:"time",value:h.event_start_time,onChange:function(e){return w("event_start_time",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement("p",{className:"mayo-sidebar-label"},"End Date/Time"),React.createElement("div",{className:"mayo-sidebar-datetime-inputs"},React.createElement(n.TextControl,{type:"date",value:h.event_end_date,onChange:function(e){return w("event_end_date",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{type:"time",value:h.event_end_time,onChange:function(e){return w("event_end_time",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}))),React.createElement(n.SelectControl,{label:"Timezone",value:h.timezone||"",options:[{label:"-- No timezone set --",value:""}].concat(ie(re())),onChange:function(e){return w("timezone",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement(n.PanelBody,{title:"Recurring Pattern",initialOpen:!0},React.createElement(n.SelectControl,{label:"Repeat",value:x.type,options:[{label:"No Recurrence",value:"none"},{label:"Daily",value:"daily"},{label:"Weekly",value:"weekly"},{label:"Monthly",value:"monthly"}],onChange:function(e){return k({type:e})},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),"none"!==x.type&&React.createElement(React.Fragment,null,React.createElement("div",{className:"mayo-recurring-interval"},React.createElement(n.__experimentalNumberControl,{label:"Repeat every",min:1,value:x.interval,onChange:function(e){return k({interval:e})}}),React.createElement("span",null,"daily"===x.type?"days":"weekly"===x.type?"weeks":"months")),"weekly"===x.type&&React.createElement("div",{className:"mayo-weekday-controls"},React.createElement("p",{className:"components-base-control__label"},"On these days"),T.map(function(e){return React.createElement(n.CheckboxControl,{key:e.value,label:e.label,checked:x.weekdays.includes(e.value),onChange:function(t){var n=t?[].concat(ie(x.weekdays),[e.value]):x.weekdays.filter(function(t){return t!==e.value});k({weekdays:n})}})})),React.createElement(n.TextControl,{label:"End Date (optional)",type:"date",value:x.endDate,onChange:function(e){return k({endDate:e})},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),"monthly"===x.type&&React.createElement("div",{className:"mayo-monthly-pattern"},React.createElement(n.RadioControl,{label:"Monthly Pattern",selected:x.monthlyType||"date",options:[{label:"On a specific date",value:"date"},{label:"On a specific day",value:"weekday"}],onChange:function(e){return k({monthlyType:e,monthlyDate:"date"===e?A():"",monthlyWeekday:"weekday"===e?N():""})}}),"date"===x.monthlyType&&React.createElement(n.__experimentalNumberControl,{label:"Day of month",value:x.monthlyDate||A(),onChange:function(e){return k({monthlyDate:e})},min:1,max:31}),"weekday"===x.monthlyType&&React.createElement("div",{className:"mayo-monthly-weekday"},React.createElement(n.SelectControl,{label:"Week",value:(null===(t=x.monthlyWeekday)||void 0===t?void 0:t.split(",")[0])||"1",options:[{value:"1",label:"First"},{value:"2",label:"Second"},{value:"3",label:"Third"},{value:"4",label:"Fourth"},{value:"5",label:"Fifth"},{value:"-1",label:"Last"}],onChange:function(e){var t,n=(null===(t=x.monthlyWeekday)||void 0===t?void 0:t.split(",")[1])||"0";k({monthlyWeekday:"".concat(e,",").concat(n)})},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.SelectControl,{label:"Day",value:(null===(a=x.monthlyWeekday)||void 0===a?void 0:a.split(",")[1])||"0",options:T,onChange:function(e){var t,n=(null===(t=x.monthlyWeekday)||void 0===t?void 0:t.split(",")[0])||"1";k({monthlyWeekday:"".concat(n,",").concat(e)})},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})))),"none"!==x.type&&React.createElement(n.PanelBody,{title:"Skipped Occurrences",initialOpen:!1},React.createElement("p",{className:"components-base-control__help"},"Manage specific dates when this recurring event should not occur."),C.length>0&&React.createElement("div",{className:"mayo-skipped-occurrences-list"},React.createElement("p",{className:"components-base-control__label"},"Skipped Dates:"),C.map(function(e,t){return React.createElement("div",{key:t,className:"mayo-skipped-occurrence-item"},React.createElement("span",null,(l=(a=fe(e.split("-").map(Number),3))[0],r=a[1],c=a[2],new Date(l,r-1,c).toLocaleDateString("en-US",{weekday:"long",year:"numeric",month:"long",day:"numeric"}))),React.createElement(n.Button,{isSmall:!0,isDestructive:!0,onClick:function(){return t=e,n=C.filter(function(e){return e!==t}),void w("skipped_occurrences",n);var t,n}},"Remove"));var a,l,r,c})),c?React.createElement("div",{className:"mayo-add-skip-form"},React.createElement(n.TextControl,{type:"date",label:"Date to skip",value:u,onChange:m,__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement("div",{className:"mayo-add-skip-actions"},React.createElement(n.Button,{isPrimary:!0,isSmall:!0,onClick:function(){if(u){var e=[].concat(ie(C),[u]);w("skipped_occurrences",e),m(""),o(!1)}},disabled:!u},"Add Skip"),React.createElement(n.Button,{isSecondary:!0,isSmall:!0,onClick:function(){o(!1),m("")}},"Cancel"))):React.createElement(n.Button,{isSecondary:!0,isSmall:!0,onClick:function(){return o(!0)}},"Add Skipped Date")),React.createElement(n.PanelBody,{title:"Service Body",initialOpen:!0},React.createElement(n.SelectControl,{label:"Service Body",value:h.service_body,options:[{label:"Select a service body",value:""},{label:"Unaffiliated (0)",value:"0"}].concat(ie(l.map(function(e){return{label:"".concat(e.name," (").concat(e.id,")"),value:e.id}}))),onChange:function(e){return w("service_body",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement(n.PanelBody,{title:"Location Details",initialOpen:!0},React.createElement(n.TextControl,{label:"Location Name",value:h.location_name,onChange:function(e){return w("location_name",e)},placeholder:"e.g., Community Center",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Address",value:h.location_address,onChange:function(e){return w("location_address",e)},placeholder:"Full address",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Location Details",value:h.location_details,onChange:function(e){return w("location_details",e)},placeholder:"Parking info, entrance details, etc.",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}))),React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-point-of-contact",title:"Point of Contact",className:"mayo-private-contact"},React.createElement(n.PanelBody,{title:"Contact Information (Private)",initialOpen:!0},React.createElement(n.TextControl,{label:"Contact Name",value:h.contact_name,onChange:function(e){return w("contact_name",e)},placeholder:"Full name of the contact person",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Contact Email",value:h.email,onChange:function(e){return w("email",e)},placeholder:"Email address",type:"email",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}))),!S&&React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-linked-announcements",title:"Linked Announcements",className:"mayo-linked-announcements"},React.createElement("p",{className:"components-base-control__help",style:{marginTop:0}},"Announcements that reference this event."),R&&React.createElement("div",{style:{textAlign:"center",padding:"16px"}},React.createElement(n.Spinner,null)),!R&&0===p.length&&React.createElement("p",{style:{color:"#666",fontStyle:"italic"}},"No announcements linked to this event."),!R&&p.length>0&&React.createElement("div",{className:"mayo-linked-announcements-list"},p.map(function(e){var t=e.is_active?"#46b450":e.display_start_date&&e.display_start_date>(new Date).toISOString().split("T")[0]?"#0073aa":"#dc3545",n=e.is_active?"Active":e.display_start_date&&e.display_start_date>(new Date).toISOString().split("T")[0]?"Scheduled":"Expired";return React.createElement("div",{key:e.id,style:{padding:"10px 12px",backgroundColor:"#f9f9f9",borderRadius:"4px",marginBottom:"8px",borderLeft:"3px solid ".concat(t)}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"}},React.createElement("strong",null,e.title),React.createElement("span",{style:{fontSize:"11px",color:t,fontWeight:600}},n)),React.createElement("div",{style:{fontSize:"12px",color:"#666",marginTop:"4px"}},"Priority: ",React.createElement("span",{style:{color:"urgent"===e.priority?"#dc3545":"high"===e.priority?"#ff9800":"low"===e.priority?"#6c757d":"#0073aa",fontWeight:600}},e.priority)),React.createElement("div",{style:{display:"flex",gap:"8px",marginTop:"8px"}},e.edit_link&&React.createElement("a",{href:e.edit_link,target:"_blank",rel:"noopener noreferrer",style:{display:"inline-flex",alignItems:"center",padding:"4px 8px",fontSize:"11px",backgroundColor:"#f0f0f0",border:"1px solid #c3c4c7",borderRadius:"3px",textDecoration:"none",color:"#2271b1",whiteSpace:"nowrap"}},React.createElement("span",{className:"dashicons dashicons-edit",style:{fontSize:"14px",marginRight:"4px",width:"14px",height:"14px"}}),"Edit")))})),React.createElement("div",{style:{marginTop:"12px"}},React.createElement(n.Button,{isSecondary:!0,href:"".concat(window.location.origin,"/wp-admin/post-new.php?post_type=mayo_announcement&linked_event=").concat(g),target:"_blank"},"Create Announcement"))))};function ge(e){return ge="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ge(e)}function he(e){if(null!=e){var t=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(ge(e)+" is not iterable")}function be(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=Pe(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var a=0,l=function(){};return{s:l,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:l}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,c=!0,o=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return c=e.done,e},e:function(e){o=!0,r=e},f:function(){try{c||null==n.return||n.return()}finally{if(o)throw r}}}}function _e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function Se(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?_e(Object(n),!0).forEach(function(t){we(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):_e(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function we(e,t,n){return(t=function(e){var t=function(e){if("object"!=ge(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=ge(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==ge(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function xe(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",l=n.toStringTag||"@@toStringTag";function r(n,a,l,r){var i=a&&a.prototype instanceof o?a:o,u=Object.create(i.prototype);return ke(u,"_invoke",function(n,a,l){var r,o,i,u=0,s=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,o=0,i=e,d.n=n,c}};function p(n,a){for(o=n,i=a,t=0;!m&&u&&!l&&t<s.length;t++){var l,r=s[t],p=d.p,E=r[2];n>3?(l=E===a)&&(i=r[(o=r[4])?5:(o=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(o=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,o=0))}if(l||n>1)return c;throw m=!0,a}return function(l,s,E){if(u>1)throw TypeError("Generator is already running");for(m&&1===s&&p(s,E),o=s,i=E;(t=o<2?e:i)||!m;){r||(o?o<3?(o>1&&(d.n=-1),p(o,i)):d.n=i:d.v=i);try{if(u=2,r){if(o||(l="next"),t=r[l]){if(!(t=t.call(r,i)))throw TypeError("iterator result is not an object");if(!t.done)return t;i=t.value,o<2&&(o=0)}else 1===o&&(t=r.return)&&t.call(r),o<2&&(i=TypeError("The iterator does not provide a '"+l+"' method"),o=1);r=e}else if((t=(m=d.n<0)?i:n.call(a,d))!==c)break}catch(t){r=e,o=1,i=t}finally{u=1}}return{value:t,done:m}}}(n,l,r),!0),u}var c={};function o(){}function i(){}function u(){}t=Object.getPrototypeOf;var s=[][a]?t(t([][a]())):(ke(t={},a,function(){return this}),t),m=u.prototype=o.prototype=Object.create(s);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,u):(e.__proto__=u,ke(e,l,"GeneratorFunction")),e.prototype=Object.create(m),e}return i.prototype=u,ke(m,"constructor",u),ke(u,"constructor",i),i.displayName="GeneratorFunction",ke(u,l,"GeneratorFunction"),ke(m),ke(m,l,"Generator"),ke(m,a,function(){return this}),ke(m,"toString",function(){return"[object Generator]"}),(xe=function(){return{w:r,m:d}})()}function ke(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}ke=function(e,t,n,a){function r(t,n){ke(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},ke(e,t,n,a)}function Ce(e){return function(e){if(Array.isArray(e))return Oe(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||Pe(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Te(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}function Ae(e){return function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){Te(r,a,l,c,o,"next",e)}function o(e){Te(r,a,l,c,o,"throw",e)}c(void 0)})}}function Ne(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,u=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){u=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw l}}return o}}(e,t)||Pe(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Pe(e,t){if(e){if("string"==typeof e)return Oe(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Oe(e,t):void 0}}function Oe(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}(0,U.getPlugins)().some(function(e){return"mayo-event-details"===e.name})||(0,U.registerPlugin)("mayo-event-details",{render:function(){return React.createElement(te,null,React.createElement(ye,null))},icon:"calendar"});var De=function(t){var a=t.isOpen,l=t.onClose,r=t.onSelectEvent,c=t.onRemoveEvent,o=t.linkedEventRefs,i=(t.getRefKey,Ne((0,e.useState)(""),2)),u=i[0],m=i[1],d=Ne((0,e.useState)([]),2),p=d[0],E=d[1],f=Ne((0,e.useState)(!1),2),R=f[0],v=f[1],y=Ne((0,e.useState)(!1),2),g=y[0],h=y[1],b=Ne((0,e.useState)(1),2),_=b[0],S=b[1],w=Ne((0,e.useState)(!0),2),x=w[0],k=w[1],C=Ne((0,e.useState)(0),2),T=C[0],A=C[1],N=Ne((0,e.useState)(!0),2),P=N[0],O=N[1],D=(0,e.useRef)(null),j=(0,e.useRef)(null),B=function(e){return o.some(function(t){return"local"===t.type&&"local"===e.source.type?t.id===e.id:"external"===t.type&&"external"===e.source.type&&t.id===e.id&&t.source_id===e.source.id})},M=(0,e.useCallback)(function(){var e=Ae(xe().m(function e(t,n,a){var l,r,c,o,i,u=arguments;return xe().w(function(e){for(;;)switch(e.p=e.n){case 0:return l=u.length>3&&void 0!==u[3]&&u[3],1===n?v(!0):h(!0),e.p=1,r=new URLSearchParams({per_page:20,page:n,hide_past:a?"1":"0"}),t&&r.append("search",t),e.n=2,s("/events/search-all?".concat(r.toString()));case 2:c=e.v,o=c.events||[],E(l?function(e){return[].concat(Ce(e),Ce(o))}:o),A(c.total||0),k(n<(c.total_pages||1)),S(n),e.n=4;break;case 3:e.p=3,i=e.v,console.error("Error fetching events:",i),l||E([]),k(!1);case 4:return e.p=4,v(!1),h(!1),e.f(4);case 5:return e.a(2)}},e,null,[[1,3,4,5]])}));return function(t,n,a){return e.apply(this,arguments)}}(),[]);(0,e.useEffect)(function(){if(a)return j.current&&clearTimeout(j.current),j.current=setTimeout(function(){M(u,1,P,!1)},300),function(){j.current&&clearTimeout(j.current)}},[a,u,P,M]),(0,e.useEffect)(function(){a&&(m(""),E([]),S(1),k(!0),O(!0))},[a]);var L=(0,e.useCallback)(function(){if(D.current&&!R&&!g&&x){var e=D.current,t=e.scrollTop;e.scrollHeight-t-e.clientHeight<100&&M(u,_+1,P,!0)}},[R,g,x,u,_,P,M]);return a?React.createElement(n.Modal,{title:"Link Events",onRequestClose:l,style:{maxWidth:"600px",width:"100%"},className:"mayo-event-search-modal"},React.createElement("div",{style:{marginBottom:"16px"}},React.createElement(n.TextControl,{label:"Search Events",value:u,onChange:m,placeholder:"Search by event name...",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginTop:"8px"}},React.createElement(n.CheckboxControl,{label:"Hide past events",checked:P,onChange:O,__nextHasNoMarginBottom:!0}),T>0&&React.createElement("span",{style:{fontSize:"12px",color:"#666"}},T," event",1!==T?"s":""," found"))),React.createElement("div",{ref:D,onScroll:L,style:{maxHeight:"400px",overflowY:"auto",border:"1px solid #ddd",borderRadius:"4px",backgroundColor:"#fff"}},R&&React.createElement("div",{style:{textAlign:"center",padding:"40px"}},React.createElement(n.Spinner,null),React.createElement("p",{style:{margin:"8px 0 0",color:"#666"}},"Loading events...")),!R&&0===p.length&&React.createElement("div",{style:{textAlign:"center",padding:"40px",color:"#666"}},u?'No events found matching "'.concat(u,'"'):"No events available"),!R&&p.map(function(e){var t="external"===e.source.type,a=B(e),l=t?"external-".concat(e.source.id,"-").concat(e.id):"local-".concat(e.id);return React.createElement("div",{key:l,style:{padding:"12px 16px",borderBottom:"1px solid #eee",cursor:"pointer",transition:"background-color 0.2s",backgroundColor:a?"#e8f5e9":"transparent",borderLeft:"4px solid ".concat(a?"#4caf50":t?"#ff9800":"#0073aa")},onClick:function(){return a?null:function(e){B(e)||r(e)}(e)},onMouseEnter:function(e){a||(e.currentTarget.style.backgroundColor="#f0f7ff")},onMouseLeave:function(e){a||(e.currentTarget.style.backgroundColor=a?"#e8f5e9":"transparent")}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"}},React.createElement("div",{style:{flex:1}},React.createElement("div",{style:{fontWeight:600,marginBottom:"4px",display:"flex",alignItems:"center"}},a&&React.createElement("span",{className:"dashicons dashicons-yes-alt",style:{color:"#4caf50",fontSize:"16px",marginRight:"6px",width:"16px",height:"16px"}}),e.title),e.start_date&&React.createElement("div",{style:{fontSize:"12px",color:"#666",marginBottom:"4px"}},React.createElement("span",{className:"dashicons dashicons-calendar-alt",style:{fontSize:"12px",marginRight:"4px",verticalAlign:"middle",width:"12px",height:"12px"}}),function(e){if(!e)return"";try{var t=Ne(e.split("-").map(Number),3),n=t[0],a=t[1],l=t[2];return new Date(n,a-1,l).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}catch(t){return e}}(e.start_date))),React.createElement("div",{style:{display:"flex",alignItems:"center",gap:"8px"}},React.createElement("span",{style:{fontSize:"10px",backgroundColor:t?"#fff3e0":"#e3f2fd",color:t?"#e65100":"#1565c0",padding:"3px 8px",borderRadius:"3px",whiteSpace:"nowrap"}},e.source.name),a&&React.createElement(n.Button,{isSmall:!0,isDestructive:!0,onClick:function(t){return function(e,t){t.stopPropagation(),c(e)}(e,t)},style:{minWidth:"auto"}},"Unlink"))))}),g&&React.createElement("div",{style:{textAlign:"center",padding:"16px"}},React.createElement(n.Spinner,null),React.createElement("span",{style:{marginLeft:"8px",color:"#666",fontSize:"12px"}},"Loading more...")),!R&&!g&&!x&&p.length>0&&React.createElement("div",{style:{textAlign:"center",padding:"12px",color:"#666",fontSize:"12px"}},"End of results")),React.createElement("div",{style:{marginTop:"16px",textAlign:"right"}},React.createElement(n.Button,{variant:"secondary",onClick:l},"Close"))):null},je=[{value:"external",label:"External Link",dashicon:"dashicons-external"},{value:"hotel",label:"Hotel/Lodging",dashicon:"dashicons-building"},{value:"info",label:"Information",dashicon:"dashicons-info"},{value:"calendar",label:"Calendar",dashicon:"dashicons-calendar-alt"},{value:"location",label:"Location",dashicon:"dashicons-location"},{value:"link",label:"Generic Link",dashicon:"dashicons-admin-links"}],Be=function(t){var a=t.isOpen,l=t.onClose,r=t.onAddLink,c=Ne((0,e.useState)(""),2),o=c[0],i=c[1],u=Ne((0,e.useState)(""),2),s=u[0],m=u[1],d=Ne((0,e.useState)("external"),2),p=d[0],E=d[1],f=Ne((0,e.useState)(""),2),R=f[0],v=f[1];(0,e.useEffect)(function(){a&&(i(""),m(""),E("external"),v(""))},[a]);var y=function(e){if(!e)return v("URL is required"),!1;try{return new URL(e),v(""),!0}catch(e){return v("Please enter a valid URL (e.g., https://example.com)"),!1}};return a?React.createElement(n.Modal,{title:"Add Custom Link",onRequestClose:l,style:{maxWidth:"500px",width:"100%"},className:"mayo-custom-link-modal"},React.createElement("div",{style:{marginBottom:"16px"}},React.createElement(n.TextControl,{label:"Link Title",value:s,onChange:m,placeholder:"e.g., Hotel Reservations",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement("div",{style:{marginBottom:"16px"}},React.createElement(n.TextControl,{label:"URL",value:o,onChange:function(e){i(e),R&&y(e)},placeholder:"https://example.com",type:"url",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),R&&React.createElement("p",{style:{color:"#dc3545",fontSize:"12px",marginTop:"4px",marginBottom:0}},R)),React.createElement("div",{style:{marginBottom:"24px"}},React.createElement("label",{style:{display:"block",marginBottom:"8px",fontWeight:500}},"Icon"),React.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px"}},je.map(function(e){return React.createElement("button",{key:e.value,type:"button",onClick:function(){return E(e.value)},style:{display:"flex",flexDirection:"column",alignItems:"center",padding:"12px 16px",border:"2px solid ".concat(p===e.value?"#0073aa":"#ddd"),borderRadius:"4px",backgroundColor:p===e.value?"#f0f7ff":"#fff",cursor:"pointer",minWidth:"80px",transition:"all 0.2s"}},React.createElement("span",{className:"dashicons ".concat(e.dashicon),style:{fontSize:"24px",width:"24px",height:"24px",color:p===e.value?"#0073aa":"#666",marginBottom:"4px"}}),React.createElement("span",{style:{fontSize:"11px",color:p===e.value?"#0073aa":"#666"}},e.label))}))),React.createElement("div",{style:{display:"flex",justifyContent:"flex-end",gap:"8px"}},React.createElement(n.Button,{variant:"secondary",onClick:l},"Cancel"),React.createElement(n.Button,{variant:"primary",onClick:function(){y(o)&&s.trim()&&(r({type:"custom",id:Date.now(),url:o.trim(),title:s.trim(),icon:p}),l())},disabled:!s.trim()||!o.trim()},"Add Link"))):null};const Me=function(){var t=Ne((0,e.useState)(!1),2),a=t[0],l=t[1],r=Ne((0,e.useState)(!1),2),c=r[0],o=r[1],i=Ne((0,e.useState)(!1),2),u=i[0],m=i[1],d=Ne((0,e.useState)(null),2),p=d[0],E=d[1],f=Ne((0,e.useState)([]),2),R=f[0],v=f[1],y=Ne((0,e.useState)(!1),2),g=y[0],h=y[1],b=Ne((0,e.useState)(!1),2),_=b[0],S=b[1],w=Ne((0,e.useState)(null),2),x=w[0],k=w[1],C=ee().serviceBodies,T=(0,ae.useSelect)(function(e){return e("core/editor").getCurrentPostType()}),A=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("status")}),N=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("meta")||{}}),P=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("categories")||[]}),O=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("tags")||[]}),D=(0,ae.useDispatch)("core/editor").editPost,j=N.service_body||"";(0,e.useEffect)(function(){if("mayo_announcement"===T){var e=function(){var e=Ae(xe().m(function e(){var t,n;return xe().w(function(e){for(;;)switch(e.p=e.n){case 0:return h(!0),e.p=1,e.n=2,s("/subscribers/count",{method:"POST",body:JSON.stringify({categories:P,tags:O,service_body:j})});case 2:t=e.v,E(t.count),v(t.subscribers||[]),e.n=4;break;case 3:e.p=3,n=e.v,console.error("Error fetching subscriber count:",n),E(null),v([]);case 4:h(!1);case 5:return e.a(2)}},e,null,[[1,3]])}));return function(){return e.apply(this,arguments)}}(),t=setTimeout(e,300);return function(){return clearTimeout(t)}}},[T,P,O,j]),(0,e.useEffect)(function(){if(!u&&"mayo_announcement"===T&&"auto-draft"===A){var e=new URLSearchParams(window.location.search).get("linked_event");if(e){var t=parseInt(e,10);if(!isNaN(t)&&t>0){var n=N.linked_event_refs||[];if(!n.some(function(e){return"local"===e.type&&e.id===t})){var a={type:"local",id:t};D({meta:Se(Se({},N),{},{linked_event_refs:[].concat(Ce(n),[a])})})}}m(!0)}}},[T,A,u,N.linked_event_refs]),(0,e.useEffect)(function(){if("mayo_announcement"===T){var e=function(){var e=Ae(xe().m(function e(){var t,n;return xe().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,s("/settings");case 1:t=e.v,k({service_bodies:t.subscription_service_bodies||[]}),e.n=3;break;case 2:e.p=2,n=e.v,console.error("Error fetching subscription settings:",n),k({service_bodies:[]});case 3:return e.a(2)}},e,null,[[0,2]])}));return function(){return e.apply(this,arguments)}}();e()}},[T]);var B="auto-draft"===A;if((0,e.useEffect)(function(){if(B&&!N.display_timezone){var e=ce();D({meta:Se(Se({},N),{},{display_timezone:e})})}},[B,N.display_timezone]),"mayo_announcement"!==T)return null;var M=function(){if(!x||0===x.service_bodies.length)return C;var e=x.service_bodies.map(function(e){return e.toString()});return C.filter(function(t){return e.includes(t.id.toString())})}(),L=function(e,t){D({meta:Se(Se({},N),{},we({},e,t))})},I=function(){return N.linked_event_refs&&Array.isArray(N.linked_event_refs)&&N.linked_event_refs.length>0?N.linked_event_refs:N.linked_events&&Array.isArray(N.linked_events)?N.linked_events.map(function(e){return{type:"local",id:e}}):[]},F=I(),z=function(e){return"local"===e.type?"local-".concat(e.id):"custom"===e.type?"custom-".concat(e.id):"external-".concat(e.source_id,"-").concat(e.id)},G=function(e){var t=I().filter(function(t){return"local"===t.type&&"local"===e.type?t.id!==e.id:"external"===t.type&&"external"===e.type?!(t.id===e.id&&t.source_id===e.source_id):"custom"!==t.type||"custom"!==e.type||t.id!==e.id});L("linked_event_refs",t)},U=Ne((0,e.useState)({}),2),W=U[0],H=U[1],Y=Ne((0,e.useState)(!1),2),q=Y[0],J=Y[1];return(0,e.useEffect)(function(){var e=function(){var e=Ae(xe().m(function e(){var t,n,a,l,r,c,o;return xe().w(function(e){for(;;)switch(e.p=e.n){case 0:if(t=F.filter(function(e){return"custom"!==e.type&&!W[z(e)]}),n={},F.filter(function(e){return"custom"===e.type}).forEach(function(e){var t=z(e);W[t]||(n[t]={title:e.title||"Custom Link",permalink:e.url||"#",icon:e.icon||"external",source:{type:"custom",id:"custom",name:"Custom Link"}})}),Object.keys(n).length>0&&H(function(e){return Se(Se({},e),n)}),0!==t.length){e.n=1;break}return e.a(2);case 1:J(!0),a={},l=be(t),e.p=2,c=xe().m(function e(){var t,n,l,c,o,i;return xe().w(function(e){for(;;)switch(e.p=e.n){case 0:if(t=r.value,n=z(t),e.p=1,"local"!==t.type){e.n=3;break}return e.n=2,s("/events/".concat(t.id));case 2:(l=e.v)&&!l.code?a[n]={title:l.title||"Unknown Event",start_date:l.start_date||"",permalink:l.permalink||"",edit_link:l.edit_link||"",source:{type:"local",id:"local",name:"Local"}}:a[n]={title:"Event #".concat(t.id),start_date:"",permalink:"",edit_link:"",unavailable:!0,source:{type:"local",id:"local",name:"Local"}},e.n=7;break;case 3:if("external"!==t.type){e.n=7;break}return e.p=4,e.n=5,s("/events/search-all?per_page=100");case 5:c=e.v,o=(c.events||[]).find(function(e){return"external"===e.source.type&&e.source.id===t.source_id&&e.id===t.id}),a[n]=o?{title:o.title||"Unknown Event",start_date:o.start_date||"",permalink:o.permalink||"",edit_link:"",source:o.source}:{title:"External Event #".concat(t.id),start_date:"",permalink:"",edit_link:"",unavailable:!0,source:{type:"external",id:t.source_id,name:t.source_id}},e.n=7;break;case 6:e.p=6,e.v,a[n]={title:"External Event #".concat(t.id),start_date:"",permalink:"",edit_link:"",unavailable:!0,source:{type:"external",id:t.source_id,name:t.source_id}};case 7:e.n=9;break;case 8:e.p=8,i=e.v,console.error("Error fetching event details:",i),a[n]={title:"local"===t.type?"Event #".concat(t.id):"External Event #".concat(t.id),start_date:"",permalink:"",edit_link:"",unavailable:!0,source:"local"===t.type?{type:"local",id:"local",name:"Local"}:{type:"external",id:t.source_id,name:t.source_id}};case 9:return e.a(2)}},e,null,[[4,6],[1,8]])}),l.s();case 3:if((r=l.n()).done){e.n=5;break}return e.d(he(c()),4);case 4:e.n=3;break;case 5:e.n=7;break;case 6:e.p=6,o=e.v,l.e(o);case 7:return e.p=7,l.f(),e.f(7);case 8:Object.keys(a).length>0&&H(function(e){return Se(Se({},e),a)}),J(!1);case 9:return e.a(2)}},e,null,[[2,6,7,8]])}));return function(){return e.apply(this,arguments)}}();F.length>0&&e()},[JSON.stringify(F)]),React.createElement(React.Fragment,null,React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-announcement-details",title:"Announcement Settings",className:"mayo-announcement-details"},React.createElement(n.PanelBody,{title:"Display Window",initialOpen:!0},React.createElement("p",{className:"components-base-control__help",style:{marginTop:0,marginBottom:"12px"}},"Control when this announcement is visible on the frontend."),React.createElement("div",{style:{border:"1px solid #e0e0e0",borderRadius:"4px",padding:"12px",marginBottom:"12px",backgroundColor:"#fafafa"}},React.createElement("div",{style:{marginBottom:"4px"}},React.createElement("strong",{style:{fontSize:"12px",color:"#1e1e1e"}},"Start")),React.createElement(n.TextControl,{label:"Date",type:"date",value:N.display_start_date||"",onChange:function(e){return L("display_start_date",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement("div",{style:{marginTop:"8px"}},React.createElement(n.TextControl,{label:"Time",type:"time",value:N.display_start_time||"",onChange:function(e){return L("display_start_time",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement("p",{className:"components-base-control__help",style:{marginTop:"8px",marginBottom:0}},"Leave empty to start showing immediately")),React.createElement("div",{style:{border:"1px solid #e0e0e0",borderRadius:"4px",padding:"12px",backgroundColor:"#fafafa"}},React.createElement("div",{style:{marginBottom:"4px"}},React.createElement("strong",{style:{fontSize:"12px",color:"#1e1e1e"}},"End")),React.createElement(n.TextControl,{label:"Date",type:"date",value:N.display_end_date||"",onChange:function(e){return L("display_end_date",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement("div",{style:{marginTop:"8px"}},React.createElement(n.TextControl,{label:"Time",type:"time",value:N.display_end_time||"",onChange:function(e){return L("display_end_time",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement("p",{className:"components-base-control__help",style:{marginTop:"8px",marginBottom:0}},"Leave empty to show indefinitely")),React.createElement("div",{style:{marginTop:"12px"}},React.createElement(n.SelectControl,{label:"Timezone",value:N.display_timezone||"",options:[{label:"-- No timezone set --",value:""}].concat(Ce(re())),onChange:function(e){return L("display_timezone",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}))),React.createElement(n.PanelBody,{title:"Priority",initialOpen:!0},React.createElement(n.SelectControl,{label:"Priority Level",value:N.priority||"normal",options:[{label:"Low",value:"low"},{label:"Normal",value:"normal"},{label:"High",value:"high"},{label:"Urgent",value:"urgent"}],onChange:function(e){return L("priority",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement("p",{className:"components-base-control__help"},"Priority affects display order and styling.",React.createElement("span",{style:{display:"inline-block",marginLeft:"8px",color:{low:"#6c757d",normal:"#0073aa",high:"#ff9800",urgent:"#dc3545"}[N.priority||"normal"],fontWeight:600}},(N.priority||"normal").charAt(0).toUpperCase()+(N.priority||"normal").slice(1)))),React.createElement(n.PanelBody,{title:"Service Body",initialOpen:!0},React.createElement(n.SelectControl,{label:"Service Body",value:N.service_body||"",options:[{label:"Select a service body",value:""}].concat(Ce(!x||0===x.service_bodies.length||x.service_bodies.map(function(e){return e.toString()}).includes("0")?[{label:"Unaffiliated (0)",value:"0"}]:[]),Ce(M.map(function(e){return{label:"".concat(e.name," (").concat(e.id,")"),value:e.id}}))),onChange:function(e){return L("service_body",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),x&&x.service_bodies.length>0&&React.createElement("p",{className:"components-base-control__help",style:{marginTop:"8px"}},"Only service bodies enabled in"," ",React.createElement("a",{href:"/wp-admin/admin.php?page=mayo-settings",target:"_blank",rel:"noopener noreferrer"},"subscription settings")," ","are shown."))),React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-linked-events",title:"Links & Events",className:"mayo-linked-events"},React.createElement("p",{className:"components-base-control__help",style:{marginTop:0}},"Add custom links or link to events. Custom links appear first."),q&&F.length>0&&React.createElement("div",{style:{textAlign:"center",padding:"16px"}},React.createElement(n.Spinner,null),React.createElement("p",{style:{margin:"8px 0 0",color:"#666",fontSize:"12px"}},"Loading details...")),!q&&F.length>0&&React.createElement("div",{className:"mayo-linked-events-list",style:{marginBottom:"16px"}},F.map(function(e,t){var a,l,r,c,o=z(e),i=W[o]||{},u=i.title&&!i.title.startsWith("Event #")&&!i.title.startsWith("External Event #"),s="external"===e.type,m="custom"===e.type;return React.createElement("div",{key:o,style:{padding:"12px",backgroundColor:"#f9f9f9",borderRadius:"4px",marginBottom:"8px",borderLeft:"3px solid ".concat(m?"#9c27b0":s?"#ff9800":"#0073aa")}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"}},React.createElement("div",{style:{flex:1}},u||i.title||m?React.createElement(React.Fragment,null,React.createElement("div",{style:{display:"flex",alignItems:"center",marginBottom:"4px"}},m&&React.createElement("span",{className:"dashicons ".concat((r=e.icon||i.icon||"external",c=je.find(function(e){return e.value===r}),c?c.dashicon:"dashicons-external")),style:{fontSize:"16px",width:"16px",height:"16px",marginRight:"6px",color:"#9c27b0"}}),React.createElement("strong",null,i.title||e.title||(s?"External Event #".concat(e.id):"Event #".concat(e.id)))),React.createElement("span",{style:{display:"inline-block",fontSize:"11px",backgroundColor:m?"#f3e5f5":s?"#fff3e0":"#e3f2fd",color:m?"#7b1fa2":s?"#e65100":"#1565c0",padding:"2px 6px",borderRadius:"3px",marginBottom:"4px"}},m?"Custom Link":s?(null===(a=i.source)||void 0===a?void 0:a.name)||(null===(l=i.source)||void 0===l?void 0:l.id):"Local Event"),i.start_date&&React.createElement("div",{style:{color:"#666",fontSize:"12px",marginBottom:"8px"}},React.createElement("span",{className:"dashicons dashicons-calendar-alt",style:{fontSize:"14px",marginRight:"4px",verticalAlign:"middle"}}),function(e){if(!e)return"";try{var t=Ne(e.split("-").map(Number),3),n=t[0],a=t[1],l=t[2];return new Date(n,a-1,l).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}catch(t){return e}}(i.start_date)),React.createElement("div",{style:{display:"flex",gap:"8px",marginTop:"8px"}},(i.permalink||e.url)&&React.createElement("a",{href:i.permalink||e.url,target:"_blank",rel:"noopener noreferrer",style:{display:"inline-flex",alignItems:"center",padding:"4px 8px",fontSize:"11px",backgroundColor:"#f0f0f0",border:"1px solid #c3c4c7",borderRadius:"3px",textDecoration:"none",color:"#2271b1",whiteSpace:"nowrap"}},React.createElement("span",{className:"dashicons dashicons-external",style:{fontSize:"14px",marginRight:"4px",width:"14px",height:"14px"}}),m?"Open Link":s?"View on External Site":"View"),!s&&!m&&i.edit_link&&React.createElement("a",{href:i.edit_link,target:"_blank",rel:"noopener noreferrer",style:{display:"inline-flex",alignItems:"center",padding:"4px 8px",fontSize:"11px",backgroundColor:"#f0f0f0",border:"1px solid #c3c4c7",borderRadius:"3px",textDecoration:"none",color:"#2271b1",whiteSpace:"nowrap"}},React.createElement("span",{className:"dashicons dashicons-edit",style:{fontSize:"14px",marginRight:"4px",width:"14px",height:"14px"}}),"Edit"))):React.createElement("span",{style:{color:"#666"}},s?"External Event #".concat(e.id):"Event #".concat(e.id),React.createElement("span",{style:{fontSize:"12px",marginLeft:"8px"}},"(loading...)"))),React.createElement(n.Button,{isSmall:!0,isDestructive:!0,onClick:function(){return G(e)},style:{marginLeft:"12px"}},"Remove")))})),React.createElement("div",{style:{display:"flex",flexDirection:"column",gap:"8px"}},React.createElement(n.Button,{variant:"secondary",onClick:function(){return o(!0)},style:{justifyContent:"center"}},React.createElement("span",{className:"dashicons dashicons-admin-links",style:{marginRight:"4px"}}),"Add Custom Link"),React.createElement(n.Button,{variant:"secondary",onClick:function(){return l(!0)},style:{justifyContent:"center"}},React.createElement("span",{className:"dashicons dashicons-calendar-alt",style:{marginRight:"4px"}}),"Link Event")),React.createElement(Be,{isOpen:c,onClose:function(){return o(!1)},onAddLink:function(e){var t=I();L("linked_event_refs",[].concat(Ce(t),[e]))}}),React.createElement(De,{isOpen:a,onClose:function(){return l(!1)},onSelectEvent:function(e){!function(e){var t,n=I();t="local"===e.source.type?{type:"local",id:e.id}:{type:"external",id:e.id,source_id:e.source.id},n.some(function(e){return"local"===e.type&&"local"===t.type?e.id===t.id:"external"===e.type&&"external"===t.type&&e.id===t.id&&e.source_id===t.source_id})||L("linked_event_refs",[].concat(Ce(n),[t]))}(e)},onRemoveEvent:function(e){var t="local"===e.source.type?{type:"local",id:e.id}:{type:"external",id:e.id,source_id:e.source.id};G(t)},linkedEventRefs:F,getRefKey:z})),React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-email-recipients",title:"Email Recipients",className:"mayo-email-recipients"},React.createElement("div",{style:{display:"flex",alignItems:"center",gap:"8px",cursor:p>0?"pointer":"default"},onClick:function(){return p>0&&S(!0)}},g?React.createElement(n.Spinner,{style:{margin:0}}):React.createElement(React.Fragment,null,React.createElement("span",{className:"dashicons dashicons-email-alt",style:{color:"#2271b1",fontSize:"18px",width:"18px",height:"18px"}}),React.createElement("span",{style:{textDecoration:p>0?"underline":"none"}},React.createElement("strong",null,null!=p?p:0)," subscriber",1!==p?"s":""," will receive this announcement"))),React.createElement("p",{className:"components-base-control__help",style:{marginTop:"8px"}},"Based on selected categories, tags, and service body.",p>0&&" Click to view recipients."),_&&React.createElement(n.Modal,{title:"Email Recipients (".concat(R.length,")"),onRequestClose:function(){return S(!1)},style:{maxWidth:"600px",width:"100%"}},React.createElement("div",{style:{maxHeight:"400px",overflowY:"auto",border:"1px solid #ddd",borderRadius:"4px"}},R.length>0?R.map(function(e,t){var n,a;return React.createElement("div",{key:e.email,style:{padding:"12px",borderBottom:t<R.length-1?"1px solid #eee":"none"}},React.createElement("div",{style:{fontSize:"13px",fontWeight:500,marginBottom:"8px"}},e.email),React.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px"}},e.reason.all?React.createElement("span",{style:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#f0f0f0",color:"#666",borderRadius:"3px"}},"Receives all announcements"):React.createElement(React.Fragment,null,null===(n=e.reason.categories)||void 0===n?void 0:n.map(function(e){return React.createElement("span",{key:e,style:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#e3f2fd",color:"#1565c0",borderRadius:"3px"}},e)}),null===(a=e.reason.tags)||void 0===a?void 0:a.map(function(e){return React.createElement("span",{key:e,style:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#fff3e0",color:"#e65100",borderRadius:"3px"}},e)}),e.reason.service_body&&React.createElement("span",{style:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#e8f5e9",color:"#2e7d32",borderRadius:"3px"}},e.reason.service_body))))}):React.createElement("div",{style:{padding:"20px",textAlign:"center",color:"#666"}},"No matching subscribers")),React.createElement("div",{style:{marginTop:"16px",textAlign:"right"}},React.createElement(n.Button,{variant:"secondary",onClick:function(){return S(!1)}},"Close")))))};(0,U.getPlugins)().some(function(e){return"mayo-announcement-details"===e.name})||(0,U.registerPlugin)("mayo-announcement-details",{render:function(){return React.createElement(te,null,React.createElement(Me,null))},icon:"megaphone"}),document.addEventListener("DOMContentLoaded",function(){var n=document.getElementById("mayo-shortcode-root"),a=document.getElementById("mayo-settings-root"),l=document.getElementById("mayo-css-classes-root"),r=document.getElementById("mayo-api-docs-root"),c=document.getElementById("mayo-subscribers-root");n&&(0,e.render)(React.createElement(t,null),n),a&&(0,e.render)(React.createElement(x,null),a),l&&(0,e.render)(React.createElement(C,null),l),r&&(0,e.render)(React.createElement(T,null),r),c&&(0,e.render)(React.createElement(G,null),c)})})();
     2(()=>{"use strict";const e=wp.element,t=function(){return React.createElement("div",{className:"wrap mayo-docs"},React.createElement("h1",null,"Shortcodes"),React.createElement("div",{className:"card",style:{marginBottom:"20px"}},React.createElement("h2",null,"Table of Contents"),React.createElement("ul",{style:{listStyle:"disc",marginLeft:"20px",lineHeight:"2"}},React.createElement("li",null,React.createElement("a",{href:"#event-list"},"[mayo_event_list] - Event List Shortcode")),React.createElement("li",null,React.createElement("a",{href:"#event-form"},"[mayo_event_form] - Event Submission Form Shortcode")),React.createElement("li",null,React.createElement("a",{href:"#announcement"},"[mayo_announcement] - Announcement Shortcode")),React.createElement("li",null,React.createElement("a",{href:"#announcement-form"},"[mayo_announcement_form] - Announcement Submission Form Shortcode")),React.createElement("li",null,React.createElement("a",{href:"#subscribe"},"[mayo_subscribe] - Email Subscription Form Shortcode")))),React.createElement("div",{className:"card",id:"event-list"},React.createElement("h2",null,"Event List Shortcode"),React.createElement("p",null,"Use this shortcode to display a list of upcoming events:"),React.createElement("pre",null,React.createElement("code",null,"[mayo_event_list]")),React.createElement("h3",null,"Optional Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Description"),React.createElement("th",null,"Default"),React.createElement("th",null,"Options"),React.createElement("th",null,"Overridable via Querystring?"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,"infinite_scroll"),React.createElement("td",null,"Enable automatic loading of more events as user scrolls down the page"),React.createElement("td",null,"true"),React.createElement("td",null,"true, false"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"autoexpand"),React.createElement("td",null,"Automatically expand all events when the page loads"),React.createElement("td",null,"false"),React.createElement("td",null,"true, false"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"categories"),React.createElement("td",null,"Filter by category slugs (comma-separated). Prefix a slug with a minus sign (-) to exclude it."),React.createElement("td",null,"empty (all categories)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"meetings,workshops")," or ",React.createElement("pre",null,"-meetings,-workshops")," (exclude meetings and workshops)"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"category_relation"),React.createElement("td",null,"How to match multiple categories: AND (must have all) or OR (must have any)"),React.createElement("td",null,"OR"),React.createElement("td",null,"AND, OR"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"tags"),React.createElement("td",null,"Filter by tag slugs (comma-separated). Prefix a slug with a minus sign (-) to exclude it."),React.createElement("td",null,"empty (all tags)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"featured,ticketed")," (include only featured or ticketed), ",React.createElement("pre",null,"featured+ticketed")," (is an and condition), or ",React.createElement("pre",null,"-featured,-ticketed")," (exclude featured and ticketed). For more information see the Wordpress documentation on ",React.createElement("a",{target:"_blank",href:"https://developer.wordpress.org/reference/classes/wp_query/#tag-parameters"},"Tag Parameters"),"."),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"event_type"),React.createElement("td",null,"Filter by event type"),React.createElement("td",null,"empty (all types)"),React.createElement("td",null,"Service, Activity"),React.createElement("td",null,"Yes (only one event type at a time)")),React.createElement("tr",null,React.createElement("td",null,"time_format"),React.createElement("td",null,"Format for displaying time"),React.createElement("td",null,"12hour"),React.createElement("td",null,"12hour, 24hour"),React.createElement("td",null,"No")),React.createElement("tr",null,React.createElement("td",null,"per_page"),React.createElement("td",null,"Number of events to show per page"),React.createElement("td",null,"10"),React.createElement("td",null,"Any positive number"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"status"),React.createElement("td",null,"Shows events with a given status"),React.createElement("td",null,"publish"),React.createElement("td",null,"publish, pending"),React.createElement("td",null,"Yes (only one status at a time)")),React.createElement("tr",null,React.createElement("td",null,"service_body"),React.createElement("td",null,"Filter events by service body IDs (comma-separated)"),React.createElement("td",null,"empty (all service bodies)"),React.createElement("td",null,'e.g., "1,2,3" (shows events from any of the specified service bodies)'),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"source_ids"),React.createElement("td",null,"Filter events by source IDs (comma-separated)"),React.createElement("td",null,"empty (local events only)"),React.createElement("td",null,'e.g., "local,source_123,source_456"'),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"archive"),React.createElement("td",null,"Show only past events that have completely ended (excluding current and future events)"),React.createElement("td",null,"false"),React.createElement("td",null,"true, false"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"order"),React.createElement("td",null,"Sort order for events by start date and time"),React.createElement("td",null,"ASC"),React.createElement("td",null,"ASC (earliest first), DESC (latest first)"),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"timezone"),React.createElement("td",null,"Timezone to use for date filtering"),React.createElement("td",null,"Browser's timezone"),React.createElement("td",null,'Any valid IANA timezone (e.g., "America/New_York", "Europe/London")'),React.createElement("td",null,"Yes")),React.createElement("tr",null,React.createElement("td",null,"view"),React.createElement("td",null,"Default view mode for displaying events"),React.createElement("td",null,"list"),React.createElement("td",null,"list, calendar"),React.createElement("td",null,"Yes")))),React.createElement("h3",null,"Example with Parameters"),React.createElement("pre",null,React.createElement("code",null,'[mayo_event_list time_format="24hour" per_page="5" categories="meetings,workshops" tags="featured" event_type="Service" service_body="1,2,3" source_ids="local,source_123" archive="false" order="ASC" timezone="America/New_York" view="calendar"]')),React.createElement("h3",null,"Example with Category/Tag Exclusions"),React.createElement("pre",null,React.createElement("code",null,'[mayo_event_list categories="-announcements,-alerts" tags="-archived"]')),React.createElement("p",null,React.createElement("em",null,'Shows all events except those with the "announcements" or "alerts" categories, and excludes the "archived" tag.')),React.createElement("h3",null,"Example with Querystring Overrides"),React.createElement("pre",null,React.createElement("code",null,'https://example.com/events?status=pending&categories=meetings,workshops&event_type=Service&service_body="1,2,3"&source_ids=local,source_123&archive=true&order=DESC&timezone=America/New_York&infinite_scroll=false&per_page=20&view=calendar')),React.createElement("h3",null,"Notes"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Prefix category or tag slugs with a minus sign (-) to exclude them from the event list"),React.createElement("li",null,"You can mix inclusions and exclusions: ",React.createElement("code",null,'categories="meetings,-cancelled"')," shows meetings but not cancelled ones"),React.createElement("li",null,"The ",React.createElement("code",null,"view")," parameter allows you to display events in either a list or calendar format. Users can toggle between views using the buttons in the header."),React.createElement("li",null,"Local events are always included by default unless specifically excluded"),React.createElement("li",null,"To include only local events, use ",React.createElement("code",null,'source_ids="local"')),React.createElement("li",null,"To exclude local events, specify only external source IDs (e.g., ",React.createElement("code",null,'source_ids="source_123,source_456"'),")"),React.createElement("li",null,"To include all events (local and external), leave source_ids empty"),React.createElement("li",null,"When ",React.createElement("code",null,'archive="true"'),", only past events that have completely ended will be shown (excludes current and future events)"),React.createElement("li",null,"When ",React.createElement("code",null,'archive="false"')," (default), only upcoming and ongoing events will be shown"),React.createElement("li",null,"Use ",React.createElement("code",null,'order="DESC"')," with ",React.createElement("code",null,'archive="true"')," to show most recent past events first"),React.createElement("li",null,"Use ",React.createElement("code",null,'order="ASC"')," (default) to show events in chronological order (earliest first)"),React.createElement("li",null,"The ",React.createElement("code",null,"timezone")," parameter ensures date filtering is accurate across different time zones"),React.createElement("li",null,"Events are loaded using infinite scroll automatically as the user scrolls down the page"))),React.createElement("div",{className:"card",id:"event-form"},React.createElement("h2",null,"Event Submission Form Shortcode"),React.createElement("p",null,"The Event Submission Form Shortcode allows users to submit new events to your site. The form includes fields for event name, type, start date, end date, and more."),React.createElement("p",null,"When a new event is submitted, an email notification will be sent to the email addresses configured in the plugin settings. Multiple email addresses can be specified, separated by commas or semicolons."),React.createElement("h3",null,"Shortcode"),React.createElement("code",null,"[mayo_event_form]"),React.createElement("h3",null,"Default Required Fields"),React.createElement("p",null,"The following fields are always required and cannot be overridden:"),React.createElement("ul",null,React.createElement("li",null,"Event Name (event_name)"),React.createElement("li",null,"Event Type (event_type)"),React.createElement("li",null,"Service Body (service_body)"),React.createElement("li",null,"Email (email)"),React.createElement("li",null,"Start Date (event_start_date)"),React.createElement("li",null,"Start Time (event_start_time)"),React.createElement("li",null,"End Date (event_end_date)"),React.createElement("li",null,"End Time (event_end_time)"),React.createElement("li",null,"Timezone (timezone)")),React.createElement("h3",null,"Optional Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Description"),React.createElement("th",null,"Default"),React.createElement("th",null,"Available Fields"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,"additional_required_fields"),React.createElement("td",null,"Comma-separated list of additional fields that should be required"),React.createElement("td",null,"empty (no additional required fields)"),React.createElement("td",null,React.createElement("ul",null,React.createElement("li",null,"description"),React.createElement("li",null,"location_name"),React.createElement("li",null,"location_address"),React.createElement("li",null,"location_details"),React.createElement("li",null,"flyer")))),React.createElement("tr",null,React.createElement("td",null,"categories"),React.createElement("td",null,"Comma-separated list of category slugs that should be available in the form. Prefix a category with a minus sign (-) to exclude it."),React.createElement("td",null,"empty (all categories)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"meetings,workshops")," to show only meetings and workshops, or ",React.createElement("pre",null,"-meetings,-workshops")," to show all categories except meetings and workshops")),React.createElement("tr",null,React.createElement("td",null,"tags"),React.createElement("td",null,"Comma-separated list of tag slugs that should be available in the form. Prefix a tag with a minus sign (-) to exclude it. Tag slugs are always compared in lowercase."),React.createElement("td",null,"empty (all tags)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"featured,ticketed")," to show only featured and ticketed tags, or ",React.createElement("pre",null,"-featured,-ticketed")," to show all tags except featured and ticketed")),React.createElement("tr",null,React.createElement("td",null,"default_service_bodies"),React.createElement("td",null,"Comma-separated list of service body IDs to restrict the form to specific service bodies. Perfect for multi-site setups where each site should only allow events for specific service bodies."),React.createElement("td",null,"empty (all service bodies)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"1,2,3")," to allow only service bodies 1, 2, and 3, or ",React.createElement("pre",null,"0")," for only Unaffiliated events. If only one service body is specified, the field will be hidden and auto-selected.")))),React.createElement("h3",null,"Examples"),React.createElement("h4",null,"Standard Form with Additional Requirements"),React.createElement("pre",null,React.createElement("code",null,'[mayo_event_form additional_required_fields="flyer,location_name,location_address" categories="meetings,workshops" tags="featured,-ticketed"]')),React.createElement("h4",null,"Multi-Site Configuration - Restrict to Specific Service Bodies"),React.createElement("pre",null,React.createElement("code",null,'[mayo_event_form default_service_bodies="1,2,5" categories="meetings"]')),React.createElement("p",null,React.createElement("em",null,"Perfect for multi-site setups where each subsite should only allow events for specific service bodies.")),React.createElement("h4",null,"Single Service Body (Auto-Hidden)"),React.createElement("pre",null,React.createElement("code",null,'[mayo_event_form default_service_bodies="3"]')),React.createElement("p",null,React.createElement("em",null,"When only one service body is specified, the service body field is hidden and automatically selected.")),React.createElement("h3",null,"Notes"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Default required fields are always enforced"),React.createElement("li",null,"Additional required fields will be marked with an asterisk (*)"),React.createElement("li",null,"Form validation will ensure all required fields are filled"))),React.createElement("div",{className:"card",id:"announcement"},React.createElement("h2",null,"Announcement Shortcode"),React.createElement("p",null,"Use this shortcode to display announcements as banners or modals. Announcements are managed separately from events and are useful for:"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Meeting closures or changes"),React.createElement("li",null,"Weather alerts"),React.createElement("li",null,"Breaking news or important updates"),React.createElement("li",null,"Promoting upcoming events (can be linked to events)"),React.createElement("li",null,"Post-event thank you messages")),React.createElement("pre",null,React.createElement("code",null,"[mayo_announcement]")),React.createElement("h3",null,"How It Works"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Announcements have their own display window (",React.createElement("code",null,"display_start_date")," and ",React.createElement("code",null,"display_end_date"),")"),React.createElement("li",null,"Can optionally be linked to one or more events"),React.createElement("li",null,"Priority levels (low/normal/high/urgent) affect display order and styling"),React.createElement("li",null,React.createElement("strong",null,"Banner mode:")," Shows a fixed bar at the top of the viewport with carousel navigation for multiple announcements"),React.createElement("li",null,React.createElement("strong",null,"Modal mode:")," Shows a centered popup with a list of all matching announcements"),React.createElement("li",null,"When dismissed, announcements stay hidden for 24 hours but can be re-opened via a bell icon in the bottom-right corner")),React.createElement("h3",null,"Optional Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Description"),React.createElement("th",null,"Default"),React.createElement("th",null,"Options"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,"mode"),React.createElement("td",null,"Display mode for announcements"),React.createElement("td",null,"banner"),React.createElement("td",null,"banner (sticky top bar), modal (popup)")),React.createElement("tr",null,React.createElement("td",null,"categories"),React.createElement("td",null,"Filter by category slugs (comma-separated)"),React.createElement("td",null,"empty (all categories)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"announcements,alerts"))),React.createElement("tr",null,React.createElement("td",null,"category_relation"),React.createElement("td",null,"How to match multiple categories: AND (must have all) or OR (must have any)"),React.createElement("td",null,"OR"),React.createElement("td",null,"AND, OR")),React.createElement("tr",null,React.createElement("td",null,"tags"),React.createElement("td",null,"Filter by tag slugs (comma-separated)"),React.createElement("td",null,"empty (all tags)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"urgent,featured")," (include only urgent or featured), ",React.createElement("pre",null,"urgent+featured")," (is an and condition), or ",React.createElement("pre",null,"-urgent,-featured")," (exclude urgent and featured)")),React.createElement("tr",null,React.createElement("td",null,"priority"),React.createElement("td",null,"Filter by priority level"),React.createElement("td",null,"empty (all priorities)"),React.createElement("td",null,"low, normal, high, urgent")),React.createElement("tr",null,React.createElement("td",null,"show_linked_events"),React.createElement("td",null,"Show linked event titles with the announcement"),React.createElement("td",null,"false"),React.createElement("td",null,"true, false")),React.createElement("tr",null,React.createElement("td",null,"time_format"),React.createElement("td",null,"Format for displaying time"),React.createElement("td",null,"12hour"),React.createElement("td",null,"12hour, 24hour")),React.createElement("tr",null,React.createElement("td",null,"background_color"),React.createElement("td",null,"Custom background color for the banner/modal header/bell icon"),React.createElement("td",null,"empty (uses CSS default)"),React.createElement("td",null,"Any hex color, e.g., ",React.createElement("pre",null,"#ff6600"))),React.createElement("tr",null,React.createElement("td",null,"text_color"),React.createElement("td",null,"Custom text color for the banner/modal header/bell icon"),React.createElement("td",null,"empty (uses CSS default)"),React.createElement("td",null,"Any hex color, e.g., ",React.createElement("pre",null,"#ffffff"))),React.createElement("tr",null,React.createElement("td",null,"orderby"),React.createElement("td",null,"Field to sort announcements by"),React.createElement("td",null,"date"),React.createElement("td",null,"date (display start date), title (alphabetical), created (post creation date)")),React.createElement("tr",null,React.createElement("td",null,"order"),React.createElement("td",null,"Sort direction"),React.createElement("td",null,"DESC for date/created, ASC for title"),React.createElement("td",null,"ASC (ascending), DESC (descending)")))),React.createElement("h3",null,"Examples"),React.createElement("h4",null,"Default Banner Mode"),React.createElement("pre",null,React.createElement("code",null,"[mayo_announcement]")),React.createElement("h4",null,"Modal Popup"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement mode="modal"]')),React.createElement("h4",null,"Filter by Category"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement categories="announcements,alerts"]')),React.createElement("h4",null,"Show Only Urgent Announcements"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement priority="urgent"]')),React.createElement("h4",null,"Show Linked Events"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement show_linked_events="true"]')),React.createElement("h4",null,"Combined Parameters"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement mode="banner" categories="announcements" tags="urgent" priority="high" time_format="24hour"]')),React.createElement("h4",null,"Custom Colors"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement background_color="#ff6600" text_color="#ffffff"]')),React.createElement("h4",null,"Red Alert Style"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement background_color="#dc3545" text_color="#fff" priority="urgent"]')),React.createElement("h4",null,"Sort by Title (Alphabetical)"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement orderby="title"]')),React.createElement("h4",null,"Sort by Created Date (Newest First)"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement orderby="created" order="DESC"]')),React.createElement("h3",null,"Widget Usage"),React.createElement("p",null,"For site-wide announcements without editing templates, use the ",React.createElement("strong",null,'"Mayo Event Announcements"')," widget:"),React.createElement("ol",null,React.createElement("li",null,"Go to ",React.createElement("strong",null,"Appearance → Widgets")),React.createElement("li",null,'Add the "Mayo Event Announcements" widget to any widget area (footer recommended for site-wide display)'),React.createElement("li",null,"Configure the display mode, categories, tags, priority, and time format")),React.createElement("h3",null,"Creating Announcements"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Go to ",React.createElement("strong",null,"Mayo → Announcements → Add New")),React.createElement("li",null,"Enter the announcement title and content"),React.createElement("li",null,"Set the ",React.createElement("strong",null,"Display Start Date")," to when you want the announcement to start showing"),React.createElement("li",null,"Set the ",React.createElement("strong",null,"Display End Date")," to when you want the announcement to stop showing"),React.createElement("li",null,"Choose a ",React.createElement("strong",null,"Priority Level")," (urgent announcements appear first)"),React.createElement("li",null,"Optionally ",React.createElement("strong",null,"link to events")," if this announcement relates to specific events")),React.createElement("h3",null,"Linking Events"),React.createElement("p",null,"Announcements can be linked to events in two ways:"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("strong",null,"From the Announcement editor:"),' Search and add events in the "Linked Events" panel'),React.createElement("li",null,React.createElement("strong",null,"From the Event editor:"),' Click "Create Announcement for This Event" in the "Linked Announcements" panel')),React.createElement("h3",null,"Notes"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Announcements have independent display windows from events"),React.createElement("li",null,"Use announcements to promote events before they start, or recap after they end"),React.createElement("li",null,"Priority levels: ",React.createElement("strong",null,"urgent")," (red), ",React.createElement("strong",null,"high")," (orange), ",React.createElement("strong",null,"normal")," (blue), ",React.createElement("strong",null,"low")," (gray)"),React.createElement("li",null,"Use categories or tags to control which announcements appear"),React.createElement("li",null,"Multiple announcements are shown as a carousel in banner mode, or as a list in modal mode"))),React.createElement("div",{className:"card",id:"announcement-form"},React.createElement("h2",null,"Announcement Submission Form Shortcode"),React.createElement("p",null,"The Announcement Submission Form Shortcode allows users to submit new announcements to your site. This works similarly to the event form but for announcements."),React.createElement("p",null,'When a new announcement is submitted, an email notification will be sent to the email addresses configured in the plugin settings. The announcement will have a "pending" status until approved by an administrator.'),React.createElement("h3",null,"Shortcode"),React.createElement("code",null,"[mayo_announcement_form]"),React.createElement("h3",null,"Default Required Fields"),React.createElement("p",null,"The following fields are always required:"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Announcement Title (title)"),React.createElement("li",null,"Description (description)"),React.createElement("li",null,"Service Body (service_body)"),React.createElement("li",null,"Point of Contact Name (contact_name)"),React.createElement("li",null,"Point of Contact Email (email)")),React.createElement("h3",null,"Optional Fields"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Start Date (start_date) - When the announcement should start displaying"),React.createElement("li",null,"Start Time (start_time) - Time of day the announcement should start"),React.createElement("li",null,"End Date (end_date) - When the announcement should stop displaying"),React.createElement("li",null,"End Time (end_time) - Time of day the announcement should end"),React.createElement("li",null,"Image/Flyer (flyer) - An image attachment for the announcement"),React.createElement("li",null,"Categories - Standard WordPress categories"),React.createElement("li",null,"Tags - Standard WordPress tags")),React.createElement("h3",null,"Optional Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Description"),React.createElement("th",null,"Default"),React.createElement("th",null,"Options"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,"additional_required_fields"),React.createElement("td",null,"Comma-separated list of additional fields that should be required"),React.createElement("td",null,"empty (no additional required fields)"),React.createElement("td",null,React.createElement("ul",null,React.createElement("li",null,"start_date"),React.createElement("li",null,"start_time"),React.createElement("li",null,"end_date"),React.createElement("li",null,"end_time"),React.createElement("li",null,"flyer")))),React.createElement("tr",null,React.createElement("td",null,"categories"),React.createElement("td",null,"Comma-separated list of category slugs that should be available in the form. Prefix a category with a minus sign (-) to exclude it."),React.createElement("td",null,"empty (uses subscription settings)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"announcements,alerts")," or ",React.createElement("pre",null,"-internal"))),React.createElement("tr",null,React.createElement("td",null,"tags"),React.createElement("td",null,"Comma-separated list of tag slugs that should be available in the form. Prefix a tag with a minus sign (-) to exclude it."),React.createElement("td",null,"empty (uses subscription settings)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"urgent,featured")," or ",React.createElement("pre",null,"-archived"))),React.createElement("tr",null,React.createElement("td",null,"default_service_bodies"),React.createElement("td",null,"Comma-separated list of service body IDs to restrict the form to specific service bodies."),React.createElement("td",null,"empty (uses subscription settings)"),React.createElement("td",null,"e.g., ",React.createElement("pre",null,"1,2,3")," or ",React.createElement("pre",null,"0")," for Unaffiliated. If only one is specified, the field is hidden and auto-selected.")),React.createElement("tr",null,React.createElement("td",null,"show_flyer"),React.createElement("td",null,"Show the image/flyer upload field"),React.createElement("td",null,"false"),React.createElement("td",null,"true, false")))),React.createElement("h3",null,"Examples"),React.createElement("h4",null,"Basic Form"),React.createElement("pre",null,React.createElement("code",null,"[mayo_announcement_form]")),React.createElement("h4",null,"With Flyer Upload"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form show_flyer="true"]')),React.createElement("h4",null,"With Required Dates"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form additional_required_fields="start_date,end_date"]')),React.createElement("h4",null,"Restricted to Specific Service Bodies"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form default_service_bodies="1,2,5"]')),React.createElement("h4",null,"Single Service Body (Auto-Hidden)"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form default_service_bodies="3"]')),React.createElement("p",null,React.createElement("em",null,"When only one service body is specified, the field is hidden and automatically selected.")),React.createElement("h4",null,"Filter Categories and Tags"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form categories="announcements,alerts" tags="urgent,featured"]')),React.createElement("h4",null,"Full Configuration"),React.createElement("pre",null,React.createElement("code",null,'[mayo_announcement_form show_flyer="true" additional_required_fields="start_date,end_date,flyer" default_service_bodies="1,2" categories="announcements"]')),React.createElement("h3",null,"Notes"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Categories, tags, and service bodies are filtered by subscription settings configured in ",React.createElement("strong",null,"Mayo → Settings → Subscription Preferences")),React.createElement("li",null,"Shortcode parameters further restrict the available options (intersection of both)"),React.createElement("li",null,"Contact name and email are private fields used for admin communication only"),React.createElement("li",null,'Submitted announcements are set to "pending" status and require admin approval'),React.createElement("li",null,"Admin receives email notification when new announcements are submitted"),React.createElement("li",null,"Start/end dates correspond to the announcement's display window"))),React.createElement("div",{className:"card",id:"subscribe"},React.createElement("h2",null,"Email Subscription Form Shortcode"),React.createElement("p",null,"Use this shortcode to display an email subscription form. Users can subscribe to receive announcement notifications via email:"),React.createElement("pre",null,React.createElement("code",null,"[mayo_subscribe]")),React.createElement("h3",null,"How It Works"),React.createElement("ol",{style:{marginLeft:"20px",lineHeight:"1.8"}},React.createElement("li",null,React.createElement("strong",null,"User enters email:")," A simple form with an email input field"),React.createElement("li",null,React.createElement("strong",null,"Confirmation email sent:")," User receives an email with a confirmation link (double opt-in)"),React.createElement("li",null,React.createElement("strong",null,"User confirms:")," Clicking the link activates their subscription"),React.createElement("li",null,React.createElement("strong",null,"Receive announcements:")," When announcements are published, subscribers get an email with the full content"),React.createElement("li",null,React.createElement("strong",null,"Easy unsubscribe:")," Each email includes a one-click unsubscribe link")),React.createElement("h3",null,"Features"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("strong",null,"Double opt-in:")," Confirmation email ensures valid addresses and prevents spam"),React.createElement("li",null,React.createElement("strong",null,"Full content delivery:")," Announcement emails include the complete content plus a link to view on site"),React.createElement("li",null,React.createElement("strong",null,"Token-based security:")," Unsubscribe links use cryptographically secure tokens (no login required)"),React.createElement("li",null,React.createElement("strong",null,"Spam folder reminder:")," Users are reminded to check spam/junk folders for the confirmation email"),React.createElement("li",null,React.createElement("strong",null,"Re-subscription support:")," Previously unsubscribed users can re-subscribe")),React.createElement("h3",null,"Example"),React.createElement("pre",null,React.createElement("code",null,"[mayo_subscribe]")),React.createElement("h3",null,"Email Flow"),React.createElement("h4",null,"Confirmation Email"),React.createElement("p",null,"Sent immediately when a user subscribes:"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,'Subject: "Please confirm your subscription to [Site Name] announcements"'),React.createElement("li",null,"Contains a unique confirmation link"),React.createElement("li",null,"Includes note about checking spam folder")),React.createElement("h4",null,"Announcement Email"),React.createElement("p",null,"Sent to all confirmed subscribers when an announcement is published:"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,'Subject: "[Site Name] [Announcement Title]"'),React.createElement("li",null,"Full announcement content in plain text"),React.createElement("li",null,"Link to view on site"),React.createElement("li",null,"One-click unsubscribe link")),React.createElement("h3",null,"Notes"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,"Emails are sent using WordPress's ",React.createElement("code",null,"wp_mail()")," function"),React.createElement("li",null,'The "From" address uses your WordPress email settings'),React.createElement("li",null,"Subscribers are stored in a custom database table (",React.createElement("code",null,"wp_mayo_subscribers"),")"),React.createElement("li",null,"Emails are only sent when announcements are first published (not on updates)"),React.createElement("li",null,"The preferences column is reserved for future filtering options"))))},n=wp.components;function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function l(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",c=n.toStringTag||"@@toStringTag";function o(n,a,l,c){var o=a&&a.prototype instanceof s?a:s,u=Object.create(o.prototype);return r(u,"_invoke",function(n,a,l){var r,c,o,s=0,u=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,c=0,o=e,d.n=n,i}};function p(n,a){for(c=n,o=a,t=0;!m&&s&&!l&&t<u.length;t++){var l,r=u[t],p=d.p,E=r[2];n>3?(l=E===a)&&(o=r[(c=r[4])?5:(c=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(c=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,c=0))}if(l||n>1)return i;throw m=!0,a}return function(l,u,E){if(s>1)throw TypeError("Generator is already running");for(m&&1===u&&p(u,E),c=u,o=E;(t=c<2?e:o)||!m;){r||(c?c<3?(c>1&&(d.n=-1),p(c,o)):d.n=o:d.v=o);try{if(s=2,r){if(c||(l="next"),t=r[l]){if(!(t=t.call(r,o)))throw TypeError("iterator result is not an object");if(!t.done)return t;o=t.value,c<2&&(c=0)}else 1===c&&(t=r.return)&&t.call(r),c<2&&(o=TypeError("The iterator does not provide a '"+l+"' method"),c=1);r=e}else if((t=(m=d.n<0)?o:n.call(a,d))!==i)break}catch(t){r=e,c=1,o=t}finally{s=1}}return{value:t,done:m}}}(n,l,c),!0),u}var i={};function s(){}function u(){}function m(){}t=Object.getPrototypeOf;var d=[][a]?t(t([][a]())):(r(t={},a,function(){return this}),t),p=m.prototype=s.prototype=Object.create(d);function E(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,m):(e.__proto__=m,r(e,c,"GeneratorFunction")),e.prototype=Object.create(p),e}return u.prototype=m,r(p,"constructor",m),r(m,"constructor",u),u.displayName="GeneratorFunction",r(m,c,"GeneratorFunction"),r(p),r(p,c,"Generator"),r(p,a,function(){return this}),r(p,"toString",function(){return"[object Generator]"}),(l=function(){return{w:o,m:E}})()}function r(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}r=function(e,t,n,a){function c(t,n){r(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(c("next",0),c("throw",1),c("return",2))},r(e,t,n,a)}function c(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?c(Object(n),!0).forEach(function(t){i(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):c(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function i(e,t,n){return(t=function(e){var t=function(e){if("object"!=a(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=a(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==a(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}var u=function(){var e,t=(e=l().m(function e(t){var n,a,r,c,i,s,u,m,d,p=arguments;return l().w(function(e){for(;;)switch(e.p=e.n){case 0:return r=p.length>1&&void 0!==p[1]?p[1]:{},(c=(null===(n=window.mayoApiSettings)||void 0===n?void 0:n.root)||(null===(a=window.wpApiSettings)||void 0===a?void 0:a.root)||"/wp-json/").endsWith("/")||(c+="/"),i="".concat(c,"event-manager/v1").concat(t),s="",window.mayoApiSettings&&window.mayoApiSettings.nonce?s=window.mayoApiSettings.nonce:window.wpApiSettings&&window.wpApiSettings.nonce&&(s=window.wpApiSettings.nonce),u=o(o({},{credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":s}}),r),e.p=1,e.n=2,fetch(i,u);case 2:if((m=e.v).ok){e.n=3;break}throw new Error("API error: ".concat(m.status," ").concat(m.statusText));case 3:return e.n=4,m.json();case 4:return e.a(2,e.v);case 5:throw e.p=5,d=e.v,console.error("API fetch error:",d),d;case 6:return e.a(2)}},e,null,[[1,5]])}),function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){s(r,a,l,c,o,"next",e)}function o(e){s(r,a,l,c,o,"throw",e)}c(void 0)})});return function(e){return t.apply(this,arguments)}}();function m(e){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m(e)}function d(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",l=n.toStringTag||"@@toStringTag";function r(n,a,l,r){var i=a&&a.prototype instanceof o?a:o,s=Object.create(i.prototype);return p(s,"_invoke",function(n,a,l){var r,o,i,s=0,u=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,o=0,i=e,d.n=n,c}};function p(n,a){for(o=n,i=a,t=0;!m&&s&&!l&&t<u.length;t++){var l,r=u[t],p=d.p,E=r[2];n>3?(l=E===a)&&(i=r[(o=r[4])?5:(o=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(o=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,o=0))}if(l||n>1)return c;throw m=!0,a}return function(l,u,E){if(s>1)throw TypeError("Generator is already running");for(m&&1===u&&p(u,E),o=u,i=E;(t=o<2?e:i)||!m;){r||(o?o<3?(o>1&&(d.n=-1),p(o,i)):d.n=i:d.v=i);try{if(s=2,r){if(o||(l="next"),t=r[l]){if(!(t=t.call(r,i)))throw TypeError("iterator result is not an object");if(!t.done)return t;i=t.value,o<2&&(o=0)}else 1===o&&(t=r.return)&&t.call(r),o<2&&(i=TypeError("The iterator does not provide a '"+l+"' method"),o=1);r=e}else if((t=(m=d.n<0)?i:n.call(a,d))!==c)break}catch(t){r=e,o=1,i=t}finally{s=1}}return{value:t,done:m}}}(n,l,r),!0),s}var c={};function o(){}function i(){}function s(){}t=Object.getPrototypeOf;var u=[][a]?t(t([][a]())):(p(t={},a,function(){return this}),t),m=s.prototype=o.prototype=Object.create(u);function E(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,s):(e.__proto__=s,p(e,l,"GeneratorFunction")),e.prototype=Object.create(m),e}return i.prototype=s,p(m,"constructor",s),p(s,"constructor",i),i.displayName="GeneratorFunction",p(s,l,"GeneratorFunction"),p(m),p(m,l,"Generator"),p(m,a,function(){return this}),p(m,"toString",function(){return"[object Generator]"}),(d=function(){return{w:r,m:E}})()}function p(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}p=function(e,t,n,a){function r(t,n){p(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},p(e,t,n,a)}function E(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}function f(e){return function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){E(r,a,l,c,o,"next",e)}function o(e){E(r,a,l,c,o,"throw",e)}c(void 0)})}}function R(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,s=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){s=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw l}}return o}}(e,t)||b(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function y(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?v(Object(n),!0).forEach(function(t){g(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):v(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function g(e,t,n){return(t=function(e){var t=function(e){if("object"!=m(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==m(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function h(e){return function(e){if(Array.isArray(e))return _(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||b(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function b(e,t){if(e){if("string"==typeof e)return _(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_(e,t):void 0}}function _(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var S=function(e){if(!e)return!1;try{return"https:"===new URL(e).protocol}catch(e){return!1}},w=function(e){return!e||e.split(/[,;]/).map(function(e){return e.trim()}).filter(function(e){return e}).every(function(e){return function(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}(e)})};const x=function(){var t=R((0,e.useState)({bmlt_root_server:"",notification_email:"",default_service_bodies:""}),2),a=t[0],l=t[1],r=R((0,e.useState)(!0),2),c=r[0],o=r[1],i=R((0,e.useState)(!1),2),s=i[0],m=i[1],p=R((0,e.useState)(null),2),E=p[0],v=p[1],b=R((0,e.useState)(null),2),_=b[0],x=b[1],k=R((0,e.useState)([]),2),C=k[0],T=k[1],A=R((0,e.useState)(null),2),N=A[0],P=A[1],O=R((0,e.useState)(null),2),D=O[0],j=O[1],B=R((0,e.useState)(!1),2),M=B[0],L=B[1],I=R((0,e.useState)({subscription_categories:[],subscription_tags:[],subscription_service_bodies:[],subscription_new_option_behavior:"auto_include"}),2),F=I[0],z=I[1],G=R((0,e.useState)([]),2),U=G[0],W=G[1],H=R((0,e.useState)([]),2),Y=H[0],q=H[1],J=R((0,e.useState)([]),2),$=J[0],K=J[1];(0,e.useEffect)(function(){var e=function(){var e=f(d().m(function e(){var t,n,a,r,c,i,s,m,p,E;return d().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,o(!0),v(null),e.n=1,u("/settings");case 1:return t=e.v,l({bmlt_root_server:t.bmlt_root_server||"",notification_email:t.notification_email||"",default_service_bodies:t.default_service_bodies||"",server_info:t.server_info||null}),T(Array.isArray(t.external_sources)?t.external_sources:[]),z({subscription_categories:t.subscription_categories||[],subscription_tags:t.subscription_tags||[],subscription_service_bodies:t.subscription_service_bodies||[],subscription_new_option_behavior:t.subscription_new_option_behavior||"opt_in"}),e.p=2,e.n=3,fetch("/wp-json/wp/v2/categories?per_page=100");case 3:if(!(n=e.v).ok){e.n=5;break}return e.n=4,n.json();case 4:a=e.v,W(a.map(function(e){return{id:e.id,name:e.name}}));case 5:e.n=7;break;case 6:e.p=6,m=e.v,console.error("Failed to load categories:",m);case 7:return e.p=7,e.n=8,fetch("/wp-json/wp/v2/tags?per_page=100");case 8:if(!(r=e.v).ok){e.n=10;break}return e.n=9,r.json();case 9:c=e.v,q(c.map(function(e){return{id:e.id,name:e.name}}));case 10:e.n=12;break;case 11:e.p=11,p=e.v,console.error("Failed to load tags:",p);case 12:if(!t.bmlt_root_server){e.n=18;break}return e.p=13,e.n=14,fetch(t.bmlt_root_server+"/client_interface/json/?switcher=GetServiceBodies");case 14:if(!(i=e.v).ok){e.n=16;break}return e.n=15,i.json();case 15:s=e.v,K(s.map(function(e){return{id:e.id,name:e.name,parent_id:e.parent_id||"0"}}));case 16:e.n=18;break;case 17:e.p=17,E=e.v,console.error("Failed to load service bodies:",E);case 18:e.n=20;break;case 19:e.p=19,e.v,v("Failed to load settings. Please refresh the page and try again.");case 20:return e.p=20,o(!1),e.f(20);case 21:return e.a(2)}},e,null,[[13,17],[7,11],[2,6],[0,19,20,21]])}));return function(){return e.apply(this,arguments)}}();e()},[]);var V=function(e,t){l(function(n){return y(y({},n),{},g({},e,t))})},Z=function(){var e=f(d().m(function e(){var t,n,l,r;return d().w(function(e){for(;;)switch(e.p=e.n){case 0:if(e.p=0,m(!0),v(null),S(D.url)){e.n=1;break}throw new Error("External source URL must use HTTPS protocol.");case 1:return t=y(y({},D),{},{event_type:D.event_type||""}),n=h(C),null!==N?n[N]=t:M&&n.push(t),e.n=2,u("/settings",{method:"POST",body:JSON.stringify(y(y({},a),{},{external_sources:n}))});case 2:l=e.v,T(l.settings.external_sources),j(null),P(null),L(!1),x("External source saved successfully!"),setTimeout(function(){return x(null)},3e3),e.n=4;break;case 3:e.p=3,r=e.v,v(r.message||"Failed to save external source.");case 4:return e.p=4,m(!1),e.f(4);case 5:return e.a(2)}},e,null,[[0,3,4,5]])}));return function(){return e.apply(this,arguments)}}(),Q=function(){var e=f(d().m(function e(t){var n;return d().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,navigator.clipboard.writeText(t);case 1:e.n=3;break;case 2:e.p=2,e.v,(n=document.createElement("textarea")).value=t,document.body.appendChild(n),n.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(n);case 3:return e.a(2)}},e,null,[[0,2]])}));return function(t){return e.apply(this,arguments)}}(),X=function(){var e=f(d().m(function e(t){var n;return d().w(function(e){for(;;)switch(e.p=e.n){case 0:if(confirm("Are you sure you want to delete this external source?")){e.n=1;break}return e.a(2);case 1:return e.p=1,m(!0),n=C.filter(function(e,n){return n!==t}),e.n=2,u("/settings",{method:"POST",body:JSON.stringify(y(y({},a),{},{external_sources:n}))});case 2:T(n),j(null),P(null),L(!1),x("External source deleted successfully!"),setTimeout(function(){return x(null)},3e3),e.n=4;break;case 3:e.p=3,e.v,v("Failed to delete external source.");case 4:return e.p=4,m(!1),e.f(4);case 5:return e.a(2)}},e,null,[[1,3,4,5]])}));return function(t){return e.apply(this,arguments)}}(),ee=function(e,t){z(function(n){var a=n[e]||[],l=a.includes(t);return y(y({},n),{},g({},e,l?a.filter(function(e){return e!==t}):[].concat(h(a),[t])))})},te=function(){var e=f(d().m(function e(){var t;return d().w(function(e){for(;;)switch(e.p=e.n){case 0:if(e.p=0,m(!0),v(null),S(a.bmlt_root_server)){e.n=1;break}throw new Error("BMLT Root Server URL must use HTTPS protocol.");case 1:if(!a.notification_email||w(a.notification_email)){e.n=2;break}throw new Error("Please enter valid email addresses for notifications. Multiple emails can be separated by commas or semicolons.");case 2:return e.n=3,u("/settings",{method:"POST",body:JSON.stringify({bmlt_root_server:a.bmlt_root_server,notification_email:a.notification_email,default_service_bodies:a.default_service_bodies,external_sources:C,subscription_categories:F.subscription_categories,subscription_tags:F.subscription_tags,subscription_service_bodies:F.subscription_service_bodies,subscription_new_option_behavior:F.subscription_new_option_behavior})});case 3:e.v,x("Settings saved successfully!"),setTimeout(function(){return x(null)},3e3),e.n=5;break;case 4:e.p=4,t=e.v,v(t.message||"Failed to save settings.");case 5:return e.p=5,m(!1),e.f(5);case 6:return e.a(2)}},e,null,[[0,4,5,6]])}));return function(){return e.apply(this,arguments)}}();return c?React.createElement("div",{className:"mayo-settings-loading"},React.createElement(n.Spinner,null)," Loading settings..."):React.createElement("div",{className:"mayo-settings-page"},React.createElement("h1",null,"Mayo Events Manager Settings"),React.createElement(n.Notice,{status:"warning",isDismissible:!1},React.createElement("p",null,React.createElement("strong",null,"Important:"),' This plugin requires Pretty Permalinks to be enabled for the REST API to function correctly. If you\'re experiencing 404 errors when accessing external source or settings  BMLT server, please ensure your WordPress site is using Pretty Permalinks (Settings → Permalinks) and not the "Plain" setting.')),a.server_info&&!a.server_info.curl_available&&React.createElement(n.Notice,{status:"warning",isDismissible:!1},React.createElement("p",null,React.createElement("strong",null,"Performance Warning:")," The PHP curl extension is not installed. External source requests will be significantly slower. Ask your hosting provider to install the php-curl extension for PHP ",a.server_info.php_version,".")),a.server_info&&a.server_info.curl_available&&React.createElement(n.Notice,{status:"success",isDismissible:!1},React.createElement("p",null,"PHP ",a.server_info.php_version," with curl ",a.server_info.curl_version," detected.")),E&&React.createElement(n.Notice,{status:"error",isDismissible:!0,onRemove:function(){return v(null)}},E),_&&React.createElement(n.Notice,{status:"success",isDismissible:!0,onRemove:function(){return x(null)}},_),React.createElement(n.Panel,null,React.createElement(n.PanelBody,{title:"BMLT Settings",initialOpen:!0},React.createElement(n.PanelRow,null,React.createElement(n.TextControl,{label:"BMLT Root Server URL",value:a.bmlt_root_server,onChange:function(e){return V("bmlt_root_server",e)},help:a.bmlt_root_server&&!S(a.bmlt_root_server)?"URL must start with 'https://'":"Enter the URL of your BMLT root server (e.g., https://bmlt.example.org/main_server)",className:a.bmlt_root_server&&!S(a.bmlt_root_server)?"mayo-invalid-url":"",__next40pxDefaultSize:!0})),React.createElement(n.PanelRow,null,React.createElement(n.TextControl,{label:"Notification Email",value:a.notification_email,onChange:function(e){return V("notification_email",e)},help:a.notification_email&&!w(a.notification_email)?"Please enter valid email addresses. Multiple emails can be separated by commas or semicolons.":"Email addresses to receive event submission notifications. Multiple emails can be separated by commas or semicolons. Leave empty to send to all admins.",className:a.notification_email&&!w(a.notification_email)?"mayo-invalid-email":"",__next40pxDefaultSize:!0}))),React.createElement(n.PanelBody,{title:"Service Body Configuration",initialOpen:!0},React.createElement(n.PanelRow,null,React.createElement(n.TextControl,{label:"Restricted Service Bodies",value:a.default_service_bodies,onChange:function(e){return V("default_service_bodies",e)},help:"Comma-separated list of service body IDs (e.g., 1,2,3). When specified, only these service bodies will be available for event submission. Leave empty to allow all service bodies. Use '0' for Unaffiliated. Perfect for multi-site setups where each site should only show specific service bodies.",placeholder:"e.g., 1,2,3,0",__next40pxDefaultSize:!0})),React.createElement(n.PanelRow,null,React.createElement(n.Button,{isPrimary:!0,onClick:te,isBusy:s,disabled:s||a.bmlt_root_server&&!S(a.bmlt_root_server)||a.notification_email&&!w(a.notification_email)},s?"Saving...":"Save Settings")))),React.createElement(n.Panel,null,React.createElement(n.PanelBody,{title:"External Event Sources",initialOpen:!0},React.createElement("div",{className:"mayo-external-sources-list"},C.map(function(e,t){return React.createElement("div",{key:e.id,className:"mayo-external-source-item"},React.createElement("div",{className:"mayo-external-source-info"},React.createElement("strong",null,e.name||e.url),React.createElement("div",{className:"mayo-external-source-details"},React.createElement("div",{className:"mayo-source-id-row"},React.createElement("code",{className:"mayo-source-id"},e.id),React.createElement("button",{className:"mayo-copy-id",onClick:function(){return Q(e.id)},title:"Copy ID"},"Copy ID to clipboard")),React.createElement("div",{className:"mayo-source-meta"},React.createElement("span",null,"Type: ",e.event_type||"All"),e.service_body&&React.createElement("span",null,"Service Body: ",e.service_body),React.createElement("span",{className:"mayo-source-status ".concat(e.enabled?"enabled":"disabled")},e.enabled?"Enabled":"Disabled")))),React.createElement("div",{className:"mayo-external-source-actions"},React.createElement(n.Button,{isSecondary:!0,onClick:function(){return function(e,t){j(e),P(t)}(e,t)}},"Edit"),React.createElement(n.Button,{isDestructive:!0,onClick:function(){return X(t)}},"Delete")))})),React.createElement("div",{className:"mayo-external-sources-actions"},React.createElement(n.Button,{isPrimary:!0,onClick:function(){j({id:"",name:"",url:"",event_type:"",service_body:"",categories:"",tags:"",enabled:!0}),L(!0)},className:"mayo-add-source-button",disabled:M||null!==N},"Add New External Source")),(M||null!==N)&&D&&React.createElement("div",{className:"mayo-external-source-form"},React.createElement(n.TextControl,{label:"Site URL",value:D.url,onChange:function(e){return j(y(y({},D),{},{url:e}))},help:"Enter the URL of the WordPress site (e.g., https://example.com)",__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Source Name",value:D.name,onChange:function(e){return j(y(y({},D),{},{name:e}))},help:"Enter a friendly name for this source (e.g., District 5 Website)",__next40pxDefaultSize:!0}),React.createElement(n.SelectControl,{label:"Event Type",value:D.event_type||"",options:[{label:"All Event Types",value:""},{label:"Activity",value:"Activity"},{label:"Service",value:"Service"}],onChange:function(e){j(y(y({},D),{},{event_type:e}))},help:"Select the event type",__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Service Body",value:D.service_body,onChange:function(e){return j(y(y({},D),{},{service_body:e}))},help:"Filter by service body (optional)",__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Categories",value:D.categories,onChange:function(e){return j(y(y({},D),{},{categories:e}))},help:"Filter by categories (comma-separated)",__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Tags",value:D.tags,onChange:function(e){return j(y(y({},D),{},{tags:e}))},help:"Filter by tags (comma-separated)",__next40pxDefaultSize:!0}),React.createElement(n.ToggleControl,{label:"Enable Source",checked:D.enabled,onChange:function(e){return j(y(y({},D),{},{enabled:e}))}}),React.createElement("div",{className:"mayo-form-actions"},React.createElement(n.Button,{isPrimary:!0,onClick:Z,isBusy:s},s?"Saving...":"Save Source"),React.createElement(n.Button,{isSecondary:!0,onClick:function(){j(null),P(null),L(!1)}},"Cancel"))))),React.createElement(n.Panel,null,React.createElement(n.PanelBody,{title:"Subscription Preferences",initialOpen:!0},React.createElement("p",{className:"mayo-settings-description"},"Configure which categories, tags, and service bodies are available for subscribers to choose from when signing up for announcement notifications."),U.length>0&&React.createElement("div",{className:"mayo-subscription-section"},React.createElement("h4",null,"Categories available for subscription:"),React.createElement("div",{className:"mayo-checkbox-list",style:{border:"1px solid #ddd",borderRadius:"4px",background:"#fff",padding:"12px 16px",maxHeight:"300px",overflowY:"auto"}},U.map(function(e){return React.createElement(n.CheckboxControl,{key:e.id,label:e.name,checked:F.subscription_categories.includes(e.id),onChange:function(){return ee("subscription_categories",e.id)}})}))),Y.length>0&&React.createElement("div",{className:"mayo-subscription-section"},React.createElement("h4",null,"Tags available for subscription:"),React.createElement("div",{className:"mayo-checkbox-list",style:{border:"1px solid #ddd",borderRadius:"4px",background:"#fff",padding:"12px 16px",maxHeight:"300px",overflowY:"auto"}},Y.map(function(e){return React.createElement(n.CheckboxControl,{key:e.id,label:e.name,checked:F.subscription_tags.includes(e.id),onChange:function(){return ee("subscription_tags",e.id)}})}))),$.length>0&&React.createElement("div",{className:"mayo-subscription-section"},React.createElement("h4",null,"Service Bodies available for subscription:"),React.createElement("div",{className:"mayo-service-body-tree"},function(e){var t=h(e).sort(function(e,t){return e.name.localeCompare(t.name)}),n={},a=[];t.forEach(function(e){n[e.id]=[]}),t.forEach(function(e){var t=String(e.parent_id);"0"!==t&&n[t]?n[t].push(e):a.push(e)});var l=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=[];return e.forEach(function(e){var r;a.push(y(y({},e),{},{depth:t})),(null===(r=n[e.id])||void 0===r?void 0:r.length)>0&&(a=a.concat(l(n[e.id],t+1)))}),a};return l(a)}($).map(function(e){return React.createElement("div",{key:e.id,className:"mayo-tree-item",style:{paddingLeft:"".concat(24*e.depth,"px")}},React.createElement(n.CheckboxControl,{label:"".concat(e.name," (").concat(e.id,")"),checked:F.subscription_service_bodies.includes(e.id),onChange:function(){return ee("subscription_service_bodies",e.id)}}))}))),React.createElement("div",{className:"mayo-subscription-section"},React.createElement("h4",null,"When new options are added:"),React.createElement(n.RadioControl,{selected:F.subscription_new_option_behavior,options:[{label:"Auto-include: Automatically add to existing subscribers",value:"auto_include"},{label:"Opt-in: Existing subscribers must manually add new options",value:"opt_in"}],onChange:function(e){return function(e,t){z(function(e){return y(y({},e),{},g({},"subscription_new_option_behavior",t))})}(0,e)}})),React.createElement(n.PanelRow,null,React.createElement(n.Button,{isPrimary:!0,onClick:te,isBusy:s,disabled:s||a.bmlt_root_server&&!S(a.bmlt_root_server)||a.notification_email&&!w(a.notification_email)},s?"Saving...":"Save Settings")))))};function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}const C=function(){var t,n,a=(t=(0,e.useState)((new Date).toLocaleString()),n=1,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,s=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){s=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw l}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return k(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?k(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];return React.createElement("div",{className:"wrap mayo-docs"},React.createElement("h1",null,"CSS Classes Documentation"),React.createElement("div",{className:"card"},React.createElement("div",{className:"mayo-docs-header"},React.createElement("h2",null,"Dynamic CSS Classes"),React.createElement("div",{className:"mayo-docs-meta"},React.createElement("span",{className:"mayo-docs-last-updated"},"Last updated: ",a))),React.createElement("div",{className:"notice notice-warning"},React.createElement("p",null,React.createElement("strong",null,"Important:"),' This plugin does not include a built-in CSS editor. To style the event cards, you need to use another plugin like "Simple Custom CSS" or add CSS to your theme\'s stylesheet.')),React.createElement("p",null,"This documentation explains the dynamic CSS classes used in the Event Card and Calendar View components. These classes are generated based on event properties and can be used to style specific events."),React.createElement("div",{className:"mayo-tab-content"},React.createElement("h3",null,"Dynamic Classes"),React.createElement("p",null,"These classes are dynamically generated based on event properties:"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Class Pattern"),React.createElement("th",null,"Based On"),React.createElement("th",null,"Example"))),React.createElement("tbody",null,[{pattern:"mayo-event-category-{category-slug}",baseName:"mayo-event-category",description:"Class for event categories"},{pattern:"mayo-event-tag-{tag-slug}",baseName:"mayo-event-tag",description:"Class for event tags"},{pattern:"mayo-event-type-{event-type-slug}",baseName:"mayo-event-type",description:"Class for event types"},{pattern:"mayo-event-service-body-{service-body-slug}",baseName:"mayo-event-service-body",description:"Class for service bodies"}].map(function(e,t){var n="",a="";return e.baseName.includes("category")?(n="Event categories",a="mayo-event-category-meetings"):e.baseName.includes("tag")?(n="Event tags",a="mayo-event-tag-featured"):e.baseName.includes("type")?(n="Event type",a="mayo-event-type-service"):e.baseName.includes("service-body")&&(n="Service body",a="mayo-event-service-body-district-1"),React.createElement("tr",{key:t},React.createElement("td",null,React.createElement("code",null,e.pattern)),React.createElement("td",null,n),React.createElement("td",null,React.createElement("code",null,a)))}))),React.createElement("h4",null,"Special Characters Handling"),React.createElement("p",null,"Special characters and emojis in category, tag, event type, and service body names are converted to Unicode codes to ensure valid CSS class names:"),React.createElement("pre",null,React.createElement("code",null,'// Example: "Meeting 🎉" becomes "mayo-event-category-meeting-u127881"')),React.createElement("h4",null,"Small Variants"),React.createElement("p",null,"Categories and tags in the event brief section use small variants:"),React.createElement("ul",null,React.createElement("li",null,React.createElement("code",null,"mayo-event-category-small")),React.createElement("li",null,React.createElement("code",null,"mayo-event-tag-small"))),React.createElement("h4",null,"How to Add Custom CSS"),React.createElement("p",null,"To style the event cards, you need to add CSS to your theme or use a custom CSS plugin. Here are some recommended plugins:"),React.createElement("ul",null,React.createElement("li",null,React.createElement("a",{href:"https://wordpress.org/plugins/simple-custom-css/",target:"_blank",rel:"noopener noreferrer"},"Simple Custom CSS")),React.createElement("li",null,React.createElement("a",{href:"https://wordpress.org/plugins/custom-css-js/",target:"_blank",rel:"noopener noreferrer"},"Custom CSS and JS")),React.createElement("li",null,React.createElement("a",{href:"https://wordpress.org/plugins/advanced-custom-css/",target:"_blank",rel:"noopener noreferrer"},"Advanced Custom CSS"))),React.createElement("h4",null,"List View vs Calendar View Styling"),React.createElement("p",null,"The same dynamic classes are applied to both list view and calendar view events. This means your existing styles will automatically work in both views:"),React.createElement("pre",null,React.createElement("code",null,"\n/* This styles events in BOTH list and calendar views */\n.mayo-event-category-meetings {\n    border-left: 4px solid #4a90e2;\n}\n                    ")),React.createElement("p",null,"If you want ",React.createElement("strong",null,"different")," styling for each view, use the base element class as a prefix:"),React.createElement("ul",null,React.createElement("li",null,React.createElement("code",null,".mayo-event-card")," - List view event cards"),React.createElement("li",null,React.createElement("code",null,".mayo-calendar-event")," - Calendar view event pills")),React.createElement("pre",null,React.createElement("code",null,"\n/* List view only */\n.mayo-event-card.mayo-event-category-meetings {\n    border-left: 4px solid #4a90e2;\n}\n\n/* Calendar view only */\n.mayo-calendar-event.mayo-event-category-meetings {\n    background-color: #e3f2fd;\n    border-left: 3px solid #1976d2;\n}\n                    ")),React.createElement("h4",null,"Customization Example"),React.createElement("p",null,"Once you have a CSS editor, you can add rules like these:"),React.createElement("pre",null,React.createElement("code",null,'\n/* Style events with the "meetings" category (both views) */\n.mayo-event-category-meetings {\n    border-left: 4px solid #4a90e2;\n}\n\n/* Style events with the "workshops" category (both views) */\n.mayo-event-category-workshops {\n    border-left: 4px solid #e2844a;\n}\n\n/* Style service events (both views) */\n.mayo-event-type-service {\n    background-color: #f0f7ff;\n}\n\n/* Style events from a specific service body (both views) */\n.mayo-event-service-body-district-1 {\n    border-top: 2px solid #4a90e2;\n}\n\n/* Calendar view only: different background for activity events */\n.mayo-calendar-event.mayo-event-type-activity {\n    background-color: #fff3e0;\n}\n                    ')))))},T=function(){var e=window.location.origin;return React.createElement("div",{className:"wrap mayo-docs"},React.createElement("h1",null,"API Documentation"),React.createElement("div",{className:"card"},React.createElement("h2",null,"Overview"),React.createElement("p",null,"The Mayo Events Manager provides a REST API for programmatic access to events and announcements. All endpoints use the namespace ",React.createElement("code",null,"event-manager/v1"),"."),React.createElement("p",null,React.createElement("strong",null,"Base URL:")," ",React.createElement("code",null,e,"/wp-json/event-manager/v1"))),React.createElement("div",{className:"card"},React.createElement("h2",null,"Table of Contents"),React.createElement("h3",null,"Event Endpoints"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("a",{href:"#get-events"},"GET /events")," - List events with filtering"),React.createElement("li",null,React.createElement("a",{href:"#get-event-slug"},"GET /event/","{slug}")," - Get event by slug"),React.createElement("li",null,React.createElement("a",{href:"#get-event-id"},"GET /events/","{id}")," - Get event by ID"),React.createElement("li",null,React.createElement("a",{href:"#search-events"},"GET /events/search")," - Search events"),React.createElement("li",null,React.createElement("a",{href:"#post-submit-event"},"POST /submit-event")," - Submit a new event")),React.createElement("h3",null,"Announcement Endpoints"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("a",{href:"#get-announcements"},"GET /announcements")," - List announcements"),React.createElement("li",null,React.createElement("a",{href:"#get-announcement-id"},"GET /announcement/","{id}")," - Get announcement by ID")),React.createElement("h3",null,"Settings Endpoints"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("a",{href:"#get-settings"},"GET /settings")," - Get plugin settings"),React.createElement("li",null,React.createElement("a",{href:"#post-settings"},"POST /settings")," - Update plugin settings")),React.createElement("h3",null,"Reference"),React.createElement("ul",{className:"ul-disc"},React.createElement("li",null,React.createElement("a",{href:"#event-meta-fields"},"Event Meta Fields")),React.createElement("li",null,React.createElement("a",{href:"#announcement-response"},"Announcement Response Object")),React.createElement("li",null,React.createElement("a",{href:"#wordpress-rest-api"},"WordPress REST API")),React.createElement("li",null,React.createElement("a",{href:"#usage-examples"},"Usage Examples")))),React.createElement("div",{className:"card",id:"get-events"},React.createElement("h2",null,"GET /events"),React.createElement("p",null,"Retrieve a list of events with optional filtering and pagination."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/events")),React.createElement("h3",null,"Query Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Default"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"page")),React.createElement("td",null,"integer"),React.createElement("td",null,"1"),React.createElement("td",null,"Page number for pagination")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"per_page")),React.createElement("td",null,"integer"),React.createElement("td",null,"10"),React.createElement("td",null,"Number of events per page")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"status")),React.createElement("td",null,"string"),React.createElement("td",null,"publish"),React.createElement("td",null,"Post status filter (",React.createElement("code",null,"publish"),", ",React.createElement("code",null,"pending"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_type")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Filter by event type (e.g., ",React.createElement("code",null,"Service"),", ",React.createElement("code",null,"Activity"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"service_body")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated service body IDs (e.g., ",React.createElement("code",null,"1,2,3"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"categories")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated category slugs. Prefix with ",React.createElement("code",null,"-")," to exclude (e.g., ",React.createElement("code",null,"meetings,-cancelled"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"tags")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated tag slugs. Prefix with ",React.createElement("code",null,"-")," to exclude")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"archive")),React.createElement("td",null,"boolean"),React.createElement("td",null,"false"),React.createElement("td",null,"When ",React.createElement("code",null,"true"),", returns only past events")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"order")),React.createElement("td",null,"string"),React.createElement("td",null,"ASC"),React.createElement("td",null,"Sort order: ",React.createElement("code",null,"ASC")," (earliest first) or ",React.createElement("code",null,"DESC")," (latest first)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"timezone")),React.createElement("td",null,"string"),React.createElement("td",null,"Server timezone"),React.createElement("td",null,"IANA timezone for date filtering (e.g., ",React.createElement("code",null,"America/New_York"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"start_date")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Filter events starting from this date (YYYY-MM-DD format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"end_date")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Filter events ending before this date (YYYY-MM-DD format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"source_ids")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated source IDs. Use ",React.createElement("code",null,"local")," for local events, or external source IDs")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"relation")),React.createElement("td",null,"string"),React.createElement("td",null,"AND"),React.createElement("td",null,"Relation between meta query conditions (",React.createElement("code",null,"AND")," or ",React.createElement("code",null,"OR"),")")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/events?per_page=5&categories=meetings&order=ASC"))),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "events": [\n        {\n            "id": 123,\n            "title": {\n                "rendered": "Monthly Meeting"\n            },\n            "content": {\n                "rendered": "<p>Event description...</p>"\n            },\n            "link": "'.concat(e,'/mayo/monthly-meeting/",\n            "meta": {\n                "event_start_date": "2024-03-15",\n                "event_end_date": "2024-03-15",\n                "event_start_time": "19:00:00",\n                "event_end_time": "21:00:00",\n                "timezone": "America/New_York",\n                "event_type": "Service",\n                "service_body": "1",\n                "location_name": "Community Center",\n                "location_address": "123 Main St",\n                "location_details": "Room 101"\n            },\n            "featured_image": "').concat(e,'/wp-content/uploads/2024/03/flyer.jpg",\n            "categories": [\n                {\n                    "id": 5,\n                    "name": "Meetings",\n                    "slug": "meetings",\n                    "link": "').concat(e,'/category/meetings/"\n                }\n            ],\n            "tags": [],\n            "source": {\n                "id": "local",\n                "name": "Local Events",\n                "url": "').concat(e,'"\n            }\n        }\n    ],\n    "pagination": {\n        "total": 25,\n        "per_page": 5,\n        "current_page": 1,\n        "total_pages": 5\n    }\n}')))),React.createElement("div",{className:"card",id:"get-event-slug"},React.createElement("h2",null,"GET /event/","{slug}"),React.createElement("p",null,"Retrieve details for a single event by its slug."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/event/","{slug}")),React.createElement("h3",null,"Path Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"slug")),React.createElement("td",null,"string"),React.createElement("td",null,"The event's URL slug")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/event/monthly-meeting"))),React.createElement("h3",null,"Response"),React.createElement("p",null,"Returns a single event object (same structure as events in the list response)."),React.createElement("h3",null,"Error Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "code": "no_event",\n    "message": "Event not found",\n    "data": {\n        "status": 404\n    }\n}'))),React.createElement("div",{className:"card",id:"get-event-id"},React.createElement("h2",null,"GET /events/","{id}"),React.createElement("p",null,"Retrieve a single event by its post ID."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/events/","{id}")),React.createElement("h3",null,"Path Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"id")),React.createElement("td",null,"integer"),React.createElement("td",null,"The event's post ID")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/events/123"))),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "id": 123,\n    "title": "Monthly Meeting",\n    "start_date": "2024-03-15",\n    "end_date": "2024-03-15",\n    "start_time": "19:00:00",\n    "end_time": "21:00:00",\n    "permalink": "'.concat(e,'/mayo/monthly-meeting/",\n    "edit_link": "').concat(e,'/wp-admin/post.php?post=123&action=edit"\n}'))),React.createElement("h3",null,"Error Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "code": "not_found",\n    "message": "Event not found",\n    "data": {\n        "status": 404\n    }\n}'))),React.createElement("div",{className:"card",id:"search-events"},React.createElement("h2",null,"GET /events/search"),React.createElement("p",null,"Search events by title. Useful for finding events to link to announcements."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/events/search")),React.createElement("h3",null,"Query Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Default"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"search")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Search term to match against event titles")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"limit")),React.createElement("td",null,"integer"),React.createElement("td",null,"20"),React.createElement("td",null,"Maximum number of results to return")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"include")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated event IDs to fetch specific events")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/events/search?search=meeting&limit=10"))),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "events": [\n        {\n            "id": 123,\n            "title": "Monthly Meeting",\n            "start_date": "2024-03-15",\n            "permalink": "'.concat(e,'/mayo/monthly-meeting/",\n            "edit_link": "').concat(e,'/wp-admin/post.php?post=123&action=edit"\n        },\n        {\n            "id": 456,\n            "title": "Regional Meeting",\n            "start_date": "2024-04-01",\n            "permalink": "').concat(e,'/mayo/regional-meeting/",\n            "edit_link": "').concat(e,'/wp-admin/post.php?post=456&action=edit"\n        }\n    ]\n}')))),React.createElement("div",{className:"card",id:"post-submit-event"},React.createElement("h2",null,"POST /submit-event"),React.createElement("p",null,"Submit a new event. Events are created with ",React.createElement("code",null,"pending")," status and require admin approval."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"POST ",e,"/wp-json/event-manager/v1/submit-event")),React.createElement("h3",null,"Authentication"),React.createElement("p",null,"This endpoint is publicly accessible (no authentication required)."),React.createElement("h3",null,"Request Body (multipart/form-data)"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Field"),React.createElement("th",null,"Type"),React.createElement("th",null,"Required"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_name")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Event title")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_type")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Event type (e.g., ",React.createElement("code",null,"Service"),", ",React.createElement("code",null,"Activity"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"service_body")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Service body ID (use ",React.createElement("code",null,"0")," for Unaffiliated)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"email")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Contact email address")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"contact_name")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Contact person's name")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_start_date")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Start date (YYYY-MM-DD format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_end_date")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"End date (YYYY-MM-DD format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_start_time")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"Start time (HH:MM:SS format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_end_time")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"End time (HH:MM:SS format)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"timezone")),React.createElement("td",null,"string"),React.createElement("td",null,"Yes"),React.createElement("td",null,"IANA timezone (e.g., ",React.createElement("code",null,"America/New_York"),")")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"description")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Event description (HTML allowed)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_name")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Venue name")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_address")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Street address")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_details")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Additional location info (room number, etc.)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"categories")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Comma-separated category IDs")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"tags")),React.createElement("td",null,"string"),React.createElement("td",null,"No"),React.createElement("td",null,"Comma-separated tag names or IDs")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"recurring_pattern")),React.createElement("td",null,"JSON string"),React.createElement("td",null,"No"),React.createElement("td",null,"Recurring event configuration (see below)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"flyer")),React.createElement("td",null,"file"),React.createElement("td",null,"No"),React.createElement("td",null,"Event flyer image (set as featured image)")))),React.createElement("h3",null,"Recurring Pattern Object"),React.createElement("pre",null,React.createElement("code",null,'{\n    "type": "weekly",           // "none", "daily", "weekly", "monthly"\n    "interval": 1,              // Repeat every N days/weeks/months\n    "weekdays": [1, 3, 5],      // For weekly: days of week (0=Sun, 6=Sat)\n    "monthlyType": "date",      // For monthly: "date" or "weekday"\n    "monthlyDate": 15,          // For monthly by date: day of month\n    "monthlyWeekday": "2,4",    // For monthly by weekday: "week,day" (e.g., "2,4" = 2nd Thursday)\n    "endDate": "2024-12-31"     // When recurring pattern ends\n}')),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "id": 456,\n    "title": {\n        "rendered": "New Community Event"\n    },\n    "content": {\n        "rendered": "<p>Event description...</p>"\n    },\n    "link": "'.concat(e,'/mayo/new-community-event/",\n    "meta": {\n        "event_start_date": "2024-04-01",\n        "event_end_date": "2024-04-01",\n        "event_start_time": "14:00:00",\n        "event_end_time": "16:00:00",\n        "timezone": "America/Los_Angeles",\n        "event_type": "Activity",\n        "service_body": "5",\n        "location_name": "Park Pavilion",\n        "location_address": "456 Oak Ave",\n        "location_details": ""\n    },\n    "categories": [],\n    "tags": []\n}')))),React.createElement("div",{className:"card",id:"get-announcements"},React.createElement("h2",null,"GET /announcements"),React.createElement("p",null,"Retrieve a list of announcements with optional filtering. By default, only returns announcements within their active display window."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/announcements")),React.createElement("h3",null,"Query Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Default"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"priority")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Filter by priority level: ",React.createElement("code",null,"low"),", ",React.createElement("code",null,"normal"),", ",React.createElement("code",null,"high"),", ",React.createElement("code",null,"urgent"))),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"categories")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated category slugs")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"tags")),React.createElement("td",null,"string"),React.createElement("td",null,"empty"),React.createElement("td",null,"Comma-separated tag slugs")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"linked_event")),React.createElement("td",null,"integer"),React.createElement("td",null,"empty"),React.createElement("td",null,"Filter by linked event ID")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"active")),React.createElement("td",null,"string"),React.createElement("td",null,"true"),React.createElement("td",null,"Set to ",React.createElement("code",null,"false")," to include announcements outside their display window")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/announcements?priority=urgent"))),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "announcements": [\n        {\n            "id": 789,\n            "title": "Weather Closure Notice",\n            "content": "<p>Due to severe weather...</p>",\n            "excerpt": "Due to severe weather...",\n            "link": "'.concat(e,'/announcement/weather-closure/",\n            "display_start_date": "2024-03-14",\n            "display_end_date": "2024-03-16",\n            "priority": "urgent",\n            "linked_events": [\n                {\n                    "id": 123,\n                    "title": "Monthly Meeting",\n                    "permalink": "').concat(e,'/mayo/monthly-meeting/",\n                    "start_date": "2024-03-15"\n                }\n            ],\n            "featured_image": null,\n            "categories": [],\n            "tags": []\n        }\n    ],\n    "total": 1\n}')))),React.createElement("div",{className:"card",id:"get-announcement-id"},React.createElement("h2",null,"GET /announcement/","{id}"),React.createElement("p",null,"Retrieve a single announcement by its post ID."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/announcement/","{id}")),React.createElement("h3",null,"Path Parameters"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Parameter"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"id")),React.createElement("td",null,"integer"),React.createElement("td",null,"The announcement's post ID")))),React.createElement("h3",null,"Example Request"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/event-manager/v1/announcement/789"))),React.createElement("h3",null,"Response"),React.createElement("p",null,"Returns a single announcement object (same structure as announcements in the list response)."),React.createElement("h3",null,"Error Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "code": "not_found",\n    "message": "Announcement not found",\n    "data": {\n        "status": 404\n    }\n}'))),React.createElement("div",{className:"card",id:"get-settings"},React.createElement("h2",null,"GET /settings"),React.createElement("p",null,"Retrieve plugin settings. This endpoint is publicly accessible for frontend configuration."),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"GET ",e,"/wp-json/event-manager/v1/settings")),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "bmlt_root_server": "https://bmlt.example.org/main_server",\n    "notification_email": "events@example.org",\n    "default_service_bodies": "1,2,3",\n    "external_sources": [\n        {\n            "id": "source_abc123",\n            "url": "https://other-site.org",\n            "name": "Other Site Events",\n            "event_type": "",\n            "service_body": "",\n            "categories": "",\n            "tags": "",\n            "enabled": true\n        }\n    ]\n}'))),React.createElement("div",{className:"card",id:"post-settings"},React.createElement("h2",null,"POST /settings"),React.createElement("p",null,"Update plugin settings. ",React.createElement("strong",null,"Requires administrator authentication.")),React.createElement("h3",null,"Endpoint"),React.createElement("pre",null,React.createElement("code",null,"POST ",e,"/wp-json/event-manager/v1/settings")),React.createElement("h3",null,"Authentication"),React.createElement("p",null,"Requires a logged-in user with ",React.createElement("code",null,"manage_options")," capability (administrator)."),React.createElement("p",null,"Include the WordPress REST API nonce in your request:"),React.createElement("pre",null,React.createElement("code",null,"// Using wp-api-fetch (recommended)\nimport apiFetch from '@wordpress/api-fetch';\napiFetch({ path: '/event-manager/v1/settings', method: 'POST', data: {...} });\n\n// Using fetch with nonce\nfetch('".concat(e,"/wp-json/event-manager/v1/settings', {\n    method: 'POST',\n    headers: {\n        'Content-Type': 'application/json',\n        'X-WP-Nonce': wpApiSettings.nonce\n    },\n    body: JSON.stringify({...})\n});"))),React.createElement("h3",null,"Request Body (JSON)"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Field"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"bmlt_root_server")),React.createElement("td",null,"string"),React.createElement("td",null,"BMLT root server URL")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"notification_email")),React.createElement("td",null,"string"),React.createElement("td",null,"Email address(es) for event submission notifications")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"default_service_bodies")),React.createElement("td",null,"string"),React.createElement("td",null,"Comma-separated service body IDs to restrict submissions")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"external_sources")),React.createElement("td",null,"array"),React.createElement("td",null,"Array of external source configurations")))),React.createElement("h3",null,"Example Response"),React.createElement("pre",null,React.createElement("code",null,'{\n    "success": true,\n    "settings": {\n        "bmlt_root_server": "https://bmlt.example.org/main_server",\n        "notification_email": "events@example.org",\n        "default_service_bodies": "1,2,3",\n        "external_sources": []\n    }\n}')),React.createElement("h3",null,"Error Response (Unauthorized)"),React.createElement("pre",null,React.createElement("code",null,'{\n    "code": "rest_forbidden",\n    "message": "Sorry, you are not allowed to update settings.",\n    "data": {\n        "status": 401\n    }\n}'))),React.createElement("div",{className:"card",id:"event-meta-fields"},React.createElement("h2",null,"Event Meta Fields"),React.createElement("p",null,"Events use the following meta fields, which are exposed via the WordPress REST API for the ",React.createElement("code",null,"mayo_event")," post type:"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Meta Key"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_type")),React.createElement("td",null,"string"),React.createElement("td",null,"Event type (Service, Activity, etc.)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"service_body")),React.createElement("td",null,"string"),React.createElement("td",null,"Service body ID")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_start_date")),React.createElement("td",null,"string"),React.createElement("td",null,"Start date (YYYY-MM-DD)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_end_date")),React.createElement("td",null,"string"),React.createElement("td",null,"End date (YYYY-MM-DD)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_start_time")),React.createElement("td",null,"string"),React.createElement("td",null,"Start time (HH:MM:SS)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"event_end_time")),React.createElement("td",null,"string"),React.createElement("td",null,"End time (HH:MM:SS)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"timezone")),React.createElement("td",null,"string"),React.createElement("td",null,"IANA timezone identifier")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_name")),React.createElement("td",null,"string"),React.createElement("td",null,"Venue name")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_address")),React.createElement("td",null,"string"),React.createElement("td",null,"Street address")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"location_details")),React.createElement("td",null,"string"),React.createElement("td",null,"Additional location information")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"contact_name")),React.createElement("td",null,"string"),React.createElement("td",null,"Contact person's name")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"email")),React.createElement("td",null,"string"),React.createElement("td",null,"Contact email address")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"recurring_pattern")),React.createElement("td",null,"object"),React.createElement("td",null,"Recurring event configuration")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"skipped_occurrences")),React.createElement("td",null,"array"),React.createElement("td",null,"Array of skipped dates for recurring events"))))),React.createElement("div",{className:"card",id:"announcement-response"},React.createElement("h2",null,"Announcement Response Object"),React.createElement("p",null,"Announcements returned from the API include the following fields:"),React.createElement("table",{className:"widefat"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",null,"Field"),React.createElement("th",null,"Type"),React.createElement("th",null,"Description"))),React.createElement("tbody",null,React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"id")),React.createElement("td",null,"integer"),React.createElement("td",null,"The announcement's post ID")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"title")),React.createElement("td",null,"string"),React.createElement("td",null,"Announcement title")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"content")),React.createElement("td",null,"string"),React.createElement("td",null,"Full announcement content (HTML)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"excerpt")),React.createElement("td",null,"string"),React.createElement("td",null,"Short excerpt of the announcement")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"link")),React.createElement("td",null,"string"),React.createElement("td",null,"Permalink to the announcement")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"edit_link")),React.createElement("td",null,"string"),React.createElement("td",null,"Admin edit URL for the announcement")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"display_start_date")),React.createElement("td",null,"string"),React.createElement("td",null,"When the announcement starts showing (YYYY-MM-DD)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"display_end_date")),React.createElement("td",null,"string"),React.createElement("td",null,"When the announcement stops showing (YYYY-MM-DD)")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"priority")),React.createElement("td",null,"string"),React.createElement("td",null,"Priority level: ",React.createElement("code",null,"low"),", ",React.createElement("code",null,"normal"),", ",React.createElement("code",null,"high"),", or ",React.createElement("code",null,"urgent"))),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"linked_events")),React.createElement("td",null,"array"),React.createElement("td",null,"Array of linked event objects with ",React.createElement("code",null,"id"),", ",React.createElement("code",null,"title"),", ",React.createElement("code",null,"permalink"),", ",React.createElement("code",null,"start_date"))),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"is_active")),React.createElement("td",null,"boolean"),React.createElement("td",null,"Whether the announcement is currently within its display window")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"featured_image")),React.createElement("td",null,"string|null"),React.createElement("td",null,"URL of the featured image, if set")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"categories")),React.createElement("td",null,"array"),React.createElement("td",null,"Array of category objects")),React.createElement("tr",null,React.createElement("td",null,React.createElement("code",null,"tags")),React.createElement("td",null,"array"),React.createElement("td",null,"Array of tag objects"))))),React.createElement("div",{className:"card",id:"wordpress-rest-api"},React.createElement("h2",null,"WordPress REST API"),React.createElement("p",null,"Events are also accessible via the standard WordPress REST API at ",React.createElement("code",null,"/wp-json/wp/v2/mayo_event"),"."),React.createElement("h3",null,"Example"),React.createElement("pre",null,React.createElement("code",null,"GET ".concat(e,"/wp-json/wp/v2/mayo_event?per_page=10&status=publish"))),React.createElement("p",null,"This provides access to all standard WordPress post fields plus the registered meta fields above.")),React.createElement("div",{className:"card",id:"usage-examples"},React.createElement("h2",null,"Usage Examples"),React.createElement("h3",null,"JavaScript (Fetch API)"),React.createElement("pre",null,React.createElement("code",null,"// Get upcoming events\nfetch('".concat(e,"/wp-json/event-manager/v1/events?per_page=10')\n    .then(response => response.json())\n    .then(data => {\n        console.log('Events:', data.events);\n        console.log('Total:', data.pagination.total);\n    });\n\n// Get events for a specific service body\nfetch('").concat(e,"/wp-json/event-manager/v1/events?service_body=1,2')\n    .then(response => response.json())\n    .then(data => console.log(data));\n\n// Get past events (archive)\nfetch('").concat(e,"/wp-json/event-manager/v1/events?archive=true&order=DESC')\n    .then(response => response.json())\n    .then(data => console.log(data));\n\n// Get active announcements\nfetch('").concat(e,"/wp-json/event-manager/v1/announcements')\n    .then(response => response.json())\n    .then(data => console.log(data.announcements));\n\n// Get urgent announcements only\nfetch('").concat(e,"/wp-json/event-manager/v1/announcements?priority=urgent')\n    .then(response => response.json())\n    .then(data => console.log(data));"))),React.createElement("h3",null,"PHP (WordPress)"),React.createElement("pre",null,React.createElement("code",null,"// Get events using wp_remote_get\n$response = wp_remote_get('".concat(e,"/wp-json/event-manager/v1/events?per_page=5');\n\nif (!is_wp_error($response)) {\n    $body = wp_remote_retrieve_body($response);\n    $data = json_decode($body, true);\n\n    foreach ($data['events'] as $event) {\n        echo $event['title']['rendered'] . '<br>';\n    }\n}"))),React.createElement("h3",null,"cURL"),React.createElement("pre",null,React.createElement("code",null,'# Get events\ncurl "'.concat(e,'/wp-json/event-manager/v1/events?per_page=5"\n\n# Get a single event\ncurl "').concat(e,'/wp-json/event-manager/v1/event/monthly-meeting"\n\n# Get settings\ncurl "').concat(e,'/wp-json/event-manager/v1/settings"\n\n# Get announcements\ncurl "').concat(e,'/wp-json/event-manager/v1/announcements"\n\n# Get announcements for a specific event (use linked_event filter)\ncurl "').concat(e,'/wp-json/event-manager/v1/announcements?linked_event=123"')))))};function A(e){return A="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},A(e)}function N(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",l=n.toStringTag||"@@toStringTag";function r(n,a,l,r){var i=a&&a.prototype instanceof o?a:o,s=Object.create(i.prototype);return P(s,"_invoke",function(n,a,l){var r,o,i,s=0,u=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,o=0,i=e,d.n=n,c}};function p(n,a){for(o=n,i=a,t=0;!m&&s&&!l&&t<u.length;t++){var l,r=u[t],p=d.p,E=r[2];n>3?(l=E===a)&&(i=r[(o=r[4])?5:(o=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(o=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,o=0))}if(l||n>1)return c;throw m=!0,a}return function(l,u,E){if(s>1)throw TypeError("Generator is already running");for(m&&1===u&&p(u,E),o=u,i=E;(t=o<2?e:i)||!m;){r||(o?o<3?(o>1&&(d.n=-1),p(o,i)):d.n=i:d.v=i);try{if(s=2,r){if(o||(l="next"),t=r[l]){if(!(t=t.call(r,i)))throw TypeError("iterator result is not an object");if(!t.done)return t;i=t.value,o<2&&(o=0)}else 1===o&&(t=r.return)&&t.call(r),o<2&&(i=TypeError("The iterator does not provide a '"+l+"' method"),o=1);r=e}else if((t=(m=d.n<0)?i:n.call(a,d))!==c)break}catch(t){r=e,o=1,i=t}finally{s=1}}return{value:t,done:m}}}(n,l,r),!0),s}var c={};function o(){}function i(){}function s(){}t=Object.getPrototypeOf;var u=[][a]?t(t([][a]())):(P(t={},a,function(){return this}),t),m=s.prototype=o.prototype=Object.create(u);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,s):(e.__proto__=s,P(e,l,"GeneratorFunction")),e.prototype=Object.create(m),e}return i.prototype=s,P(m,"constructor",s),P(s,"constructor",i),i.displayName="GeneratorFunction",P(s,l,"GeneratorFunction"),P(m),P(m,l,"Generator"),P(m,a,function(){return this}),P(m,"toString",function(){return"[object Generator]"}),(N=function(){return{w:r,m:d}})()}function P(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}P=function(e,t,n,a){function r(t,n){P(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},P(e,t,n,a)}function O(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}function D(e){return function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){O(r,a,l,c,o,"next",e)}function o(e){O(r,a,l,c,o,"throw",e)}c(void 0)})}}function j(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function B(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?j(Object(n),!0).forEach(function(t){M(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):j(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function M(e,t,n){return(t=function(e){var t=function(e){if("object"!=A(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=A(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==A(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function L(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,s=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){s=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw l}}return o}}(e,t)||I(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function I(e,t){if(e){if("string"==typeof e)return F(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?F(e,t):void 0}}function F(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var z=function(t){var a,l,r,c,o,i,s=t.subscriber,u=t.options,m=t.onSave,d=t.onClose,p=t.saving,E=L((0,e.useState)(s.status),2),f=E[0],R=E[1],v=L((0,e.useState)(function(){var e=s.preferences||{};return{categories:(e.categories||[]).map(function(e){return Number(e)}),tags:(e.tags||[]).map(function(e){return Number(e)}),service_bodies:(e.service_bodies||[]).map(function(e){return String(e)})}}),2),y=v[0],g=v[1],h=function(e,t,n){g(function(a){var l,r=a[e]||[];return B(B({},a),{},M({},e,n?[].concat(function(e){if(Array.isArray(e))return F(e)}(l=r)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(l)||I(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),[t]):r.filter(function(e){return e!==t})))})};return React.createElement(n.Modal,{title:"Edit Subscriber: ".concat(s.email),onRequestClose:d,className:"mayo-subscriber-edit-modal"},React.createElement("div",{style:{minWidth:"400px"}},React.createElement(n.SelectControl,{label:"Status",value:f,options:[{label:"Active",value:"active"},{label:"Pending",value:"pending"},{label:"Unsubscribed",value:"unsubscribed"}],onChange:R}),React.createElement("div",{style:{marginTop:"16px"}},React.createElement("h4",{style:{marginBottom:"8px"}},"Subscription Preferences"),React.createElement("p",{className:"description",style:{marginBottom:"12px"}},"Select which categories, tags, and service bodies this subscriber should receive notifications for. If none are selected, they will receive all announcements."),(null==u||null===(a=u.categories)||void 0===a?void 0:a.length)>0&&React.createElement("div",{style:{marginBottom:"16px"}},React.createElement("strong",{style:{display:"block",marginBottom:"8px"}},"Categories"),u.categories.map(function(e){return React.createElement(n.CheckboxControl,{key:e.id,label:e.name,checked:(t=e.id,y.categories.some(function(e){return Number(e)===Number(t)})),onChange:function(t){return h("categories",Number(e.id),t)}});var t})),(null==u||null===(l=u.tags)||void 0===l?void 0:l.length)>0&&React.createElement("div",{style:{marginBottom:"16px"}},React.createElement("strong",{style:{display:"block",marginBottom:"8px"}},"Tags"),u.tags.map(function(e){return React.createElement(n.CheckboxControl,{key:e.id,label:e.name,checked:(t=e.id,y.tags.some(function(e){return Number(e)===Number(t)})),onChange:function(t){return h("tags",Number(e.id),t)}});var t})),(null==u||null===(r=u.service_bodies)||void 0===r?void 0:r.length)>0&&React.createElement("div",{style:{marginBottom:"16px"}},React.createElement("strong",{style:{display:"block",marginBottom:"8px"}},"Service Bodies"),u.service_bodies.map(function(e){return React.createElement(n.CheckboxControl,{key:e.id,label:e.name,checked:(t=e.id,y.service_bodies.some(function(e){return String(e)===String(t)})),onChange:function(t){return h("service_bodies",String(e.id),t)}});var t})),!(null!=u&&null!==(c=u.categories)&&void 0!==c&&c.length)&&!(null!=u&&null!==(o=u.tags)&&void 0!==o&&o.length)&&!(null!=u&&null!==(i=u.service_bodies)&&void 0!==i&&i.length)&&React.createElement("p",{style:{color:"#646970",fontStyle:"italic"}},"No subscription options configured. Configure them in the Settings page.")),React.createElement("div",{style:{marginTop:"20px",display:"flex",gap:"8px",justifyContent:"flex-end"}},React.createElement(n.Button,{isSecondary:!0,onClick:d,disabled:p},"Cancel"),React.createElement(n.Button,{isPrimary:!0,onClick:function(){m(s.id,{status:f,preferences:y})},disabled:p},p?"Saving...":"Save Changes"))))};const G=function(){var t=L((0,e.useState)([]),2),a=t[0],l=t[1],r=L((0,e.useState)(!0),2),c=r[0],o=r[1],i=L((0,e.useState)(null),2),s=i[0],m=i[1],d=L((0,e.useState)("all"),2),p=d[0],E=d[1],f=L((0,e.useState)(""),2),R=f[0],v=f[1],y=L((0,e.useState)(null),2),g=y[0],h=y[1],b=L((0,e.useState)(null),2),_=b[0],S=b[1],w=L((0,e.useState)(!1),2),x=w[0],k=w[1];(0,e.useEffect)(function(){var e=function(){var e=D(N().m(function e(){var t,n,a,r,c;return N().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,Promise.all([u("/subscribers"),u("/subscription-options")]);case 1:t=e.v,n=L(t,2),a=n[0],r=n[1],l(a),S(r),e.n=3;break;case 2:e.p=2,c=e.v,m(c.message||"Failed to load subscribers");case 3:return e.p=3,o(!1),e.f(3);case 4:return e.a(2)}},e,null,[[0,2,3,4]])}));return function(){return e.apply(this,arguments)}}();e()},[]);var C=function(){var e=D(N().m(function e(t,n){var a,r;return N().w(function(e){for(;;)switch(e.p=e.n){case 0:return k(!0),e.p=1,e.n=2,u("/subscribers/".concat(t),{method:"PUT",body:JSON.stringify(n)});case 2:return e.n=3,u("/subscribers");case 3:a=e.v,l(a),h(null),e.n=5;break;case 4:e.p=4,r=e.v,alert("Failed to update subscriber: "+(r.message||"Unknown error"));case 5:return e.p=5,k(!1),e.f(5);case 6:return e.a(2)}},e,null,[[1,4,5,6]])}));return function(t,n){return e.apply(this,arguments)}}(),T=function(){var e=D(N().m(function e(t,n){var r;return N().w(function(e){for(;;)switch(e.p=e.n){case 0:if(t.preventDefault(),window.confirm('Are you sure you want to delete subscriber "'.concat(n.email,'"? This action cannot be undone.'))){e.n=1;break}return e.a(2);case 1:return e.p=1,e.n=2,u("/subscribers/".concat(n.id),{method:"DELETE"});case 2:l(a.filter(function(e){return e.id!==n.id})),e.n=4;break;case 3:e.p=3,r=e.v,alert("Failed to delete subscriber: "+(r.message||"Unknown error"));case 4:return e.a(2)}},e,null,[[1,3]])}));return function(t,n){return e.apply(this,arguments)}}(),A=(0,e.useMemo)(function(){return a.filter(function(e){return!("all"!==p&&e.status!==p||R&&!e.email.toLowerCase().includes(R.toLowerCase()))})},[a,p,R]),P=(0,e.useMemo)(function(){var e={all:a.length,active:0,pending:0,unsubscribed:0};return a.forEach(function(t){void 0!==e[t.status]&&e[t.status]++}),e},[a]),O=function(e){return e?new Date(e).toLocaleDateString("en-US",{year:"numeric",month:"2-digit",day:"2-digit"}):"—"},j={category:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#e3f2fd",color:"#1565c0",borderRadius:"3px",marginRight:"4px",marginBottom:"4px"},tag:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#fff3e0",color:"#e65100",borderRadius:"3px",marginRight:"4px",marginBottom:"4px"},serviceBody:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#e8f5e9",color:"#2e7d32",borderRadius:"3px",marginRight:"4px",marginBottom:"4px"},all:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#f0f0f0",color:"#666",borderRadius:"3px"}};return c?React.createElement("div",{className:"wrap"},React.createElement("h1",{className:"wp-heading-inline"},"Subscribers"),React.createElement("hr",{className:"wp-header-end"}),React.createElement("div",{style:{padding:"20px",textAlign:"center"}},React.createElement(n.Spinner,null))):s?React.createElement("div",{className:"wrap"},React.createElement("h1",{className:"wp-heading-inline"},"Subscribers"),React.createElement("hr",{className:"wp-header-end"}),React.createElement("div",{className:"notice notice-error"},React.createElement("p",null,s))):React.createElement("div",{className:"wrap"},React.createElement("h1",{className:"wp-heading-inline"},"Subscribers"),React.createElement("hr",{className:"wp-header-end"}),React.createElement("ul",{className:"subsubsub"},React.createElement("li",{className:"all"},React.createElement("a",{href:"#",className:"all"===p?"current":"",onClick:function(e){e.preventDefault(),E("all")}},"All ",React.createElement("span",{className:"count"},"(",P.all,")"))," |"),React.createElement("li",{className:"active"},React.createElement("a",{href:"#",className:"active"===p?"current":"",onClick:function(e){e.preventDefault(),E("active")}},"Active ",React.createElement("span",{className:"count"},"(",P.active,")"))," |"),React.createElement("li",{className:"pending"},React.createElement("a",{href:"#",className:"pending"===p?"current":"",onClick:function(e){e.preventDefault(),E("pending")}},"Pending ",React.createElement("span",{className:"count"},"(",P.pending,")"))," |"),React.createElement("li",{className:"unsubscribed"},React.createElement("a",{href:"#",className:"unsubscribed"===p?"current":"",onClick:function(e){e.preventDefault(),E("unsubscribed")}},"Unsubscribed ",React.createElement("span",{className:"count"},"(",P.unsubscribed,")")))),React.createElement("p",{className:"search-box"},React.createElement("label",{className:"screen-reader-text",htmlFor:"subscriber-search-input"},"Search Subscribers:"),React.createElement("input",{type:"search",id:"subscriber-search-input",value:R,onChange:function(e){return v(e.target.value)},placeholder:"Search by email..."})),React.createElement("div",{style:{clear:"both"}}),React.createElement("table",{className:"wp-list-table widefat fixed striped table-view-list"},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",{scope:"col",className:"manage-column column-email column-primary"},"Email"),React.createElement("th",{scope:"col",className:"manage-column column-status"},"Status"),React.createElement("th",{scope:"col",className:"manage-column column-date"},"Subscribed"),React.createElement("th",{scope:"col",className:"manage-column column-date"},"Confirmed"),React.createElement("th",{scope:"col",className:"manage-column column-preferences"},"Preferences"))),React.createElement("tbody",{id:"the-list"},0===A.length?React.createElement("tr",{className:"no-items"},React.createElement("td",{className:"colspanchange",colSpan:"5"},"No subscribers found.")):A.map(function(t){var n,a,l,r,c,o,i;return React.createElement(e.Fragment,{key:t.id},React.createElement("tr",null,React.createElement("td",{className:"email column-email column-primary","data-colname":"Email"},React.createElement("strong",null,t.email),React.createElement("div",{className:"row-actions visible",style:{visibility:"visible"}},React.createElement("span",{className:"edit"},React.createElement("button",{type:"button",className:"button button-small button-primary",onClick:function(){return h(t)},style:{marginRight:"4px"}},"Edit")),React.createElement("span",{className:"delete"},React.createElement("button",{type:"button",className:"button button-small button-link-delete",onClick:function(e){return T(e,t)},style:{color:"#b32d2e"}},"Delete")))),React.createElement("td",{className:"status column-status","data-colname":"Status"},React.createElement("span",{className:"mayo-subscriber-status mayo-status-".concat(t.status)},t.status.charAt(0).toUpperCase()+t.status.slice(1))),React.createElement("td",{className:"date column-date","data-colname":"Subscribed"},O(t.created_at)),React.createElement("td",{className:"date column-date","data-colname":"Confirmed"},O(t.confirmed_at)),React.createElement("td",{className:"preferences column-preferences","data-colname":"Preferences"},React.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"2px"}},((r=t.preferences)?((null===(c=r.categories)||void 0===c?void 0:c.length)||0)+((null===(o=r.tags)||void 0===o?void 0:o.length)||0)+((null===(i=r.service_bodies)||void 0===i?void 0:i.length)||0):0)>0?React.createElement(React.Fragment,null,null===(n=t.preferences.categories)||void 0===n?void 0:n.map(function(e,n){var a;return React.createElement("span",{key:"cat-".concat(e),style:j.category},(null===(a=t.preferences_display)||void 0===a||null===(a=a.categories)||void 0===a?void 0:a[n])||function(e){var t,n=null==_||null===(t=_.categories)||void 0===t?void 0:t.find(function(t){return String(t.id)===String(e)});return(null==n?void 0:n.name)||"Category ".concat(e)}(e))}),null===(a=t.preferences.tags)||void 0===a?void 0:a.map(function(e,n){var a;return React.createElement("span",{key:"tag-".concat(e),style:j.tag},(null===(a=t.preferences_display)||void 0===a||null===(a=a.tags)||void 0===a?void 0:a[n])||function(e){var t,n=null==_||null===(t=_.tags)||void 0===t?void 0:t.find(function(t){return String(t.id)===String(e)});return(null==n?void 0:n.name)||"Tag ".concat(e)}(e))}),null===(l=t.preferences.service_bodies)||void 0===l?void 0:l.map(function(e,n){var a;return React.createElement("span",{key:"sb-".concat(e),style:j.serviceBody},(null===(a=t.preferences_display)||void 0===a||null===(a=a.service_bodies)||void 0===a?void 0:a[n])||function(e){var t,n=null==_||null===(t=_.service_bodies)||void 0===t?void 0:t.find(function(t){return String(t.id)===String(e)});return(null==n?void 0:n.name)||"Service Body ".concat(e)}(e))})):React.createElement("span",{style:j.all},"All announcements")))))})),React.createElement("tfoot",null,React.createElement("tr",null,React.createElement("th",{scope:"col",className:"manage-column column-email column-primary"},"Email"),React.createElement("th",{scope:"col",className:"manage-column column-status"},"Status"),React.createElement("th",{scope:"col",className:"manage-column column-date"},"Subscribed"),React.createElement("th",{scope:"col",className:"manage-column column-date"},"Confirmed"),React.createElement("th",{scope:"col",className:"manage-column column-preferences"},"Preferences")))),React.createElement("div",{className:"tablenav bottom"},React.createElement("div",{className:"tablenav-pages one-page"},React.createElement("span",{className:"displaying-num"},A.length," item",1!==A.length?"s":""))),g&&React.createElement(z,{subscriber:g,options:_,onSave:C,onClose:function(){return h(null)},saving:x}))},U=wp.plugins,W=React;function H(e){return H="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},H(e)}function Y(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function q(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Y(Object(n),!0).forEach(function(t){J(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Y(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function J(e,t,n){return(t=function(e){var t=function(e){if("object"!=H(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=H(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==H(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function $(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",l=n.toStringTag||"@@toStringTag";function r(n,a,l,r){var i=a&&a.prototype instanceof o?a:o,s=Object.create(i.prototype);return K(s,"_invoke",function(n,a,l){var r,o,i,s=0,u=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,o=0,i=e,d.n=n,c}};function p(n,a){for(o=n,i=a,t=0;!m&&s&&!l&&t<u.length;t++){var l,r=u[t],p=d.p,E=r[2];n>3?(l=E===a)&&(i=r[(o=r[4])?5:(o=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(o=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,o=0))}if(l||n>1)return c;throw m=!0,a}return function(l,u,E){if(s>1)throw TypeError("Generator is already running");for(m&&1===u&&p(u,E),o=u,i=E;(t=o<2?e:i)||!m;){r||(o?o<3?(o>1&&(d.n=-1),p(o,i)):d.n=i:d.v=i);try{if(s=2,r){if(o||(l="next"),t=r[l]){if(!(t=t.call(r,i)))throw TypeError("iterator result is not an object");if(!t.done)return t;i=t.value,o<2&&(o=0)}else 1===o&&(t=r.return)&&t.call(r),o<2&&(i=TypeError("The iterator does not provide a '"+l+"' method"),o=1);r=e}else if((t=(m=d.n<0)?i:n.call(a,d))!==c)break}catch(t){r=e,o=1,i=t}finally{s=1}}return{value:t,done:m}}}(n,l,r),!0),s}var c={};function o(){}function i(){}function s(){}t=Object.getPrototypeOf;var u=[][a]?t(t([][a]())):(K(t={},a,function(){return this}),t),m=s.prototype=o.prototype=Object.create(u);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,s):(e.__proto__=s,K(e,l,"GeneratorFunction")),e.prototype=Object.create(m),e}return i.prototype=s,K(m,"constructor",s),K(s,"constructor",i),i.displayName="GeneratorFunction",K(s,l,"GeneratorFunction"),K(m),K(m,l,"Generator"),K(m,a,function(){return this}),K(m,"toString",function(){return"[object Generator]"}),($=function(){return{w:r,m:d}})()}function K(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}K=function(e,t,n,a){function r(t,n){K(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},K(e,t,n,a)}function V(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}function Z(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,s=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){s=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw l}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Q(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Q(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Q(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var X=(0,W.createContext)(),ee=function(){return(0,W.useContext)(X)},te=function(e){var t=e.children,n=Z((0,W.useState)([]),2),a=n[0],l=n[1],r=Z((0,W.useState)({}),2),c=r[0],o=r[1],i=Z((0,W.useState)(!0),2),s=i[0],m=i[1];return(0,W.useEffect)(function(){var e=function(){var e,t=(e=$().m(function e(){var t,n,a,r,c,o;return $().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,m(!0),e.n=1,u("/settings");case 1:if(t=e.v,n=t.bmlt_root_server){e.n=2;break}throw new Error("BMLT root server URL not set");case 2:return e.n=3,fetch("".concat(n,"/client_interface/json/?switcher=GetServiceBodies"));case 3:return a=e.v,e.n=4,a.json();case 4:r=e.v,c=r.sort(function(e,t){return e.name.localeCompare(t.name)}),l(c),e.n=6;break;case 5:e.p=5,o=e.v,console.error("Error fetching service bodies:",o),setError("Failed to load service bodies");case 6:return e.p=6,m(!1),e.f(6);case 7:return e.a(2)}},e,null,[[0,5,6,7]])}),function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){V(r,a,l,c,o,"next",e)}function o(e){V(r,a,l,c,o,"throw",e)}c(void 0)})});return function(){return t.apply(this,arguments)}}();e()},[]),React.createElement(X.Provider,{value:{serviceBodies:a,getServiceBodyName:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"local";if("local"===t){var n=a.find(function(t){return t.id===e});return(null==n?void 0:n.name)||"Out of Area"}if(c[t]){var l=c[t].find(function(t){return t.id===e});return(null==l?void 0:l.name)||"Out of Area"}return"Out of Area"},updateExternalServiceBodies:function(e,t){t&&Array.isArray(t)&&0!==t.length&&o(function(n){return q(q({},n),{},J({},e,t))})}}},s?React.createElement("div",null,"Loading..."):t)};const ne=wp.editor,ae=wp.data;wp.i18n;var le=[{label:"Eastern Time (US/Canada)",value:"America/New_York",region:"North America"},{label:"Central Time (US/Canada)",value:"America/Chicago",region:"North America"},{label:"Mountain Time (US/Canada)",value:"America/Denver",region:"North America"},{label:"Pacific Time (US/Canada)",value:"America/Los_Angeles",region:"North America"},{label:"Alaska Time (US)",value:"America/Anchorage",region:"North America"},{label:"Hawaii Time (US)",value:"Pacific/Honolulu",region:"North America"},{label:"Atlantic Time (Canada)",value:"America/Halifax",region:"North America"},{label:"Newfoundland Time (Canada)",value:"America/St_Johns",region:"North America"},{label:"Mexico City Time",value:"America/Mexico_City",region:"North America"},{label:"London (GMT/BST)",value:"Europe/London",region:"Europe"},{label:"Paris (CET/CEST)",value:"Europe/Paris",region:"Europe"},{label:"Berlin (CET/CEST)",value:"Europe/Berlin",region:"Europe"},{label:"Rome (CET/CEST)",value:"Europe/Rome",region:"Europe"},{label:"Madrid (CET/CEST)",value:"Europe/Madrid",region:"Europe"},{label:"Amsterdam (CET/CEST)",value:"Europe/Amsterdam",region:"Europe"},{label:"Brussels (CET/CEST)",value:"Europe/Brussels",region:"Europe"},{label:"Zurich (CET/CEST)",value:"Europe/Zurich",region:"Europe"},{label:"Vienna (CET/CEST)",value:"Europe/Vienna",region:"Europe"},{label:"Stockholm (CET/CEST)",value:"Europe/Stockholm",region:"Europe"},{label:"Oslo (CET/CEST)",value:"Europe/Oslo",region:"Europe"},{label:"Copenhagen (CET/CEST)",value:"Europe/Copenhagen",region:"Europe"},{label:"Helsinki (EET/EEST)",value:"Europe/Helsinki",region:"Europe"},{label:"Athens (EET/EEST)",value:"Europe/Athens",region:"Europe"},{label:"Istanbul (TRT)",value:"Europe/Istanbul",region:"Europe"},{label:"Moscow (MSK)",value:"Europe/Moscow",region:"Europe"},{label:"Dublin (GMT/IST)",value:"Europe/Dublin",region:"Europe"},{label:"Lisbon (WET/WEST)",value:"Europe/Lisbon",region:"Europe"},{label:"Tokyo (JST)",value:"Asia/Tokyo",region:"Asia"},{label:"Shanghai (CST)",value:"Asia/Shanghai",region:"Asia"},{label:"Hong Kong (HKT)",value:"Asia/Hong_Kong",region:"Asia"},{label:"Singapore (SGT)",value:"Asia/Singapore",region:"Asia"},{label:"Seoul (KST)",value:"Asia/Seoul",region:"Asia"},{label:"Bangkok (ICT)",value:"Asia/Bangkok",region:"Asia"},{label:"Manila (PHT)",value:"Asia/Manila",region:"Asia"},{label:"Jakarta (WIB)",value:"Asia/Jakarta",region:"Asia"},{label:"Mumbai (IST)",value:"Asia/Kolkata",region:"Asia"},{label:"Dubai (GST)",value:"Asia/Dubai",region:"Asia"},{label:"Riyadh (AST)",value:"Asia/Riyadh",region:"Asia"},{label:"Tel Aviv (IST)",value:"Asia/Jerusalem",region:"Asia"},{label:"Dhaka (BST)",value:"Asia/Dhaka",region:"Asia"},{label:"Karachi (PKT)",value:"Asia/Karachi",region:"Asia"},{label:"Tashkent (UZT)",value:"Asia/Tashkent",region:"Asia"},{label:"Sydney (AEST/AEDT)",value:"Australia/Sydney",region:"Australia & Oceania"},{label:"Melbourne (AEST/AEDT)",value:"Australia/Melbourne",region:"Australia & Oceania"},{label:"Brisbane (AEST)",value:"Australia/Brisbane",region:"Australia & Oceania"},{label:"Perth (AWST)",value:"Australia/Perth",region:"Australia & Oceania"},{label:"Adelaide (ACST/ACDT)",value:"Australia/Adelaide",region:"Australia & Oceania"},{label:"Darwin (ACST)",value:"Australia/Darwin",region:"Australia & Oceania"},{label:"Hobart (AEST/AEDT)",value:"Australia/Hobart",region:"Australia & Oceania"},{label:"Auckland (NZST/NZDT)",value:"Pacific/Auckland",region:"Australia & Oceania"},{label:"Wellington (NZST/NZDT)",value:"Pacific/Auckland",region:"Australia & Oceania"},{label:"Fiji (FJT)",value:"Pacific/Fiji",region:"Australia & Oceania"},{label:"Cairo (EET)",value:"Africa/Cairo",region:"Africa"},{label:"Cape Town (SAST)",value:"Africa/Johannesburg",region:"Africa"},{label:"Lagos (WAT)",value:"Africa/Lagos",region:"Africa"},{label:"Nairobi (EAT)",value:"Africa/Nairobi",region:"Africa"},{label:"Casablanca (WET)",value:"Africa/Casablanca",region:"Africa"},{label:"Tunis (CET)",value:"Africa/Tunis",region:"Africa"},{label:"São Paulo (BRT)",value:"America/Sao_Paulo",region:"South America"},{label:"Buenos Aires (ART)",value:"America/Argentina/Buenos_Aires",region:"South America"},{label:"Santiago (CLT)",value:"America/Santiago",region:"South America"},{label:"Lima (PET)",value:"America/Lima",region:"South America"},{label:"Bogotá (COT)",value:"America/Bogota",region:"South America"},{label:"Caracas (VET)",value:"America/Caracas",region:"South America"}],re=function(){return le.map(function(e){return{label:e.label,value:e.value}})},ce=function(){try{var e=Intl.DateTimeFormat().resolvedOptions().timeZone;return le.find(function(t){return t.value===e})?e:"America/New_York"}catch(e){return"America/New_York"}};function oe(e){return oe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},oe(e)}function ie(e){return function(e){if(Array.isArray(e))return ve(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||Re(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function se(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function ue(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?se(Object(n),!0).forEach(function(t){me(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):se(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function me(e,t,n){return(t=function(e){var t=function(e){if("object"!=oe(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=oe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==oe(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function de(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",l=n.toStringTag||"@@toStringTag";function r(n,a,l,r){var i=a&&a.prototype instanceof o?a:o,s=Object.create(i.prototype);return pe(s,"_invoke",function(n,a,l){var r,o,i,s=0,u=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,o=0,i=e,d.n=n,c}};function p(n,a){for(o=n,i=a,t=0;!m&&s&&!l&&t<u.length;t++){var l,r=u[t],p=d.p,E=r[2];n>3?(l=E===a)&&(i=r[(o=r[4])?5:(o=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(o=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,o=0))}if(l||n>1)return c;throw m=!0,a}return function(l,u,E){if(s>1)throw TypeError("Generator is already running");for(m&&1===u&&p(u,E),o=u,i=E;(t=o<2?e:i)||!m;){r||(o?o<3?(o>1&&(d.n=-1),p(o,i)):d.n=i:d.v=i);try{if(s=2,r){if(o||(l="next"),t=r[l]){if(!(t=t.call(r,i)))throw TypeError("iterator result is not an object");if(!t.done)return t;i=t.value,o<2&&(o=0)}else 1===o&&(t=r.return)&&t.call(r),o<2&&(i=TypeError("The iterator does not provide a '"+l+"' method"),o=1);r=e}else if((t=(m=d.n<0)?i:n.call(a,d))!==c)break}catch(t){r=e,o=1,i=t}finally{s=1}}return{value:t,done:m}}}(n,l,r),!0),s}var c={};function o(){}function i(){}function s(){}t=Object.getPrototypeOf;var u=[][a]?t(t([][a]())):(pe(t={},a,function(){return this}),t),m=s.prototype=o.prototype=Object.create(u);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,s):(e.__proto__=s,pe(e,l,"GeneratorFunction")),e.prototype=Object.create(m),e}return i.prototype=s,pe(m,"constructor",s),pe(s,"constructor",i),i.displayName="GeneratorFunction",pe(s,l,"GeneratorFunction"),pe(m),pe(m,l,"Generator"),pe(m,a,function(){return this}),pe(m,"toString",function(){return"[object Generator]"}),(de=function(){return{w:r,m:d}})()}function pe(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}pe=function(e,t,n,a){function r(t,n){pe(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},pe(e,t,n,a)}function Ee(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}function fe(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,s=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){s=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw l}}return o}}(e,t)||Re(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Re(e,t){if(e){if("string"==typeof e)return ve(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ve(e,t):void 0}}function ve(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}const ye=function(){var t,a,l=ee().serviceBodies,r=fe((0,e.useState)(!1),2),c=r[0],o=r[1],i=fe((0,e.useState)(""),2),s=i[0],m=i[1],d=fe((0,e.useState)([]),2),p=d[0],E=d[1],f=fe((0,e.useState)(!1),2),R=f[0],v=f[1],y=(0,ae.useSelect)(function(e){return e("core/editor").getCurrentPostType()}),g=(0,ae.useSelect)(function(e){return e("core/editor").getCurrentPostId()}),h=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("meta")||{}}),b=(0,ae.useDispatch)("core/editor").editPost,_=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("status")});if((0,e.useEffect)(function(){if("mayo_event"===y&&g&&"auto-draft"!==_){var e=function(){var e,t=(e=de().m(function e(){var t,n;return de().w(function(e){for(;;)switch(e.p=e.n){case 0:return v(!0),e.p=1,e.n=2,u("/announcements?linked_event=".concat(g));case 2:t=e.v,E(t.announcements||[]),e.n=4;break;case 3:e.p=3,n=e.v,console.error("Error fetching linked announcements:",n),E([]);case 4:v(!1);case 5:return e.a(2)}},e,null,[[1,3]])}),function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){Ee(r,a,l,c,o,"next",e)}function o(e){Ee(r,a,l,c,o,"throw",e)}c(void 0)})});return function(){return t.apply(this,arguments)}}();e()}},[y,g,_]),"mayo_event"!==y)return null;var S="auto-draft"===_,w=function(e,t){b({meta:ue(ue({},h),{},me({},e,t))})};(0,e.useEffect)(function(){if(S&&!h.timezone){var e=ce();w("timezone",e)}},[S,h.timezone]);var x=h.recurring_pattern||{type:"none",interval:1,weekdays:[],endDate:"",monthlyType:"date",monthlyDate:"",monthlyWeekday:""},k=function(e){var t=ue(ue(ue({},x),e),{},{weekdays:e.weekdays||x.weekdays||[]});w("recurring_pattern",t)},C=h.skipped_occurrences||[],T=[{value:0,label:"Sunday"},{value:1,label:"Monday"},{value:2,label:"Tuesday"},{value:3,label:"Wednesday"},{value:4,label:"Thursday"},{value:5,label:"Friday"},{value:6,label:"Saturday"}],A=function(){return h.event_start_date?new Date(h.event_start_date).getDate().toString():""},N=function(){if(h.event_start_date){var e=new Date(h.event_start_date),t=Math.ceil(e.getDate()/7);return"".concat(t,",").concat(e.getDay())}return""};return React.createElement(React.Fragment,null,React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-event-details",title:"Event Details",className:"mayo-event-details"},React.createElement(n.SelectControl,{label:"Event Type",value:h.event_type,options:[{label:"Select Event Type",value:""},{label:"Service",value:"Service"},{label:"Activity",value:"Activity"}],onChange:function(e){return w("event_type",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.PanelBody,{title:"Event Date & Time",initialOpen:!0},React.createElement("div",{className:"mayo-sidebar-datetime"},React.createElement("p",{className:"mayo-sidebar-label"},"Start Date/Time"),React.createElement("div",{className:"mayo-sidebar-datetime-inputs"},React.createElement(n.TextControl,{type:"date",value:h.event_start_date,onChange:function(e){return w("event_start_date",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{type:"time",value:h.event_start_time,onChange:function(e){return w("event_start_time",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement("p",{className:"mayo-sidebar-label"},"End Date/Time"),React.createElement("div",{className:"mayo-sidebar-datetime-inputs"},React.createElement(n.TextControl,{type:"date",value:h.event_end_date,onChange:function(e){return w("event_end_date",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{type:"time",value:h.event_end_time,onChange:function(e){return w("event_end_time",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}))),React.createElement(n.SelectControl,{label:"Timezone",value:h.timezone||"",options:[{label:"-- No timezone set --",value:""}].concat(ie(re())),onChange:function(e){return w("timezone",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement(n.PanelBody,{title:"Recurring Pattern",initialOpen:!0},React.createElement(n.SelectControl,{label:"Repeat",value:x.type,options:[{label:"No Recurrence",value:"none"},{label:"Daily",value:"daily"},{label:"Weekly",value:"weekly"},{label:"Monthly",value:"monthly"}],onChange:function(e){return k({type:e})},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),"none"!==x.type&&React.createElement(React.Fragment,null,React.createElement("div",{className:"mayo-recurring-interval"},React.createElement(n.__experimentalNumberControl,{label:"Repeat every",min:1,value:x.interval,onChange:function(e){return k({interval:e})}}),React.createElement("span",null,"daily"===x.type?"days":"weekly"===x.type?"weeks":"months")),"weekly"===x.type&&React.createElement("div",{className:"mayo-weekday-controls"},React.createElement("p",{className:"components-base-control__label"},"On these days"),T.map(function(e){return React.createElement(n.CheckboxControl,{key:e.value,label:e.label,checked:x.weekdays.includes(e.value),onChange:function(t){var n=t?[].concat(ie(x.weekdays),[e.value]):x.weekdays.filter(function(t){return t!==e.value});k({weekdays:n})}})})),React.createElement(n.TextControl,{label:"End Date (optional)",type:"date",value:x.endDate,onChange:function(e){return k({endDate:e})},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),"monthly"===x.type&&React.createElement("div",{className:"mayo-monthly-pattern"},React.createElement(n.RadioControl,{label:"Monthly Pattern",selected:x.monthlyType||"date",options:[{label:"On a specific date",value:"date"},{label:"On a specific day",value:"weekday"}],onChange:function(e){return k({monthlyType:e,monthlyDate:"date"===e?A():"",monthlyWeekday:"weekday"===e?N():""})}}),"date"===x.monthlyType&&React.createElement(n.__experimentalNumberControl,{label:"Day of month",value:x.monthlyDate||A(),onChange:function(e){return k({monthlyDate:e})},min:1,max:31}),"weekday"===x.monthlyType&&React.createElement("div",{className:"mayo-monthly-weekday"},React.createElement(n.SelectControl,{label:"Week",value:(null===(t=x.monthlyWeekday)||void 0===t?void 0:t.split(",")[0])||"1",options:[{value:"1",label:"First"},{value:"2",label:"Second"},{value:"3",label:"Third"},{value:"4",label:"Fourth"},{value:"5",label:"Fifth"},{value:"-1",label:"Last"}],onChange:function(e){var t,n=(null===(t=x.monthlyWeekday)||void 0===t?void 0:t.split(",")[1])||"0";k({monthlyWeekday:"".concat(e,",").concat(n)})},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.SelectControl,{label:"Day",value:(null===(a=x.monthlyWeekday)||void 0===a?void 0:a.split(",")[1])||"0",options:T,onChange:function(e){var t,n=(null===(t=x.monthlyWeekday)||void 0===t?void 0:t.split(",")[0])||"1";k({monthlyWeekday:"".concat(n,",").concat(e)})},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})))),"none"!==x.type&&React.createElement(n.PanelBody,{title:"Skipped Occurrences",initialOpen:!1},React.createElement("p",{className:"components-base-control__help"},"Manage specific dates when this recurring event should not occur."),C.length>0&&React.createElement("div",{className:"mayo-skipped-occurrences-list"},React.createElement("p",{className:"components-base-control__label"},"Skipped Dates:"),C.map(function(e,t){return React.createElement("div",{key:t,className:"mayo-skipped-occurrence-item"},React.createElement("span",null,(l=(a=fe(e.split("-").map(Number),3))[0],r=a[1],c=a[2],new Date(l,r-1,c).toLocaleDateString("en-US",{weekday:"long",year:"numeric",month:"long",day:"numeric"}))),React.createElement(n.Button,{isSmall:!0,isDestructive:!0,onClick:function(){return t=e,n=C.filter(function(e){return e!==t}),void w("skipped_occurrences",n);var t,n}},"Remove"));var a,l,r,c})),c?React.createElement("div",{className:"mayo-add-skip-form"},React.createElement(n.TextControl,{type:"date",label:"Date to skip",value:s,onChange:m,__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement("div",{className:"mayo-add-skip-actions"},React.createElement(n.Button,{isPrimary:!0,isSmall:!0,onClick:function(){if(s){var e=[].concat(ie(C),[s]);w("skipped_occurrences",e),m(""),o(!1)}},disabled:!s},"Add Skip"),React.createElement(n.Button,{isSecondary:!0,isSmall:!0,onClick:function(){o(!1),m("")}},"Cancel"))):React.createElement(n.Button,{isSecondary:!0,isSmall:!0,onClick:function(){return o(!0)}},"Add Skipped Date")),React.createElement(n.PanelBody,{title:"Service Body",initialOpen:!0},React.createElement(n.SelectControl,{label:"Service Body",value:h.service_body,options:[{label:"Select a service body",value:""},{label:"Unaffiliated (0)",value:"0"}].concat(ie(l.map(function(e){return{label:"".concat(e.name," (").concat(e.id,")"),value:e.id}}))),onChange:function(e){return w("service_body",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement(n.PanelBody,{title:"Location Details",initialOpen:!0},React.createElement(n.TextControl,{label:"Location Name",value:h.location_name,onChange:function(e){return w("location_name",e)},placeholder:"e.g., Community Center",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Address",value:h.location_address,onChange:function(e){return w("location_address",e)},placeholder:"Full address",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Location Details",value:h.location_details,onChange:function(e){return w("location_details",e)},placeholder:"Parking info, entrance details, etc.",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}))),React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-point-of-contact",title:"Point of Contact",className:"mayo-private-contact"},React.createElement(n.PanelBody,{title:"Contact Information (Private)",initialOpen:!0},React.createElement(n.TextControl,{label:"Contact Name",value:h.contact_name,onChange:function(e){return w("contact_name",e)},placeholder:"Full name of the contact person",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement(n.TextControl,{label:"Contact Email",value:h.email,onChange:function(e){return w("email",e)},placeholder:"Email address",type:"email",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}))),!S&&React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-linked-announcements",title:"Linked Announcements",className:"mayo-linked-announcements"},React.createElement("p",{className:"components-base-control__help",style:{marginTop:0}},"Announcements that reference this event."),R&&React.createElement("div",{style:{textAlign:"center",padding:"16px"}},React.createElement(n.Spinner,null)),!R&&0===p.length&&React.createElement("p",{style:{color:"#666",fontStyle:"italic"}},"No announcements linked to this event."),!R&&p.length>0&&React.createElement("div",{className:"mayo-linked-announcements-list"},p.map(function(e){var t=e.is_active?"#46b450":e.display_start_date&&e.display_start_date>(new Date).toISOString().split("T")[0]?"#0073aa":"#dc3545",n=e.is_active?"Active":e.display_start_date&&e.display_start_date>(new Date).toISOString().split("T")[0]?"Scheduled":"Expired";return React.createElement("div",{key:e.id,style:{padding:"10px 12px",backgroundColor:"#f9f9f9",borderRadius:"4px",marginBottom:"8px",borderLeft:"3px solid ".concat(t)}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"}},React.createElement("strong",null,e.title),React.createElement("span",{style:{fontSize:"11px",color:t,fontWeight:600}},n)),React.createElement("div",{style:{fontSize:"12px",color:"#666",marginTop:"4px"}},"Priority: ",React.createElement("span",{style:{color:"urgent"===e.priority?"#dc3545":"high"===e.priority?"#ff9800":"low"===e.priority?"#6c757d":"#0073aa",fontWeight:600}},e.priority)),React.createElement("div",{style:{display:"flex",gap:"8px",marginTop:"8px"}},e.edit_link&&React.createElement("a",{href:e.edit_link,target:"_blank",rel:"noopener noreferrer",style:{display:"inline-flex",alignItems:"center",padding:"4px 8px",fontSize:"11px",backgroundColor:"#f0f0f0",border:"1px solid #c3c4c7",borderRadius:"3px",textDecoration:"none",color:"#2271b1",whiteSpace:"nowrap"}},React.createElement("span",{className:"dashicons dashicons-edit",style:{fontSize:"14px",marginRight:"4px",width:"14px",height:"14px"}}),"Edit")))})),React.createElement("div",{style:{marginTop:"12px"}},React.createElement(n.Button,{isSecondary:!0,href:"".concat(window.location.origin,"/wp-admin/post-new.php?post_type=mayo_announcement&linked_event=").concat(g),target:"_blank"},"Create Announcement"))))};function ge(e){return ge="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ge(e)}function he(e){if(null!=e){var t=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(ge(e)+" is not iterable")}function be(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=Pe(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var a=0,l=function(){};return{s:l,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:l}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,c=!0,o=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return c=e.done,e},e:function(e){o=!0,r=e},f:function(){try{c||null==n.return||n.return()}finally{if(o)throw r}}}}function _e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,a)}return n}function Se(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?_e(Object(n),!0).forEach(function(t){we(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):_e(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function we(e,t,n){return(t=function(e){var t=function(e){if("object"!=ge(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=ge(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==ge(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function xe(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",l=n.toStringTag||"@@toStringTag";function r(n,a,l,r){var i=a&&a.prototype instanceof o?a:o,s=Object.create(i.prototype);return ke(s,"_invoke",function(n,a,l){var r,o,i,s=0,u=l||[],m=!1,d={p:0,n:0,v:e,a:p,f:p.bind(e,4),d:function(t,n){return r=t,o=0,i=e,d.n=n,c}};function p(n,a){for(o=n,i=a,t=0;!m&&s&&!l&&t<u.length;t++){var l,r=u[t],p=d.p,E=r[2];n>3?(l=E===a)&&(i=r[(o=r[4])?5:(o=3,3)],r[4]=r[5]=e):r[0]<=p&&((l=n<2&&p<r[1])?(o=0,d.v=a,d.n=r[1]):p<E&&(l=n<3||r[0]>a||a>E)&&(r[4]=n,r[5]=a,d.n=E,o=0))}if(l||n>1)return c;throw m=!0,a}return function(l,u,E){if(s>1)throw TypeError("Generator is already running");for(m&&1===u&&p(u,E),o=u,i=E;(t=o<2?e:i)||!m;){r||(o?o<3?(o>1&&(d.n=-1),p(o,i)):d.n=i:d.v=i);try{if(s=2,r){if(o||(l="next"),t=r[l]){if(!(t=t.call(r,i)))throw TypeError("iterator result is not an object");if(!t.done)return t;i=t.value,o<2&&(o=0)}else 1===o&&(t=r.return)&&t.call(r),o<2&&(i=TypeError("The iterator does not provide a '"+l+"' method"),o=1);r=e}else if((t=(m=d.n<0)?i:n.call(a,d))!==c)break}catch(t){r=e,o=1,i=t}finally{s=1}}return{value:t,done:m}}}(n,l,r),!0),s}var c={};function o(){}function i(){}function s(){}t=Object.getPrototypeOf;var u=[][a]?t(t([][a]())):(ke(t={},a,function(){return this}),t),m=s.prototype=o.prototype=Object.create(u);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,s):(e.__proto__=s,ke(e,l,"GeneratorFunction")),e.prototype=Object.create(m),e}return i.prototype=s,ke(m,"constructor",s),ke(s,"constructor",i),i.displayName="GeneratorFunction",ke(s,l,"GeneratorFunction"),ke(m),ke(m,l,"Generator"),ke(m,a,function(){return this}),ke(m,"toString",function(){return"[object Generator]"}),(xe=function(){return{w:r,m:d}})()}function ke(e,t,n,a){var l=Object.defineProperty;try{l({},"",{})}catch(e){l=0}ke=function(e,t,n,a){function r(t,n){ke(e,t,function(e){return this._invoke(t,n,e)})}t?l?l(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n:(r("next",0),r("throw",1),r("return",2))},ke(e,t,n,a)}function Ce(e){return function(e){if(Array.isArray(e))return Oe(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||Pe(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Te(e,t,n,a,l,r,c){try{var o=e[r](c),i=o.value}catch(e){return void n(e)}o.done?t(i):Promise.resolve(i).then(a,l)}function Ae(e){return function(){var t=this,n=arguments;return new Promise(function(a,l){var r=e.apply(t,n);function c(e){Te(r,a,l,c,o,"next",e)}function o(e){Te(r,a,l,c,o,"throw",e)}c(void 0)})}}function Ne(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,l,r,c,o=[],i=!0,s=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);i=!0);}catch(e){s=!0,l=e}finally{try{if(!i&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw l}}return o}}(e,t)||Pe(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Pe(e,t){if(e){if("string"==typeof e)return Oe(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Oe(e,t):void 0}}function Oe(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}(0,U.getPlugins)().some(function(e){return"mayo-event-details"===e.name})||(0,U.registerPlugin)("mayo-event-details",{render:function(){return React.createElement(te,null,React.createElement(ye,null))},icon:"calendar"});var De=function(t){var a=t.isOpen,l=t.onClose,r=t.onSelectEvent,c=t.onRemoveEvent,o=t.linkedEventRefs,i=(t.getRefKey,Ne((0,e.useState)(""),2)),s=i[0],m=i[1],d=Ne((0,e.useState)([]),2),p=d[0],E=d[1],f=Ne((0,e.useState)(!1),2),R=f[0],v=f[1],y=Ne((0,e.useState)(!1),2),g=y[0],h=y[1],b=Ne((0,e.useState)(1),2),_=b[0],S=b[1],w=Ne((0,e.useState)(!0),2),x=w[0],k=w[1],C=Ne((0,e.useState)(0),2),T=C[0],A=C[1],N=Ne((0,e.useState)(!0),2),P=N[0],O=N[1],D=(0,e.useRef)(null),j=(0,e.useRef)(null),B=function(e){return o.some(function(t){return"local"===t.type&&"local"===e.source.type?t.id===e.id:"external"===t.type&&"external"===e.source.type&&t.id===e.id&&t.source_id===e.source.id})},M=(0,e.useCallback)(function(){var e=Ae(xe().m(function e(t,n,a){var l,r,c,o,i,s=arguments;return xe().w(function(e){for(;;)switch(e.p=e.n){case 0:return l=s.length>3&&void 0!==s[3]&&s[3],1===n?v(!0):h(!0),e.p=1,r=new URLSearchParams({per_page:20,page:n,hide_past:a?"1":"0"}),t&&r.append("search",t),e.n=2,u("/events/search-all?".concat(r.toString()));case 2:c=e.v,o=c.events||[],E(l?function(e){return[].concat(Ce(e),Ce(o))}:o),A(c.total||0),k(n<(c.total_pages||1)),S(n),e.n=4;break;case 3:e.p=3,i=e.v,console.error("Error fetching events:",i),l||E([]),k(!1);case 4:return e.p=4,v(!1),h(!1),e.f(4);case 5:return e.a(2)}},e,null,[[1,3,4,5]])}));return function(t,n,a){return e.apply(this,arguments)}}(),[]);(0,e.useEffect)(function(){if(a)return j.current&&clearTimeout(j.current),j.current=setTimeout(function(){M(s,1,P,!1)},300),function(){j.current&&clearTimeout(j.current)}},[a,s,P,M]),(0,e.useEffect)(function(){a&&(m(""),E([]),S(1),k(!0),O(!0))},[a]);var L=(0,e.useCallback)(function(){if(D.current&&!R&&!g&&x){var e=D.current,t=e.scrollTop;e.scrollHeight-t-e.clientHeight<100&&M(s,_+1,P,!0)}},[R,g,x,s,_,P,M]);return a?React.createElement(n.Modal,{title:"Link Events",onRequestClose:l,style:{maxWidth:"600px",width:"100%"},className:"mayo-event-search-modal"},React.createElement("div",{style:{marginBottom:"16px"}},React.createElement(n.TextControl,{label:"Search Events",value:s,onChange:m,placeholder:"Search by event name...",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginTop:"8px"}},React.createElement(n.CheckboxControl,{label:"Hide past events",checked:P,onChange:O,__nextHasNoMarginBottom:!0}),T>0&&React.createElement("span",{style:{fontSize:"12px",color:"#666"}},T," event",1!==T?"s":""," found"))),React.createElement("div",{ref:D,onScroll:L,style:{maxHeight:"400px",overflowY:"auto",border:"1px solid #ddd",borderRadius:"4px",backgroundColor:"#fff"}},R&&React.createElement("div",{style:{textAlign:"center",padding:"40px"}},React.createElement(n.Spinner,null),React.createElement("p",{style:{margin:"8px 0 0",color:"#666"}},"Loading events...")),!R&&0===p.length&&React.createElement("div",{style:{textAlign:"center",padding:"40px",color:"#666"}},s?'No events found matching "'.concat(s,'"'):"No events available"),!R&&p.map(function(e){var t="external"===e.source.type,a=B(e),l=t?"external-".concat(e.source.id,"-").concat(e.id):"local-".concat(e.id);return React.createElement("div",{key:l,style:{padding:"12px 16px",borderBottom:"1px solid #eee",cursor:"pointer",transition:"background-color 0.2s",backgroundColor:a?"#e8f5e9":"transparent",borderLeft:"4px solid ".concat(a?"#4caf50":t?"#ff9800":"#0073aa")},onClick:function(){return a?null:function(e){B(e)||r(e)}(e)},onMouseEnter:function(e){a||(e.currentTarget.style.backgroundColor="#f0f7ff")},onMouseLeave:function(e){a||(e.currentTarget.style.backgroundColor=a?"#e8f5e9":"transparent")}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"}},React.createElement("div",{style:{flex:1}},React.createElement("div",{style:{fontWeight:600,marginBottom:"4px",display:"flex",alignItems:"center"}},a&&React.createElement("span",{className:"dashicons dashicons-yes-alt",style:{color:"#4caf50",fontSize:"16px",marginRight:"6px",width:"16px",height:"16px"}}),e.title),e.start_date&&React.createElement("div",{style:{fontSize:"12px",color:"#666",marginBottom:"4px"}},React.createElement("span",{className:"dashicons dashicons-calendar-alt",style:{fontSize:"12px",marginRight:"4px",verticalAlign:"middle",width:"12px",height:"12px"}}),function(e){if(!e)return"";try{var t=Ne(e.split("-").map(Number),3),n=t[0],a=t[1],l=t[2];return new Date(n,a-1,l).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}catch(t){return e}}(e.start_date))),React.createElement("div",{style:{display:"flex",alignItems:"center",gap:"8px"}},React.createElement("span",{style:{fontSize:"10px",backgroundColor:t?"#fff3e0":"#e3f2fd",color:t?"#e65100":"#1565c0",padding:"3px 8px",borderRadius:"3px",whiteSpace:"nowrap"}},e.source.name),a&&React.createElement(n.Button,{isSmall:!0,isDestructive:!0,onClick:function(t){return function(e,t){t.stopPropagation(),c(e)}(e,t)},style:{minWidth:"auto"}},"Unlink"))))}),g&&React.createElement("div",{style:{textAlign:"center",padding:"16px"}},React.createElement(n.Spinner,null),React.createElement("span",{style:{marginLeft:"8px",color:"#666",fontSize:"12px"}},"Loading more...")),!R&&!g&&!x&&p.length>0&&React.createElement("div",{style:{textAlign:"center",padding:"12px",color:"#666",fontSize:"12px"}},"End of results")),React.createElement("div",{style:{marginTop:"16px",textAlign:"right"}},React.createElement(n.Button,{variant:"secondary",onClick:l},"Close"))):null},je=[{value:"external",label:"External Link",dashicon:"dashicons-external"},{value:"hotel",label:"Hotel/Lodging",dashicon:"dashicons-building"},{value:"info",label:"Information",dashicon:"dashicons-info"},{value:"calendar",label:"Calendar",dashicon:"dashicons-calendar-alt"},{value:"location",label:"Location",dashicon:"dashicons-location"},{value:"link",label:"Generic Link",dashicon:"dashicons-admin-links"}],Be=function(t){var a=t.isOpen,l=t.onClose,r=t.onAddLink,c=Ne((0,e.useState)(""),2),o=c[0],i=c[1],s=Ne((0,e.useState)(""),2),u=s[0],m=s[1],d=Ne((0,e.useState)("external"),2),p=d[0],E=d[1],f=Ne((0,e.useState)(""),2),R=f[0],v=f[1];(0,e.useEffect)(function(){a&&(i(""),m(""),E("external"),v(""))},[a]);var y=function(e){if(!e)return v("URL is required"),!1;try{return new URL(e),v(""),!0}catch(e){return v("Please enter a valid URL (e.g., https://example.com)"),!1}};return a?React.createElement(n.Modal,{title:"Add Custom Link",onRequestClose:l,style:{maxWidth:"500px",width:"100%"},className:"mayo-custom-link-modal"},React.createElement("div",{style:{marginBottom:"16px"}},React.createElement(n.TextControl,{label:"Link Title",value:u,onChange:m,placeholder:"e.g., Hotel Reservations",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement("div",{style:{marginBottom:"16px"}},React.createElement(n.TextControl,{label:"URL",value:o,onChange:function(e){i(e),R&&y(e)},placeholder:"https://example.com",type:"url",__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),R&&React.createElement("p",{style:{color:"#dc3545",fontSize:"12px",marginTop:"4px",marginBottom:0}},R)),React.createElement("div",{style:{marginBottom:"24px"}},React.createElement("label",{style:{display:"block",marginBottom:"8px",fontWeight:500}},"Icon"),React.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px"}},je.map(function(e){return React.createElement("button",{key:e.value,type:"button",onClick:function(){return E(e.value)},style:{display:"flex",flexDirection:"column",alignItems:"center",padding:"12px 16px",border:"2px solid ".concat(p===e.value?"#0073aa":"#ddd"),borderRadius:"4px",backgroundColor:p===e.value?"#f0f7ff":"#fff",cursor:"pointer",minWidth:"80px",transition:"all 0.2s"}},React.createElement("span",{className:"dashicons ".concat(e.dashicon),style:{fontSize:"24px",width:"24px",height:"24px",color:p===e.value?"#0073aa":"#666",marginBottom:"4px"}}),React.createElement("span",{style:{fontSize:"11px",color:p===e.value?"#0073aa":"#666"}},e.label))}))),React.createElement("div",{style:{display:"flex",justifyContent:"flex-end",gap:"8px"}},React.createElement(n.Button,{variant:"secondary",onClick:l},"Cancel"),React.createElement(n.Button,{variant:"primary",onClick:function(){y(o)&&u.trim()&&(r({type:"custom",id:Date.now(),url:o.trim(),title:u.trim(),icon:p}),l())},disabled:!u.trim()||!o.trim()},"Add Link"))):null};const Me=function(){var t=Ne((0,e.useState)(!1),2),a=t[0],l=t[1],r=Ne((0,e.useState)(!1),2),c=r[0],o=r[1],i=Ne((0,e.useState)(!1),2),s=i[0],m=i[1],d=Ne((0,e.useState)(null),2),p=d[0],E=d[1],f=Ne((0,e.useState)([]),2),R=f[0],v=f[1],y=Ne((0,e.useState)(!1),2),g=y[0],h=y[1],b=Ne((0,e.useState)(!1),2),_=b[0],S=b[1],w=Ne((0,e.useState)(null),2),x=w[0],k=w[1],C=ee().serviceBodies,T=(0,ae.useSelect)(function(e){return e("core/editor").getCurrentPostType()}),A=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("status")}),N=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("meta")||{}}),P=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("categories")||[]}),O=(0,ae.useSelect)(function(e){return e("core/editor").getEditedPostAttribute("tags")||[]}),D=(0,ae.useDispatch)("core/editor").editPost,j=N.service_body||"";(0,e.useEffect)(function(){if("mayo_announcement"===T){var e=function(){var e=Ae(xe().m(function e(){var t,n;return xe().w(function(e){for(;;)switch(e.p=e.n){case 0:return h(!0),e.p=1,e.n=2,u("/subscribers/count",{method:"POST",body:JSON.stringify({categories:P,tags:O,service_body:j})});case 2:t=e.v,E(t.count),v(t.subscribers||[]),e.n=4;break;case 3:e.p=3,n=e.v,console.error("Error fetching subscriber count:",n),E(null),v([]);case 4:h(!1);case 5:return e.a(2)}},e,null,[[1,3]])}));return function(){return e.apply(this,arguments)}}(),t=setTimeout(e,300);return function(){return clearTimeout(t)}}},[T,P,O,j]),(0,e.useEffect)(function(){if(!s&&"mayo_announcement"===T&&"auto-draft"===A){var e=new URLSearchParams(window.location.search).get("linked_event");if(e){var t=parseInt(e,10);if(!isNaN(t)&&t>0){var n=N.linked_event_refs||[];if(!n.some(function(e){return"local"===e.type&&e.id===t})){var a={type:"local",id:t};D({meta:Se(Se({},N),{},{linked_event_refs:[].concat(Ce(n),[a])})})}}m(!0)}}},[T,A,s,N.linked_event_refs]),(0,e.useEffect)(function(){if("mayo_announcement"===T){var e=function(){var e=Ae(xe().m(function e(){var t,n;return xe().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,u("/settings");case 1:t=e.v,k({service_bodies:t.subscription_service_bodies||[]}),e.n=3;break;case 2:e.p=2,n=e.v,console.error("Error fetching subscription settings:",n),k({service_bodies:[]});case 3:return e.a(2)}},e,null,[[0,2]])}));return function(){return e.apply(this,arguments)}}();e()}},[T]);var B="auto-draft"===A;if((0,e.useEffect)(function(){if(B&&!N.display_timezone){var e=ce();D({meta:Se(Se({},N),{},{display_timezone:e})})}},[B,N.display_timezone]),"mayo_announcement"!==T)return null;var M=function(){if(!x||0===x.service_bodies.length)return C;var e=x.service_bodies.map(function(e){return e.toString()});return C.filter(function(t){return e.includes(t.id.toString())})}(),L=function(e,t){D({meta:Se(Se({},N),{},we({},e,t))})},I=function(){return N.linked_event_refs&&Array.isArray(N.linked_event_refs)&&N.linked_event_refs.length>0?N.linked_event_refs:N.linked_events&&Array.isArray(N.linked_events)?N.linked_events.map(function(e){return{type:"local",id:e}}):[]},F=I(),z=function(e){return"local"===e.type?"local-".concat(e.id):"custom"===e.type?"custom-".concat(e.id):"external-".concat(e.source_id,"-").concat(e.id)},G=function(e){var t=I().filter(function(t){return"local"===t.type&&"local"===e.type?t.id!==e.id:"external"===t.type&&"external"===e.type?!(t.id===e.id&&t.source_id===e.source_id):"custom"!==t.type||"custom"!==e.type||t.id!==e.id});L("linked_event_refs",t)},U=Ne((0,e.useState)({}),2),W=U[0],H=U[1],Y=Ne((0,e.useState)(!1),2),q=Y[0],J=Y[1];return(0,e.useEffect)(function(){var e=function(){var e=Ae(xe().m(function e(){var t,n,a,l,r,c,o;return xe().w(function(e){for(;;)switch(e.p=e.n){case 0:if(t=F.filter(function(e){return"custom"!==e.type&&!W[z(e)]}),n={},F.filter(function(e){return"custom"===e.type}).forEach(function(e){var t=z(e);W[t]||(n[t]={title:e.title||"Custom Link",permalink:e.url||"#",icon:e.icon||"external",source:{type:"custom",id:"custom",name:"Custom Link"}})}),Object.keys(n).length>0&&H(function(e){return Se(Se({},e),n)}),0!==t.length){e.n=1;break}return e.a(2);case 1:J(!0),a={},l=be(t),e.p=2,c=xe().m(function e(){var t,n,l,c,o,i;return xe().w(function(e){for(;;)switch(e.p=e.n){case 0:if(t=r.value,n=z(t),e.p=1,"local"!==t.type){e.n=3;break}return e.n=2,u("/events/".concat(t.id));case 2:(l=e.v)&&!l.code?a[n]={title:l.title||"Unknown Event",start_date:l.start_date||"",permalink:l.permalink||"",edit_link:l.edit_link||"",source:{type:"local",id:"local",name:"Local"}}:a[n]={title:"Event #".concat(t.id),start_date:"",permalink:"",edit_link:"",unavailable:!0,source:{type:"local",id:"local",name:"Local"}},e.n=7;break;case 3:if("external"!==t.type){e.n=7;break}return e.p=4,e.n=5,u("/events/search-all?per_page=100");case 5:c=e.v,o=(c.events||[]).find(function(e){return"external"===e.source.type&&e.source.id===t.source_id&&e.id===t.id}),a[n]=o?{title:o.title||"Unknown Event",start_date:o.start_date||"",permalink:o.permalink||"",edit_link:"",source:o.source}:{title:"External Event #".concat(t.id),start_date:"",permalink:"",edit_link:"",unavailable:!0,source:{type:"external",id:t.source_id,name:t.source_id}},e.n=7;break;case 6:e.p=6,e.v,a[n]={title:"External Event #".concat(t.id),start_date:"",permalink:"",edit_link:"",unavailable:!0,source:{type:"external",id:t.source_id,name:t.source_id}};case 7:e.n=9;break;case 8:e.p=8,i=e.v,console.error("Error fetching event details:",i),a[n]={title:"local"===t.type?"Event #".concat(t.id):"External Event #".concat(t.id),start_date:"",permalink:"",edit_link:"",unavailable:!0,source:"local"===t.type?{type:"local",id:"local",name:"Local"}:{type:"external",id:t.source_id,name:t.source_id}};case 9:return e.a(2)}},e,null,[[4,6],[1,8]])}),l.s();case 3:if((r=l.n()).done){e.n=5;break}return e.d(he(c()),4);case 4:e.n=3;break;case 5:e.n=7;break;case 6:e.p=6,o=e.v,l.e(o);case 7:return e.p=7,l.f(),e.f(7);case 8:Object.keys(a).length>0&&H(function(e){return Se(Se({},e),a)}),J(!1);case 9:return e.a(2)}},e,null,[[2,6,7,8]])}));return function(){return e.apply(this,arguments)}}();F.length>0&&e()},[JSON.stringify(F)]),React.createElement(React.Fragment,null,React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-announcement-details",title:"Announcement Settings",className:"mayo-announcement-details"},React.createElement(n.PanelBody,{title:"Display Window",initialOpen:!0},React.createElement("p",{className:"components-base-control__help",style:{marginTop:0,marginBottom:"12px"}},"Control when this announcement is visible on the frontend."),React.createElement("div",{style:{border:"1px solid #e0e0e0",borderRadius:"4px",padding:"12px",marginBottom:"12px",backgroundColor:"#fafafa"}},React.createElement("div",{style:{marginBottom:"4px"}},React.createElement("strong",{style:{fontSize:"12px",color:"#1e1e1e"}},"Start")),React.createElement(n.TextControl,{label:"Date",type:"date",value:N.display_start_date||"",onChange:function(e){return L("display_start_date",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement("div",{style:{marginTop:"8px"}},React.createElement(n.TextControl,{label:"Time",type:"time",value:N.display_start_time||"",onChange:function(e){return L("display_start_time",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement("p",{className:"components-base-control__help",style:{marginTop:"8px",marginBottom:0}},"Leave empty to start showing immediately")),React.createElement("div",{style:{border:"1px solid #e0e0e0",borderRadius:"4px",padding:"12px",backgroundColor:"#fafafa"}},React.createElement("div",{style:{marginBottom:"4px"}},React.createElement("strong",{style:{fontSize:"12px",color:"#1e1e1e"}},"End")),React.createElement(n.TextControl,{label:"Date",type:"date",value:N.display_end_date||"",onChange:function(e){return L("display_end_date",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement("div",{style:{marginTop:"8px"}},React.createElement(n.TextControl,{label:"Time",type:"time",value:N.display_end_time||"",onChange:function(e){return L("display_end_time",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0})),React.createElement("p",{className:"components-base-control__help",style:{marginTop:"8px",marginBottom:0}},"Leave empty to show indefinitely")),React.createElement("div",{style:{marginTop:"12px"}},React.createElement(n.SelectControl,{label:"Timezone",value:N.display_timezone||"",options:[{label:"-- No timezone set --",value:""}].concat(Ce(re())),onChange:function(e){return L("display_timezone",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}))),React.createElement(n.PanelBody,{title:"Priority",initialOpen:!0},React.createElement(n.SelectControl,{label:"Priority Level",value:N.priority||"normal",options:[{label:"Low",value:"low"},{label:"Normal",value:"normal"},{label:"High",value:"high"},{label:"Urgent",value:"urgent"}],onChange:function(e){return L("priority",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),React.createElement("p",{className:"components-base-control__help"},"Priority affects display order and styling.",React.createElement("span",{style:{display:"inline-block",marginLeft:"8px",color:{low:"#6c757d",normal:"#0073aa",high:"#ff9800",urgent:"#dc3545"}[N.priority||"normal"],fontWeight:600}},(N.priority||"normal").charAt(0).toUpperCase()+(N.priority||"normal").slice(1)))),React.createElement(n.PanelBody,{title:"Service Body",initialOpen:!0},React.createElement(n.SelectControl,{label:"Service Body",value:N.service_body||"",options:[{label:"Select a service body",value:""}].concat(Ce(!x||0===x.service_bodies.length||x.service_bodies.map(function(e){return e.toString()}).includes("0")?[{label:"Unaffiliated (0)",value:"0"}]:[]),Ce(M.map(function(e){return{label:"".concat(e.name," (").concat(e.id,")"),value:e.id}}))),onChange:function(e){return L("service_body",e)},__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0}),x&&x.service_bodies.length>0&&React.createElement("p",{className:"components-base-control__help",style:{marginTop:"8px"}},"Only service bodies enabled in"," ",React.createElement("a",{href:"/wp-admin/admin.php?page=mayo-settings",target:"_blank",rel:"noopener noreferrer"},"subscription settings")," ","are shown."))),React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-linked-events",title:"Links & Events",className:"mayo-linked-events"},React.createElement("p",{className:"components-base-control__help",style:{marginTop:0}},"Add custom links or link to events. Custom links appear first."),q&&F.length>0&&React.createElement("div",{style:{textAlign:"center",padding:"16px"}},React.createElement(n.Spinner,null),React.createElement("p",{style:{margin:"8px 0 0",color:"#666",fontSize:"12px"}},"Loading details...")),!q&&F.length>0&&React.createElement("div",{className:"mayo-linked-events-list",style:{marginBottom:"16px"}},F.map(function(e,t){var a,l,r,c,o=z(e),i=W[o]||{},s=i.title&&!i.title.startsWith("Event #")&&!i.title.startsWith("External Event #"),u="external"===e.type,m="custom"===e.type;return React.createElement("div",{key:o,style:{padding:"12px",backgroundColor:"#f9f9f9",borderRadius:"4px",marginBottom:"8px",borderLeft:"3px solid ".concat(m?"#9c27b0":u?"#ff9800":"#0073aa")}},React.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"}},React.createElement("div",{style:{flex:1}},s||i.title||m?React.createElement(React.Fragment,null,React.createElement("div",{style:{display:"flex",alignItems:"center",marginBottom:"4px"}},m&&React.createElement("span",{className:"dashicons ".concat((r=e.icon||i.icon||"external",c=je.find(function(e){return e.value===r}),c?c.dashicon:"dashicons-external")),style:{fontSize:"16px",width:"16px",height:"16px",marginRight:"6px",color:"#9c27b0"}}),React.createElement("strong",null,i.title||e.title||(u?"External Event #".concat(e.id):"Event #".concat(e.id)))),React.createElement("span",{style:{display:"inline-block",fontSize:"11px",backgroundColor:m?"#f3e5f5":u?"#fff3e0":"#e3f2fd",color:m?"#7b1fa2":u?"#e65100":"#1565c0",padding:"2px 6px",borderRadius:"3px",marginBottom:"4px"}},m?"Custom Link":u?(null===(a=i.source)||void 0===a?void 0:a.name)||(null===(l=i.source)||void 0===l?void 0:l.id):"Local Event"),i.start_date&&React.createElement("div",{style:{color:"#666",fontSize:"12px",marginBottom:"8px"}},React.createElement("span",{className:"dashicons dashicons-calendar-alt",style:{fontSize:"14px",marginRight:"4px",verticalAlign:"middle"}}),function(e){if(!e)return"";try{var t=Ne(e.split("-").map(Number),3),n=t[0],a=t[1],l=t[2];return new Date(n,a-1,l).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}catch(t){return e}}(i.start_date)),React.createElement("div",{style:{display:"flex",gap:"8px",marginTop:"8px"}},(i.permalink||e.url)&&React.createElement("a",{href:i.permalink||e.url,target:"_blank",rel:"noopener noreferrer",style:{display:"inline-flex",alignItems:"center",padding:"4px 8px",fontSize:"11px",backgroundColor:"#f0f0f0",border:"1px solid #c3c4c7",borderRadius:"3px",textDecoration:"none",color:"#2271b1",whiteSpace:"nowrap"}},React.createElement("span",{className:"dashicons dashicons-external",style:{fontSize:"14px",marginRight:"4px",width:"14px",height:"14px"}}),m?"Open Link":u?"View on External Site":"View"),!u&&!m&&i.edit_link&&React.createElement("a",{href:i.edit_link,target:"_blank",rel:"noopener noreferrer",style:{display:"inline-flex",alignItems:"center",padding:"4px 8px",fontSize:"11px",backgroundColor:"#f0f0f0",border:"1px solid #c3c4c7",borderRadius:"3px",textDecoration:"none",color:"#2271b1",whiteSpace:"nowrap"}},React.createElement("span",{className:"dashicons dashicons-edit",style:{fontSize:"14px",marginRight:"4px",width:"14px",height:"14px"}}),"Edit"))):React.createElement("span",{style:{color:"#666"}},u?"External Event #".concat(e.id):"Event #".concat(e.id),React.createElement("span",{style:{fontSize:"12px",marginLeft:"8px"}},"(loading...)"))),React.createElement(n.Button,{isSmall:!0,isDestructive:!0,onClick:function(){return G(e)},style:{marginLeft:"12px"}},"Remove")))})),React.createElement("div",{style:{display:"flex",flexDirection:"column",gap:"8px"}},React.createElement(n.Button,{variant:"secondary",onClick:function(){return o(!0)},style:{justifyContent:"center"}},React.createElement("span",{className:"dashicons dashicons-admin-links",style:{marginRight:"4px"}}),"Add Custom Link"),React.createElement(n.Button,{variant:"secondary",onClick:function(){return l(!0)},style:{justifyContent:"center"}},React.createElement("span",{className:"dashicons dashicons-calendar-alt",style:{marginRight:"4px"}}),"Link Event")),React.createElement(Be,{isOpen:c,onClose:function(){return o(!1)},onAddLink:function(e){var t=I();L("linked_event_refs",[].concat(Ce(t),[e]))}}),React.createElement(De,{isOpen:a,onClose:function(){return l(!1)},onSelectEvent:function(e){!function(e){var t,n=I();t="local"===e.source.type?{type:"local",id:e.id}:{type:"external",id:e.id,source_id:e.source.id},n.some(function(e){return"local"===e.type&&"local"===t.type?e.id===t.id:"external"===e.type&&"external"===t.type&&e.id===t.id&&e.source_id===t.source_id})||L("linked_event_refs",[].concat(Ce(n),[t]))}(e)},onRemoveEvent:function(e){var t="local"===e.source.type?{type:"local",id:e.id}:{type:"external",id:e.id,source_id:e.source.id};G(t)},linkedEventRefs:F,getRefKey:z})),React.createElement(ne.PluginDocumentSettingPanel,{name:"mayo-email-recipients",title:"Email Recipients",className:"mayo-email-recipients"},React.createElement("div",{style:{display:"flex",alignItems:"center",gap:"8px",cursor:p>0?"pointer":"default"},onClick:function(){return p>0&&S(!0)}},g?React.createElement(n.Spinner,{style:{margin:0}}):React.createElement(React.Fragment,null,React.createElement("span",{className:"dashicons dashicons-email-alt",style:{color:"#2271b1",fontSize:"18px",width:"18px",height:"18px"}}),React.createElement("span",{style:{textDecoration:p>0?"underline":"none"}},React.createElement("strong",null,null!=p?p:0)," subscriber",1!==p?"s":""," will receive this announcement"))),React.createElement("p",{className:"components-base-control__help",style:{marginTop:"8px"}},"Based on selected categories, tags, and service body.",p>0&&" Click to view recipients."),_&&React.createElement(n.Modal,{title:"Email Recipients (".concat(R.length,")"),onRequestClose:function(){return S(!1)},style:{maxWidth:"600px",width:"100%"}},React.createElement("div",{style:{maxHeight:"400px",overflowY:"auto",border:"1px solid #ddd",borderRadius:"4px"}},R.length>0?R.map(function(e,t){var n,a;return React.createElement("div",{key:e.email,style:{padding:"12px",borderBottom:t<R.length-1?"1px solid #eee":"none"}},React.createElement("div",{style:{fontSize:"13px",fontWeight:500,marginBottom:"8px"}},e.email),React.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px"}},e.reason.all?React.createElement("span",{style:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#f0f0f0",color:"#666",borderRadius:"3px"}},"Receives all announcements"):React.createElement(React.Fragment,null,null===(n=e.reason.categories)||void 0===n?void 0:n.map(function(e){return React.createElement("span",{key:e,style:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#e3f2fd",color:"#1565c0",borderRadius:"3px"}},e)}),null===(a=e.reason.tags)||void 0===a?void 0:a.map(function(e){return React.createElement("span",{key:e,style:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#fff3e0",color:"#e65100",borderRadius:"3px"}},e)}),e.reason.service_body&&React.createElement("span",{style:{display:"inline-block",padding:"3px 8px",fontSize:"11px",backgroundColor:"#e8f5e9",color:"#2e7d32",borderRadius:"3px"}},e.reason.service_body))))}):React.createElement("div",{style:{padding:"20px",textAlign:"center",color:"#666"}},"No matching subscribers")),React.createElement("div",{style:{marginTop:"16px",textAlign:"right"}},React.createElement(n.Button,{variant:"secondary",onClick:function(){return S(!1)}},"Close")))))};(0,U.getPlugins)().some(function(e){return"mayo-announcement-details"===e.name})||(0,U.registerPlugin)("mayo-announcement-details",{render:function(){return React.createElement(te,null,React.createElement(Me,null))},icon:"megaphone"}),document.addEventListener("DOMContentLoaded",function(){var n=document.getElementById("mayo-shortcode-root"),a=document.getElementById("mayo-settings-root"),l=document.getElementById("mayo-css-classes-root"),r=document.getElementById("mayo-api-docs-root"),c=document.getElementById("mayo-subscribers-root");n&&(0,e.render)(React.createElement(t,null),n),a&&(0,e.render)(React.createElement(x,null),a),l&&(0,e.render)(React.createElement(C,null),l),r&&(0,e.render)(React.createElement(T,null),r),c&&(0,e.render)(React.createElement(G,null),c)})})();
  • mayo-events-manager/trunk/build.txt

    r3484175 r3490312  
    1 282e9adc304c300f0350021dc737d87a7e504733
     1ec0e1a084a5abcee29d12898f7406a09d56e1950
  • mayo-events-manager/trunk/includes/Admin.php

    r3428761 r3490312  
    218218    }
    219219
     220    private static $service_body_map = null;
     221
     222    public static function get_service_body_map() {
     223        if (self::$service_body_map !== null) {
     224            return self::$service_body_map;
     225        }
     226
     227        $cached = get_transient('mayo_service_body_map');
     228        if ($cached !== false) {
     229            self::$service_body_map = $cached;
     230            return self::$service_body_map;
     231        }
     232
     233        $map = [];
     234        $settings = get_option('mayo_settings', []);
     235        $bmlt_root_server = $settings['bmlt_root_server'] ?? '';
     236
     237        if (!empty($bmlt_root_server)) {
     238            $response = wp_remote_get($bmlt_root_server . '/client_interface/json/?switcher=GetServiceBodies');
     239
     240            if (!is_wp_error($response)) {
     241                $service_bodies = json_decode(wp_remote_retrieve_body($response), true);
     242
     243                if (is_array($service_bodies)) {
     244                    foreach ($service_bodies as $body) {
     245                        $map[$body['id']] = $body['name'];
     246                    }
     247                }
     248            }
     249        }
     250
     251        set_transient('mayo_service_body_map', $map, 600);
     252        self::$service_body_map = $map;
     253        return self::$service_body_map;
     254    }
     255
    220256    public static function render_custom_columns($column, $post_id) {
    221257        switch ($column) {
     
    227263                if ($service_body_id === '0') {
    228264                    echo esc_html('Unaffiliated (0)');
     265                } elseif (empty($service_body_id)) {
     266                    echo esc_html('—');
    229267                } else {
    230                     // Get the service body name from the BMLT root server
    231                     $settings = get_option('mayo_settings', []);
    232                     $bmlt_root_server = $settings['bmlt_root_server'] ?? '';
    233                     $found = false;
    234                    
    235                     if (!empty($bmlt_root_server)) {
    236                         $response = wp_remote_get($bmlt_root_server . '/client_interface/json/?switcher=GetServiceBodies');
    237                        
    238                         if (!is_wp_error($response)) {
    239                             $service_bodies = json_decode(wp_remote_retrieve_body($response), true);
    240                            
    241                             if (is_array($service_bodies)) {
    242                                 foreach ($service_bodies as $body) {
    243                                     if ($body['id'] == $service_body_id) {
    244                                         echo esc_html($body['name'] . ' (' . $body['id'] . ')');
    245                                         $found = true;
    246                                         break;
    247                                     }
    248                                 }
    249                             }
    250                         }
    251                     }
    252                    
    253                     // Fallback if we couldn't get the name
    254                     if (!$found) {
    255                         if (empty($service_body_id)) {
    256                             echo esc_html('—');
    257                         } else {
    258                             echo esc_html('Service Body (' . $service_body_id . ')');
    259                         }
     268                    $map = self::get_service_body_map();
     269                    if (isset($map[$service_body_id])) {
     270                        echo esc_html($map[$service_body_id] . ' (' . $service_body_id . ')');
     271                    } else {
     272                        echo esc_html('Service Body (' . $service_body_id . ')');
    260273                    }
    261274                }
  • mayo-events-manager/trunk/includes/Rest/EventsController.php

    r3442218 r3490312  
    1111use BmltEnabled\Mayo\Rest\Helpers\FileUpload;
    1212use BmltEnabled\Mayo\Rest\Helpers\EmailNotification;
     13use BmltEnabled\Mayo\Rest\Helpers\ParallelHttp;
    1314use BmltEnabled\Mayo\Rest\Helpers\ServiceBodyLookup;
    1415
     
    172173        error_reporting(E_ERROR | E_PARSE);
    173174
     175        $include_debug = (isset($_GET['debug']) && $_GET['debug'] === '1')
     176            || (isset($_REQUEST['debug']) && $_REQUEST['debug'] === '1');
     177        if ($include_debug) {
     178            $t_total = microtime(true);
     179            $debug = ['external_sources' => []];
     180        }
     181
    174182        $events = [];
    175183        $sources = [];
     
    186194        // Get local events by default unless source_ids is explicitly set and doesn't include 'local'
    187195        if (empty($sourceIds) || in_array('local', $sourceIds)) {
     196            if ($include_debug) {
     197                $t0 = microtime(true);
     198            }
    188199            $local_events = self::get_local_events($_GET);
     200            if ($include_debug) {
     201                $debug['local_events'] = [
     202                    'duration_ms' => round((microtime(true) - $t0) * 1000),
     203                    'count' => count($local_events),
     204                ];
     205            }
    189206
    190207            // Add local source to sources array
     
    218235
    219236            if (!empty($enabled_sources)) {
    220                 foreach ($enabled_sources as $source) {
    221                     try {
    222                         $result = self::fetch_external_events($source);
    223 
    224                         if (!empty($result['events'])) {
    225                             $events = array_merge($events, $result['events']);
    226                         }
    227 
    228                         if (!empty($result['source'])) {
    229                             $sources[$source['id']] = $result['source'];
    230                         }
    231                     } catch (\Exception $e) {
    232                         error_log('Error fetching events from source ' . $source['url'] . ': ' . $e->getMessage());
    233                     }
    234                 }
    235             }
     237                $external_result = self::fetch_all_external_events($enabled_sources, $include_debug);
     238                $events = array_merge($events, $external_result['events']);
     239                foreach ($external_result['sources'] as $id => $source_info) {
     240                    $sources[$id] = $source_info;
     241                }
     242                if ($include_debug) {
     243                    $debug['external_sources'] = $external_result['_debug'];
     244                }
     245            }
     246        }
     247
     248        if ($include_debug) {
     249            $t_sort = microtime(true);
    236250        }
    237251
     
    278292        $paginated_events = array_slice($events, $offset, $per_page);
    279293
     294        if ($include_debug) {
     295            $debug['sorting_pagination_ms'] = round((microtime(true) - $t_sort) * 1000);
     296            $debug['total_events_before_pagination'] = $total_events;
     297            $debug['total_duration_ms'] = round((microtime(true) - $t_total) * 1000);
     298        }
     299
    280300        error_reporting($previous_error_reporting);
    281301
    282         return new \WP_REST_Response([
     302        $response_data = [
    283303            'events' => $paginated_events,
    284304            'sources' => array_values($sources),
     
    289309                'total_pages' => $total_pages
    290310            ]
    291         ]);
     311        ];
     312
     313        if ($include_debug) {
     314            $response_data['_debug'] = $debug;
     315        }
     316
     317        return new \WP_REST_Response($response_data);
    292318    }
    293319
     
    837863
    838864        if (!empty($eventType)) {
    839             $recurring_meta_query[] = [
    840                 'key' => 'event_type',
    841                 'value' => $eventType,
    842                 'compare' => '='
    843             ];
     865            if (str_contains($eventType, ',')) {
     866                $event_types = array_map('trim', explode(',', $eventType));
     867                $recurring_meta_query[] = [
     868                    'key' => 'event_type',
     869                    'value' => $event_types,
     870                    'compare' => 'IN'
     871                ];
     872            } else {
     873                $recurring_meta_query[] = [
     874                    'key' => 'event_type',
     875                    'value' => $eventType,
     876                    'compare' => '='
     877                ];
     878            }
    844879        }
    845880
     
    9991034
    10001035        if (!empty($eventType)) {
    1001             $meta_query[] = [
    1002                 'key' => 'event_type',
    1003                 'value' => $eventType,
    1004                 'compare' => '='
    1005             ];
     1036            if (str_contains($eventType, ',')) {
     1037                $event_types = array_map('trim', explode(',', $eventType));
     1038                $meta_query[] = [
     1039                    'key' => 'event_type',
     1040                    'value' => $event_types,
     1041                    'compare' => 'IN'
     1042                ];
     1043            } else {
     1044                $meta_query[] = [
     1045                    'key' => 'event_type',
     1046                    'value' => $eventType,
     1047                    'compare' => '='
     1048                ];
     1049            }
    10061050        }
    10071051
     
    10851129
    10861130    /**
     1131     * Fetch events from all external sources in parallel.
     1132     *
     1133     * Phase 1: Fire events + settings fetches for all sources in parallel.
     1134     * Phase 2: Parse settings to get BMLT URLs, fire BMLT fetches in parallel.
     1135     * Phase 3: Assemble results.
     1136     *
     1137     * @param array $sources   Array of enabled source configurations
     1138     * @param bool  $include_debug Whether to include debug timing info
     1139     * @return array ['events' => [...], 'sources' => [...], '_debug' => [...]]
     1140     */
     1141    private static function fetch_all_external_events(array $sources, bool $include_debug): array
     1142    {
     1143        $all_events    = [];
     1144        $all_sources   = [];
     1145        $all_debug     = [];
     1146
     1147        // --- Phase 1: Build events + settings URLs, fire in parallel ---
     1148        $phase1_requests = [];
     1149        $source_map      = []; // keyed by source id for quick lookup
     1150
     1151        foreach ($sources as $source) {
     1152            $sid = $source['id'];
     1153            $source_map[$sid] = $source;
     1154
     1155            // Events URL (same logic as fetch_external_events)
     1156            $params = [];
     1157            if (!empty($source['event_type'])) {
     1158                $params['event_type'] = $source['event_type'];
     1159            }
     1160            if (!empty($source['service_body'])) {
     1161                $params['service_body'] = $source['service_body'];
     1162            }
     1163            if (!empty($source['categories'])) {
     1164                $params['categories'] = $source['categories'];
     1165            }
     1166            if (!empty($source['tags'])) {
     1167                $params['tags'] = $source['tags'];
     1168            }
     1169            if (isset($_GET['archive'])) {
     1170                $params['archive'] = $_GET['archive'];
     1171            }
     1172            if (isset($_GET['timezone'])) {
     1173                $params['timezone'] = $_GET['timezone'];
     1174            }
     1175            $params['per_page'] = 100;
     1176
     1177            $events_url   = add_query_arg($params, trailingslashit($source['url']) . 'wp-json/event-manager/v1/events');
     1178            $settings_url = trailingslashit($source['url']) . 'wp-json/event-manager/v1/settings';
     1179
     1180            $phase1_requests["{$sid}:events"]   = $events_url;
     1181            $phase1_requests["{$sid}:settings"] = $settings_url;
     1182        }
     1183
     1184        $phase1_results = ParallelHttp::get_multiple($phase1_requests);
     1185
     1186        // --- Phase 2: Parse settings responses, build BMLT URLs, fire in parallel ---
     1187        $phase2_requests = [];
     1188
     1189        foreach ($sources as $source) {
     1190            $sid        = $source['id'];
     1191            $settings_r = $phase1_results["{$sid}:settings"];
     1192
     1193            if ($settings_r['error'] !== null || $settings_r['status'] !== 200) {
     1194                continue;
     1195            }
     1196
     1197            $settings = json_decode($settings_r['body'], true);
     1198            if (empty($settings['bmlt_root_server'])) {
     1199                continue;
     1200            }
     1201
     1202            $bmlt_url = add_query_arg(
     1203                'switcher',
     1204                'GetServiceBodies',
     1205                trailingslashit($settings['bmlt_root_server']) . 'client_interface/json/'
     1206            );
     1207            $phase2_requests["{$sid}:bmlt"] = $bmlt_url;
     1208        }
     1209
     1210        $phase2_results = !empty($phase2_requests) ? ParallelHttp::get_multiple($phase2_requests) : [];
     1211
     1212        // --- Phase 3: Assemble results ---
     1213        foreach ($sources as $source) {
     1214            $sid         = $source['id'];
     1215            $source_debug = [];
     1216
     1217            if ($include_debug) {
     1218                $source_debug['source_id']  = $sid;
     1219                $source_debug['source_url'] = $source['url'];
     1220                $source_debug['calls']      = [];
     1221            }
     1222
     1223            // Parse events response
     1224            $events_r = $phase1_results["{$sid}:events"];
     1225
     1226            if ($include_debug) {
     1227                $source_debug['calls']['events_fetch'] = [
     1228                    'url'        => $phase1_requests["{$sid}:events"],
     1229                    'duration_ms' => $events_r['duration_ms'],
     1230                    'status'     => $events_r['error'] ?? $events_r['status'],
     1231                    'size_bytes' => $events_r['size_bytes'],
     1232                ];
     1233            }
     1234
     1235            $events = [];
     1236            if ($events_r['error'] === null && $events_r['status'] === 200) {
     1237                $data   = json_decode($events_r['body'], true);
     1238                $events = isset($data['events']) ? $data['events'] : $data;
     1239                if (!is_array($events)) {
     1240                    $events = [];
     1241                }
     1242            } else {
     1243                error_log('External Events Error for source ' . $source['url'] . ': ' . ($events_r['error'] ?? 'HTTP ' . $events_r['status']));
     1244            }
     1245
     1246            // Parse settings + BMLT response for service bodies
     1247            $service_bodies = [];
     1248            $settings_r     = $phase1_results["{$sid}:settings"];
     1249
     1250            if ($include_debug) {
     1251                $source_debug['calls']['service_bodies_fetch'] = [
     1252                    'calls' => [],
     1253                ];
     1254
     1255                $source_debug['calls']['service_bodies_fetch']['calls']['settings_fetch'] = [
     1256                    'url'        => $phase1_requests["{$sid}:settings"],
     1257                    'duration_ms' => $settings_r['duration_ms'],
     1258                    'status'     => $settings_r['error'] ?? $settings_r['status'],
     1259                    'size_bytes' => $settings_r['size_bytes'],
     1260                ];
     1261            }
     1262
     1263            if (isset($phase2_results["{$sid}:bmlt"])) {
     1264                $bmlt_r = $phase2_results["{$sid}:bmlt"];
     1265
     1266                if ($include_debug) {
     1267                    $source_debug['calls']['service_bodies_fetch']['calls']['bmlt_fetch'] = [
     1268                        'url'        => $phase2_requests["{$sid}:bmlt"],
     1269                        'duration_ms' => $bmlt_r['duration_ms'],
     1270                        'status'     => $bmlt_r['error'] ?? $bmlt_r['status'],
     1271                        'size_bytes' => $bmlt_r['size_bytes'],
     1272                    ];
     1273                }
     1274
     1275                if ($bmlt_r['error'] === null && $bmlt_r['status'] === 200) {
     1276                    $decoded = json_decode($bmlt_r['body'], true);
     1277                    if (is_array($decoded)) {
     1278                        $service_bodies = $decoded;
     1279                    }
     1280                }
     1281            }
     1282
     1283            if ($include_debug) {
     1284                $source_debug['calls']['service_bodies_fetch']['duration_ms'] =
     1285                    ($settings_r['duration_ms'] ?? 0)
     1286                    + (isset($phase2_results["{$sid}:bmlt"]) ? $phase2_results["{$sid}:bmlt"]['duration_ms'] : 0);
     1287            }
     1288
     1289            // Build source info
     1290            $source_name = $source['name'] ?? parse_url($source['url'], PHP_URL_HOST);
     1291            $source_info = [
     1292                'id'             => $sid,
     1293                'url'            => parse_url($source['url'], PHP_URL_HOST),
     1294                'name'           => $source_name,
     1295                'service_bodies' => $service_bodies,
     1296            ];
     1297
     1298            // Tag events with source info
     1299            foreach ($events as &$event) {
     1300                $event['source_id'] = $sid;
     1301                $event['source']    = [
     1302                    'type' => 'external',
     1303                    'id'   => $sid,
     1304                    'name' => $source_name,
     1305                ];
     1306            }
     1307            unset($event);
     1308
     1309            if ($include_debug) {
     1310                $source_debug['event_count'] = count($events);
     1311            }
     1312
     1313            $all_events  = array_merge($all_events, $events);
     1314            $all_sources[$sid] = $source_info;
     1315
     1316            if ($include_debug) {
     1317                $all_debug[] = $source_debug;
     1318            }
     1319        }
     1320
     1321        return [
     1322            'events'  => $all_events,
     1323            'sources' => $all_sources,
     1324            '_debug'  => $all_debug,
     1325        ];
     1326    }
     1327
     1328    /**
    10871329     * Fetch events from external source
    10881330     *
     
    10901332     * @return array Array with 'events' and 'source' keys
    10911333     */
    1092     private static function fetch_external_events($source) {
     1334    private static function fetch_external_events($source, $include_debug = false) {
     1335        $debug = ['calls' => []];
    10931336        try {
    10941337            $params = [];
     
    11051348            $url = add_query_arg($params, trailingslashit($source['url']) . 'wp-json/event-manager/v1/events');
    11061349
     1350            if ($include_debug) {
     1351                $t0 = microtime(true);
     1352            }
    11071353            $response = wp_remote_get($url, [
    11081354                'timeout' => 15,
    11091355                'sslverify' => true
    11101356            ]);
     1357            if ($include_debug) {
     1358                $events_body_raw = is_wp_error($response) ? '' : wp_remote_retrieve_body($response);
     1359                $debug['calls']['events_fetch'] = [
     1360                    'url' => $url,
     1361                    'duration_ms' => round((microtime(true) - $t0) * 1000),
     1362                    'status' => is_wp_error($response) ? $response->get_error_message() : wp_remote_retrieve_response_code($response),
     1363                    'size_bytes' => strlen($events_body_raw),
     1364                ];
     1365            }
    11111366
    11121367            if (is_wp_error($response)) {
    11131368                error_log('External Events Error: ' . $response->get_error_message());
    1114                 return ['events' => [], 'source' => null];
     1369                return ['events' => [], 'source' => null, '_debug' => $include_debug ? $debug : null];
    11151370            }
    11161371
     
    11201375            $events = isset($data['events']) ? $data['events'] : $data;
    11211376
    1122             if (!is_array($events)) return ['events' => [], 'source' => null];
     1377            if (!is_array($events)) return ['events' => [], 'source' => null, '_debug' => $include_debug ? $debug : null];
    11231378
    11241379            // Fetch service bodies once for this source
    1125             $service_bodies = self::fetch_external_service_bodies($source);
     1380            if ($include_debug) {
     1381                $t0 = microtime(true);
     1382            }
     1383            $sb_result = self::fetch_external_service_bodies($source, $include_debug);
     1384            if ($include_debug) {
     1385                $service_bodies = $sb_result['data'];
     1386                $debug['calls']['service_bodies_fetch'] = [
     1387                    'duration_ms' => round((microtime(true) - $t0) * 1000),
     1388                    'calls' => $sb_result['_debug'],
     1389                ];
     1390            } else {
     1391                $service_bodies = $sb_result;
     1392            }
    11261393
    11271394            // Build source info (with service bodies at source level, not per-event)
     
    11431410            }
    11441411
     1412            if ($include_debug) {
     1413                $debug['event_count'] = count($events);
     1414            }
     1415
    11451416            return [
    11461417                'events' => $events,
    1147                 'source' => $source_info
     1418                'source' => $source_info,
     1419                '_debug' => $include_debug ? $debug : null,
    11481420            ];
    11491421        } catch (\Exception $e) {
    11501422            error_log('External Events Error: ' . $e->getMessage());
    1151             return ['events' => [], 'source' => null];
     1423            return ['events' => [], 'source' => null, '_debug' => $include_debug ? $debug : null];
    11521424        }
    11531425    }
     
    11591431     * @return array
    11601432     */
    1161     private static function fetch_external_service_bodies($source) {
     1433    private static function fetch_external_service_bodies($source, $include_debug = false) {
     1434        $debug = [];
    11621435        try {
    11631436            $settings_url = trailingslashit($source['url']) . 'wp-json/event-manager/v1/settings';
    11641437
     1438            if ($include_debug) {
     1439                $t0 = microtime(true);
     1440            }
    11651441            $settings_response = wp_remote_get($settings_url, [
    11661442                'timeout' => 15,
    11671443                'sslverify' => true
    11681444            ]);
     1445            if ($include_debug) {
     1446                $settings_body_raw = is_wp_error($settings_response) ? '' : wp_remote_retrieve_body($settings_response);
     1447                $debug['settings_fetch'] = [
     1448                    'url' => $settings_url,
     1449                    'duration_ms' => round((microtime(true) - $t0) * 1000),
     1450                    'status' => is_wp_error($settings_response) ? $settings_response->get_error_message() : wp_remote_retrieve_response_code($settings_response),
     1451                    'size_bytes' => strlen($settings_body_raw),
     1452                ];
     1453            }
    11691454
    11701455            if (is_wp_error($settings_response)) {
    1171                 return [];
     1456                return $include_debug ? ['data' => [], '_debug' => $debug] : [];
    11721457            }
    11731458
     
    11761461
    11771462            if (empty($settings['bmlt_root_server'])) {
    1178                 return [];
     1463                return $include_debug ? ['data' => [], '_debug' => $debug] : [];
    11791464            }
    11801465
    11811466            $bmlt_url = add_query_arg('switcher', 'GetServiceBodies', trailingslashit($settings['bmlt_root_server']) . 'client_interface/json/');
    11821467
     1468            if ($include_debug) {
     1469                $t0 = microtime(true);
     1470            }
    11831471            $bmlt_response = wp_remote_get($bmlt_url, [
    11841472                'timeout' => 15,
    11851473                'sslverify' => true
    11861474            ]);
     1475            if ($include_debug) {
     1476                $bmlt_body_raw = is_wp_error($bmlt_response) ? '' : wp_remote_retrieve_body($bmlt_response);
     1477                $debug['bmlt_fetch'] = [
     1478                    'url' => $bmlt_url,
     1479                    'duration_ms' => round((microtime(true) - $t0) * 1000),
     1480                    'status' => is_wp_error($bmlt_response) ? $bmlt_response->get_error_message() : wp_remote_retrieve_response_code($bmlt_response),
     1481                    'size_bytes' => strlen($bmlt_body_raw),
     1482                ];
     1483            }
    11871484
    11881485            if (is_wp_error($bmlt_response)) {
    1189                 return [];
     1486                return $include_debug ? ['data' => [], '_debug' => $debug] : [];
    11901487            }
    11911488
     
    11941491
    11951492            if (!is_array($service_bodies)) {
    1196                 return [];
    1197             }
    1198 
    1199             return $service_bodies;
     1493                return $include_debug ? ['data' => [], '_debug' => $debug] : [];
     1494            }
     1495
     1496            return $include_debug ? ['data' => $service_bodies, '_debug' => $debug] : $service_bodies;
    12001497        } catch (\Exception $e) {
    1201             return [];
     1498            return $include_debug ? ['data' => [], '_debug' => $debug] : [];
    12021499        }
    12031500    }
  • mayo-events-manager/trunk/includes/Rest/SettingsController.php

    r3439987 r3490312  
    3939        $external_sources = get_option('mayo_external_sources', []);
    4040
    41         return new \WP_REST_Response([
     41        $response_data = [
    4242            'bmlt_root_server' => $settings['bmlt_root_server'] ?? '',
    4343            'notification_email' => $settings['notification_email'] ?? '',
     
    4848            'subscription_service_bodies' => $settings['subscription_service_bodies'] ?? [],
    4949            'subscription_new_option_behavior' => $settings['subscription_new_option_behavior'] ?? 'opt_in'
    50         ]);
     50        ];
     51
     52        if (current_user_can('manage_options')) {
     53            $response_data['server_info'] = [
     54                'php_version'    => PHP_VERSION,
     55                'curl_available' => extension_loaded('curl'),
     56                'curl_version'   => extension_loaded('curl') ? curl_version()['version'] : null,
     57            ];
     58        }
     59
     60        return new \WP_REST_Response($response_data);
    5161    }
    5262
  • mayo-events-manager/trunk/mayo-events-manager.php

    r3484175 r3490312  
    44 * Plugin Name: Mayo Events Manager
    55 * Description: A plugin for managing and displaying events.
    6  * Version: 1.8.7
     6 * Version: 1.8.8
    77 * Author: bmlt-enabled
    88 * License: GPLv2 or later
     
    2121}
    2222
    23 define('MAYO_VERSION', '1.8.7');
     23define('MAYO_VERSION', '1.8.8');
    2424
    2525require_once __DIR__ . '/vendor/autoload.php';
  • mayo-events-manager/trunk/package.json

    r3484175 r3490312  
    11{
    22  "name": "mayo",
    3   "version": "1.8.7",
     3  "version": "1.8.8",
    44  "description": "",
    55  "main": "index.js",
  • mayo-events-manager/trunk/readme.txt

    r3484175 r3490312  
    66Requires at least: 6.7
    77Tested up to: 6.9
    8 Stable tag: 1.8.7
     8Stable tag: 1.8.8
    99License: GPLv2 or later
    1010License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    187187
    188188== Changelog ==
     189
     190= 1.8.8 =
     191* Added copy-to-clipboard button for external source IDs in Settings, making IDs easier to select and copy. [#254]
     192* Improved external source layout with ID displayed in a distinct box on its own row.
     193* Added diagnostic timing instrumentation to the events API for debugging slow external source requests. Append `&debug=1` to see per-call timing breakdown.
     194* Improved performance of external source fetching by parallelizing HTTP requests. Sites with multiple external sources will see significantly faster load times.
     195* Changed external source event type dropdown from "Select an event type" to "All Event Types" to clarify that leaving it blank fetches all types.
     196* Added support for comma-separated event types in the REST API (e.g., `event_type=Activity,Service`), enabling a single external source to fetch multiple event types in one request.
     197* Fixed admin events list page taking minutes to load when many events exist by caching service body lookups instead of making an HTTP request per row.
     198* Added server health check warning on settings page when PHP curl extension is missing, which causes significantly slower external source requests.
    189199
    190200= 1.8.7 =
  • mayo-events-manager/trunk/tests/Unit/AdminTest.php

    r3442218 r3490312  
    280280     */
    281281    public function testRenderCustomColumnsOutputsServiceBodyFallback(): void {
     282        // Reset static cache from prior tests
     283        $ref = new \ReflectionProperty(Admin::class, 'service_body_map');
     284        $ref->setAccessible(true);
     285        $ref->setValue(null, null);
     286
    282287        $this->setPostMeta(402, [
    283288            'service_body' => '999'
    284289        ]);
     290
     291        Functions\when('get_transient')->justReturn(false);
     292        Functions\when('set_transient')->justReturn(true);
    285293
    286294        $this->mockWpRemoteGet([
     
    304312        $this->setPostMeta(403, [
    305313            'service_body' => ''
    306         ]);
    307 
    308         $this->mockWpRemoteGet([
    309             'GetServiceBodies' => [
    310                 'code' => 200,
    311                 'body' => []
    312             ]
    313314        ]);
    314315
     
    592593     */
    593594    public function testRenderCustomColumnsOutputsServiceBodyFromBmlt(): void {
     595        // Reset static cache from prior tests
     596        $ref = new \ReflectionProperty(Admin::class, 'service_body_map');
     597        $ref->setAccessible(true);
     598        $ref->setValue(null, null);
     599
    594600        $this->setPostMeta(412, [
    595601            'service_body' => '5'
    596602        ]);
     603
     604        Functions\when('get_transient')->justReturn(false);
     605        Functions\when('set_transient')->justReturn(true);
    597606
    598607        $this->mockWpRemoteGet([
     
    10471056     */
    10481057    public function testRenderCustomColumnsServiceBodyWithBmltError(): void {
     1058        // Reset static cache from prior tests
     1059        $ref = new \ReflectionProperty(Admin::class, 'service_body_map');
     1060        $ref->setAccessible(true);
     1061        $ref->setValue(null, null);
     1062
    10491063        $this->setPostMeta(422, [
    10501064            'service_body' => '123'
    10511065        ]);
     1066
     1067        Functions\when('get_transient')->justReturn(false);
     1068        Functions\when('set_transient')->justReturn(true);
    10521069
    10531070        // wp_remote_get returns WP_Error which is_wp_error() will detect
  • mayo-events-manager/trunk/vendor/composer/installed.php

    r3484175 r3490312  
    22    'root' => array(
    33        'name' => 'bmltenabled/mayo',
    4         'pretty_version' => '1.8.7',
    5         'version' => '1.8.7.0',
    6         'reference' => '282e9adc304c300f0350021dc737d87a7e504733',
     4        'pretty_version' => '1.8.8',
     5        'version' => '1.8.8.0',
     6        'reference' => 'ec0e1a084a5abcee29d12898f7406a09d56e1950',
    77        'type' => 'wordpress-plugin',
    88        'install_path' => __DIR__ . '/../../',
     
    1212    'versions' => array(
    1313        'bmltenabled/mayo' => array(
    14             'pretty_version' => '1.8.7',
    15             'version' => '1.8.7.0',
    16             'reference' => '282e9adc304c300f0350021dc737d87a7e504733',
     14            'pretty_version' => '1.8.8',
     15            'version' => '1.8.8.0',
     16            'reference' => 'ec0e1a084a5abcee29d12898f7406a09d56e1950',
    1717            'type' => 'wordpress-plugin',
    1818            'install_path' => __DIR__ . '/../../',
Note: See TracChangeset for help on using the changeset viewer.