FEATURE: support upcomingDays parameter on the upcoming events list (#524)

Adds a before parameter to the events endpoint and uses it through a upcomingDays parameter to the upcoming events list component – which can be used when adding it to the right sidebar blocks theme component.
This commit is contained in:
Renato Atilio 2024-01-17 21:54:39 -03:00 committed by GitHub
parent b6c03863a2
commit b622e0f200
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 81 additions and 9 deletions

View File

@ -119,7 +119,14 @@ module DiscoursePostEvent
private private
def filtered_events_params def filtered_events_params
params.permit(:post_id, :category_id, :include_subcategories, :include_expired, :limit) params.permit(
:post_id,
:category_id,
:include_subcategories,
:include_expired,
:limit,
:before,
)
end end
end end
end end

View File

@ -13,6 +13,7 @@ import { isNotFullDayEvent } from "../lib/guess-best-date-format";
export const DEFAULT_MONTH_FORMAT = "MMMM YYYY"; export const DEFAULT_MONTH_FORMAT = "MMMM YYYY";
export const DEFAULT_DATE_FORMAT = "dddd, MMM D"; export const DEFAULT_DATE_FORMAT = "dddd, MMM D";
export const DEFAULT_TIME_FORMAT = "LT"; export const DEFAULT_TIME_FORMAT = "LT";
const DEFAULT_UPCOMING_DAYS = 180;
const DEFAULT_COUNT = 8; const DEFAULT_COUNT = 8;
export default class UpcomingEventsList extends Component { export default class UpcomingEventsList extends Component {
@ -28,6 +29,7 @@ export default class UpcomingEventsList extends Component {
dateFormat = this.args.params?.dateFormat ?? DEFAULT_DATE_FORMAT; dateFormat = this.args.params?.dateFormat ?? DEFAULT_DATE_FORMAT;
timeFormat = this.args.params?.timeFormat ?? DEFAULT_TIME_FORMAT; timeFormat = this.args.params?.timeFormat ?? DEFAULT_TIME_FORMAT;
count = this.args.params?.count ?? DEFAULT_COUNT; count = this.args.params?.count ?? DEFAULT_COUNT;
upcomingDays = this.args.params?.upcomingDays ?? DEFAULT_UPCOMING_DAYS;
title = I18n.t( title = I18n.t(
"discourse_calendar.discourse_post_event.upcoming_events_list.title" "discourse_calendar.discourse_post_event.upcoming_events_list.title"
@ -48,7 +50,7 @@ export default class UpcomingEventsList extends Component {
constructor() { constructor() {
super(...arguments); super(...arguments);
this.appEvents.on("page:changed", this, this.updateEventsByMonth); this.appEvents.on("page:changed", this, this.updateEventsList);
} }
get shouldRender() { get shouldRender() {
@ -75,13 +77,17 @@ export default class UpcomingEventsList extends Component {
} }
@action @action
async updateEventsByMonth() { async updateEventsList() {
this.isLoading = true; this.isLoading = true;
this.hasError = false; this.hasError = false;
try { try {
const { events } = await ajax("/discourse-post-event/events", { const { events } = await ajax("/discourse-post-event/events", {
data: { category_id: this.categoryId, limit: this.count }, data: {
category_id: this.categoryId,
limit: this.count,
before: moment().add(this.upcomingDays, "days").toISOString(),
},
}); });
this.eventsByMonth = this.groupByMonthAndDay(events); this.eventsByMonth = this.groupByMonthAndDay(events);
@ -148,7 +154,7 @@ export default class UpcomingEventsList extends Component {
{{this.errorMessage}} {{this.errorMessage}}
</div> </div>
<DButton <DButton
@action={{this.updateEventsByMonth}} @action={{this.updateEventsList}}
@label="discourse_calendar.discourse_post_event.upcoming_events_list.try_again" @label="discourse_calendar.discourse_post_event.upcoming_events_list.try_again"
class="btn-link upcoming-events-list__try-again" class="btn-link upcoming-events-list__try-again"
/> />

View File

@ -33,6 +33,10 @@ module DiscoursePostEvent
events = events.where(id: Array(params[:post_id])) if params[:post_id] events = events.where(id: Array(params[:post_id])) if params[:post_id]
if params[:before].present?
events = events.where("dcped.starts_at < ?", params[:before].to_datetime)
end
if params[:category_id].present? if params[:category_id].present?
if params[:include_subcategories].present? if params[:include_subcategories].present?
events = events =

View File

@ -182,5 +182,17 @@ describe DiscoursePostEvent::EventFinder do
expect(finder.search(current_user, { limit: 2 })).to match_array([event1, event2]) expect(finder.search(current_user, { limit: 2 })).to match_array([event1, event2])
end end
end end
describe "with a before parameter provided" do
let!(:event1) { Fabricate(:event) }
let!(:event2) { Fabricate(:event) }
let!(:event3) { Fabricate(:event, original_starts_at: 2.hours.ago) }
it "returns the events started before the provided value" do
expect(finder.search(current_user, { before: event2.starts_at.to_s })).to match_array(
[event3],
)
end
end
end end
end end

View File

@ -298,6 +298,15 @@ module DiscoursePostEvent
expect(events.length).to eq(1) expect(events.length).to eq(1)
expect(events[0]["id"]).to eq(event_1.id) expect(events[0]["id"]).to eq(event_1.id)
end end
it "filters events before the provided datetime if before param provided" do
get "/discourse-post-event/events.json?category_id=#{category.id}&include_subcategories=true&include_expired=true&before=#{event_2.starts_at}"
expect(response.status).to eq(200)
events = response.parsed_body["events"]
expect(events.length).to eq(1)
expect(events[0]["id"]).to eq(event_3.id)
end
end end
end end
end end

View File

@ -293,10 +293,36 @@ module("Integration | Component | upcoming-events-list", function (hooks) {
"it displays the event name" "it displays the event name"
); );
}); });
test("with events, overridden upcomingDays parameter", async function (assert) {
pretender.get("/discourse-post-event/events", twoEventsResponseHandler);
await render(<template>
<UpcomingEventsList @params={{hash upcomingDays=1}} />
</template>);
this.appEvents.trigger("page:changed", { url: "/" });
await waitFor(".loading-container .spinner", { count: 0 });
assert.strictEqual(
queryAll(".upcoming-events-list__event").length,
1,
"it limits the results to started_at before the provided parameter"
);
assert.deepEqual(
[...queryAll(".upcoming-events-list__event-name")].map(
(el) => el.innerText
),
["Awesome Event"],
"it displays the event name"
);
});
}); });
function twoEventsResponseHandler({ queryParams }) { function twoEventsResponseHandler({ queryParams }) {
const events = [ let events = [
{ {
id: 67501, id: 67501,
starts_at: tomorrowAllDay, starts_at: tomorrowAllDay,
@ -333,7 +359,15 @@ function twoEventsResponseHandler({ queryParams }) {
}, },
]; ];
return response({ if (queryParams.limit) {
events: queryParams.limit ? events.slice(0, queryParams.limit) : events, events.splice(queryParams.limit);
}
if (queryParams.before) {
events = events.filter((event) => {
return moment(event.starts_at).isBefore(queryParams.before);
}); });
}
return response({ events });
} }