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:
parent
b6c03863a2
commit
b622e0f200
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -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 =
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 });
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue