Repository navigation
feat: community calendars with add and submit events - #553
Merged
Merged
Conversation
…t_community_submissions Dashboard nav and the /manage/teams page now read Communities and show one list. The flag only marks a team that accepts event submissions, so it no longer drives grouping or the workspace subtitle. A patch keeps existing values. Buzz Team form: publishing (published, route, slug), description (short description, about) and links each get their own section on the Public Page tab.
Old /manage/teams links redirect to the same path under /manage/communities.
…kspace Clicking a community card covers the main panel with "Opening <name>" and shows skeleton rows in the sidebar until the workspace's events have loaded, for at least one second. The centred shimmer line is shared with Create Event's progress state.
…meline tabs Every community page header ends with a Community Page button on desktop, disabled until the community is published. On a community's events page, Create Event moves next to the Upcoming/Past toggle. The mobile back button now targets the renamed communities route.
A Submissions item in the community workspace lists pending and approved event submissions from other teams. Editors approve, reject or remove them.
A community that accepts submissions shows a Submit event button. Guests are sent to log in; signed-in visitors pick one of their upcoming events in a dialog and submit it for review.
The dialog is being rebuilt in Vue, shared by the dashboard and the public page.
…lic pages A second Vite build mounts dashboard Vue components (frappe-ui included) on Jinja pages. A page loads a small entry script; Vue and the component load on the first click of the island's trigger. frappe-ui's styles stay scoped to the island. `yarn build`, and so `bench build`, runs it. Public pages also get the dashboard's `lucide-*` icon classes, built from frappe-ui's Lucide plugin with only the icons the templates use.
Callers pass a lucide-* name instead of filling the illustration slot with the same Icon markup. The slot stays for richer illustrations.
The community workspace's Events item becomes Calendar, and the Submissions page goes. Pending submissions from other teams sit at the top of the Calendar, each with its date, time, place and submitter, and Approve / Remove. Below them, the Events list keeps its Upcoming / Past tabs, with a create button beside the heading.
A request can now be for an event hosted on another platform, such as Luma or KonfHub. With Is External Event on, the request holds the event's name, host, location (with Google place and coordinates), start and end, and an optional URL, and needs no Buzz Event. The controller checks those fields, since the form's mandatory_depends_on is not enforced on the server. The community's queue takes an external request's date, time, place and host from the request itself, and its card links to the event URL.
…nity calendar - Add a welcome Alert with a solid calendar icon above the community calendar - Retitle the queue "Pending Approval" with a count badge and clearer copy - Make Approve subtle and Remove ghost, and disable one while the other runs - Animate a reviewed row out and slide the rest up - Drop the Create Event button from the Events heading Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The community calendar gets an Add Event menu with three ways in: create a new event, add an existing Buzz event from its link, or add an event hosted on another platform. Create sends the organiser back to the calendar after it saves. The public community page shows the same menu as a Vue island. Its organisers see Add Event and add straight away. Any other signed-in user sees Submit Event and sends the event for review. A guest gets the login dialog. - get_team_events lists a team's own events, plus the Buzz and external events its community approved, each flagged is_community_request and is_external. The dashboard calendar now uses it. - An external event card opens its link in a new tab and shows an External badge. - find_event, add_external_event and submit_external_event are new. submit_external_event is rate limited, since it emails the managers. - An external event needs all of link, name, location, host and dates, and its link must be http or https. - Islands can mount in place of their trigger (data-island-inline), and render toasts. - useCall().submit() does not reject on a server error, so the review and add forms now check .error. A failed action no longer reports success. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
Contributor
|
✅ UI Demo Check — a screenshot or demo is attached. |
Contributor
Backend test coverage: 91%Commit e4c79e4. Test modules are excluded. Coverage by file
89 empty files skipped. |
Frappe's semgrep file-traversal rule blocks a raw open() in app code. The manifest path is a constant, so frappe.utils.get_file_json reads it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A dynamic <component is="button"> resolves to frappe-ui's globally registered Button, so the full-card overlay rendered as a grey 28px pill over the top of every card. Use static <a> and <button> tags instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
TimelineList gets an actions slot after the tabs, and the community calendar fills it with the Add Event menu. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…irst Pending submissions render as one bordered list instead of a stack of cards. Each row shows the event's banner, or a link tile for an external event with an External badge and its domain, and the submitter with how long ago they submitted. Approve and Remove are tinted icon buttons. A Buzz event opens in the event drawer; an external one opens its link. get_requests now returns each request's creation and the event's banner, and lists pending requests newest first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A shared event link with tracking parameters runs past 140 characters, so event_url now holds 500. Name, host and location stay at 140, and the API and the form both refuse longer values instead of failing on the database write. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Pending rows clamp the title to two lines, cap the submitter column and carry the submitter on narrow screens, with full values on hover. - A pending list scrolls in its own box and renders more rows as it scrolls; the calendar loads more events on scroll instead of Show more. - A missing banner falls back to the pattern; tap targets grow on mobile. - The floating button sits above list actions, and for organisers it opens the Add Event menu. - Event cards hyphenate long titles and clamp the venue on mobile. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The floating button sits in a full-width row that lets taps through everywhere but the button. As the menu trigger, that row gives the menu the screen's width, right-aligned with the button. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The full-width mobile menu sizes its icons and labels so each row is as tall as the large button that opens it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
The page is called Calendar, so its route is too. Old /events links redirect to it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
The submitter now gets an email when their event reaches a community, saying the organizers will review it and they will hear back. The community emails also show what was submitted: the event header for a Buzz event, a details card with the link for an external one. The organizers' email gets a Review submission button, and each email says why the reader received it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A submitter's reply reaches the community: its support email, else its owner. An organizer's reply to a new submission reaches the submitter. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
They have no inbox, so a community managed by Administrator, or a request it submitted, only produced failed emails. The sender drops them from recipients and reply-to, and skips the email when nobody is left. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… drawer Rejecting a submission opens a dialog for an optional reason, which goes to the submitter in the rejection email. The event drawer of a pending Buzz event gets Reject and Approve buttons at its foot. The row and the drawer share one review composable; the row's Remove is now Reject, which is what it does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Teams become communities. Each community gets a calendar of its own events plus the events it features, and organisers review what others submit.
is_a_community→accept_community_submissions, URLs move to/manage/communities./manage/communities/:id/calendar(old/eventslinks redirect). Lists own + approved Buzz and external events (teams.get_team_events). Pending submissions show above it as a compact list, newest first, with Approve / Reject. Reject asks for an optional reason, which goes into the email. A Buzz event opens in the event drawer, with Reject and Approve at its foot; an external one opens its link. Long lists load more on scroll.Screenshots
Testing
buzz.api.communities.test_communities: 29 tests pass.Follow-up: #552 (login dialog as an island instead of an iframe).