mirror of
https://github.com/ae-utbm/sith.git
synced 2025-08-02 15:19:55 +00:00
Move ts files at the wrong place in com module
This commit is contained in:
@@ -1,81 +0,0 @@
|
||||
import { exportToHtml } from "#core:utils/globals";
|
||||
import { newsDeleteNews, newsFetchNewsDates, newsPublishNews } from "#openapi";
|
||||
|
||||
// This will be used in jinja templates,
|
||||
// so we cannot use real enums as those are purely an abstraction of Typescript
|
||||
const AlertState = {
|
||||
// biome-ignore lint/style/useNamingConvention: this feels more like an enum
|
||||
PENDING: 1,
|
||||
// biome-ignore lint/style/useNamingConvention: this feels more like an enum
|
||||
PUBLISHED: 2,
|
||||
// biome-ignore lint/style/useNamingConvention: this feels more like an enum
|
||||
DELETED: 3,
|
||||
// biome-ignore lint/style/useNamingConvention: this feels more like an enum
|
||||
DISPLAYED: 4, // When published at page generation
|
||||
};
|
||||
exportToHtml("AlertState", AlertState);
|
||||
|
||||
document.addEventListener("alpine:init", () => {
|
||||
Alpine.data("moderationAlert", (newsId: number) => ({
|
||||
state: AlertState.PENDING,
|
||||
newsId: newsId as number,
|
||||
loading: false,
|
||||
|
||||
async publishNews() {
|
||||
this.loading = true;
|
||||
// biome-ignore lint/style/useNamingConvention: api is snake case
|
||||
await newsPublishNews({ path: { news_id: this.newsId } });
|
||||
this.state = AlertState.PUBLISHED;
|
||||
this.$dispatch("news-moderated", { newsId: this.newsId, state: this.state });
|
||||
this.loading = false;
|
||||
},
|
||||
|
||||
async deleteNews() {
|
||||
this.loading = true;
|
||||
// biome-ignore lint/style/useNamingConvention: api is snake case
|
||||
await newsDeleteNews({ path: { news_id: this.newsId } });
|
||||
this.state = AlertState.DELETED;
|
||||
this.$dispatch("news-moderated", { newsId: this.newsId, state: this.state });
|
||||
this.loading = false;
|
||||
},
|
||||
|
||||
/**
|
||||
* Event receiver for when news dates are moderated.
|
||||
*
|
||||
* If the moderated date is linked to the same news
|
||||
* as the one this moderation alert is attached to,
|
||||
* then set the alert state to the same as the moderated one.
|
||||
*/
|
||||
dispatchModeration(event: CustomEvent) {
|
||||
if (event.detail.newsId === this.newsId) {
|
||||
this.state = event.detail.state;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Query the server to know the number of news dates that would be moderated
|
||||
* if this one is moderated.
|
||||
*/
|
||||
async nbToPublish(): Promise<number> {
|
||||
// What we want here is the count attribute of the response.
|
||||
// We don't care about the actual results,
|
||||
// so we ask for the minimum page size possible.
|
||||
const response = await newsFetchNewsDates({
|
||||
// biome-ignore lint/style/useNamingConvention: api is snake-case
|
||||
query: { news_id: this.newsId, page: 1, page_size: 1 },
|
||||
});
|
||||
return response.data.count;
|
||||
},
|
||||
|
||||
weeklyEventWarningMessage(nbEvents: number): string {
|
||||
return interpolate(
|
||||
gettext(
|
||||
"This event will take place every week for %s weeks. " +
|
||||
"If you publish or delete this event, " +
|
||||
"it will also be published (or deleted) for the following weeks.",
|
||||
),
|
||||
[nbEvents],
|
||||
);
|
||||
},
|
||||
}));
|
||||
});
|
@@ -1,71 +0,0 @@
|
||||
import { type NewsDateSchema, newsFetchNewsDates } from "#openapi";
|
||||
|
||||
interface ParsedNewsDateSchema extends Omit<NewsDateSchema, "start_date" | "end_date"> {
|
||||
// biome-ignore lint/style/useNamingConvention: api is snake_case
|
||||
start_date: Date;
|
||||
// biome-ignore lint/style/useNamingConvention: api is snake_case
|
||||
end_date: Date;
|
||||
}
|
||||
|
||||
document.addEventListener("alpine:init", () => {
|
||||
Alpine.data("upcomingNewsLoader", (startDate: Date, locale: string) => ({
|
||||
startDate: startDate,
|
||||
currentPage: 1,
|
||||
pageSize: 6,
|
||||
hasNext: true,
|
||||
loading: false,
|
||||
newsDates: [] as NewsDateSchema[],
|
||||
dateFormat: new Intl.DateTimeFormat(locale, {
|
||||
dateStyle: "medium",
|
||||
timeStyle: "short",
|
||||
}),
|
||||
|
||||
async loadMore() {
|
||||
this.loading = true;
|
||||
const response = await newsFetchNewsDates({
|
||||
query: {
|
||||
after: this.startDate.toISOString(),
|
||||
// biome-ignore lint/style/useNamingConvention: api is snake_case
|
||||
text_format: "html",
|
||||
page: this.currentPage,
|
||||
// biome-ignore lint/style/useNamingConvention: api is snake_case
|
||||
page_size: this.pageSize,
|
||||
},
|
||||
});
|
||||
if (response.response.status === 404) {
|
||||
this.hasNext = false;
|
||||
} else if (response.data.next === null) {
|
||||
this.newsDates.push(...response.data.results);
|
||||
this.hasNext = false;
|
||||
} else {
|
||||
this.newsDates.push(...response.data.results);
|
||||
this.currentPage += 1;
|
||||
}
|
||||
this.loading = false;
|
||||
},
|
||||
|
||||
groupedDates(): Record<string, NewsDateSchema[]> {
|
||||
return this.newsDates
|
||||
.map(
|
||||
(date: NewsDateSchema): ParsedNewsDateSchema => ({
|
||||
...date,
|
||||
// biome-ignore lint/style/useNamingConvention: api is snake_case
|
||||
start_date: new Date(date.start_date),
|
||||
// biome-ignore lint/style/useNamingConvention: api is snake_case
|
||||
end_date: new Date(date.end_date),
|
||||
}),
|
||||
)
|
||||
.reduce(
|
||||
(acc: Record<string, ParsedNewsDateSchema[]>, date: ParsedNewsDateSchema) => {
|
||||
const key = date.start_date.toDateString();
|
||||
if (!acc[key]) {
|
||||
acc[key] = [];
|
||||
}
|
||||
acc[key].push(date);
|
||||
return acc;
|
||||
},
|
||||
{},
|
||||
);
|
||||
},
|
||||
}));
|
||||
});
|
Reference in New Issue
Block a user