Skip to content

Commit

Permalink
feat: support language filter
Browse files Browse the repository at this point in the history
Signed-off-by: Dup4 <lyuzhi.pan@gmail.com>
  • Loading branch information
Dup4 committed Nov 2, 2023
1 parent d57ade5 commit b547db4
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 1 deletion.
2 changes: 2 additions & 0 deletions packages/apps/board/src/components/board/Board.vue
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,8 @@ const widthClass = "sm:w-[1260px] xl:w-screen";
:enable-filter="{
organization: true,
team: true,
language: true,
status: true,
}"
/>
</div>
Expand Down
2 changes: 2 additions & 0 deletions packages/apps/board/src/components/board/ProblemInfoModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ const types = [TYPE_SUBMISSIONS, TYPE_STATISTICS, TYPE_AWARDS];
:enable-filter="{
organization: true,
team: true,
language: true,
status: true,
}"
/>
</div>
Expand Down
48 changes: 47 additions & 1 deletion packages/apps/board/src/components/board/SubmissionsTable.vue
Original file line number Diff line number Diff line change
Expand Up @@ -90,12 +90,37 @@ function teamsOnSelect(selectedItems: Array<SelectOptionItem>, lastSelectItem: S
teamsLastSelectItem.value = lastSelectItem;
}
const languageOptions = computed(() => {
const languages = rank.value.languages;
const res = languages.map((l) => {
return {
value: l,
text: l,
};
});
return res;
});
const languageSelectedItems = ref<Array<SelectOptionItem>>([]);
const languageLastSelectItem = ref({});
function languageOnSelect(selectedItems: Array<SelectOptionItem>, lastSelectItem: SelectOptionItem) {
languageSelectedItems.value = selectedItems;
languageLastSelectItem.value = lastSelectItem;
}
const submissions = computed(() => {
const ss = props.submissions;
return ss.filter((s) => {
const o = filterOptions.value;
if (o.orgNames.length === 0 && o.teamIds.length === 0) {
if (o.orgNames.length === 0
&& o.teamIds.length === 0
&& o.languages.length === 0
&& o.statuses.length === 0
) {
return true;
}
Expand All @@ -116,6 +141,14 @@ const submissions = computed(() => {
}
}
if (o.languages.length > 0) {
for (const l of o.languages) {
if (s.language === l) {
return true;
}
}
}
return false;
}).sort(Submission.compare).reverse();
});
Expand All @@ -130,6 +163,7 @@ function onFilter() {
newFilterOptions.orgNames = orgSelectedItems.value.map(o => o.value);
newFilterOptions.teamIds = teamsSelectedItems.value.map(t => t.value);
newFilterOptions.languages = languageSelectedItems.value.map(l => l.value);
filterOptions.value = newFilterOptions;
}
Expand Down Expand Up @@ -233,6 +267,18 @@ function getProblemLabelColorStyle(s: Submission) {
/>
</div>
<div
v-if="enableFilter?.language && languageOptions.length > 0"
w-48
>
<MultiSelect
:options="languageOptions"
:selected-options="languageSelectedItems"
placeholder="Language"
@select="languageOnSelect"
/>
</div>
<div
v-if="enableFilterButton"
>
Expand Down
27 changes: 27 additions & 0 deletions packages/libs/core/src/rank.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import _ from "lodash";

import type { SubmissionStatus } from "@xcpcio/types";

import type { Contest } from "./contest";
import type { Teams } from "./team";
import { Team } from "./team";
Expand Down Expand Up @@ -129,6 +131,9 @@ export class Rank {

balloons: Balloons;

languages: Array<string>;
statuses: Array<SubmissionStatus>;

constructor(contest: Contest, teams: Teams, submissions: Submissions) {
this.contest = contest;

Expand Down Expand Up @@ -162,6 +167,28 @@ export class Rank {
this.options = new RankOptions();

this.balloons = [];

{
const se = new Set<string>();

this.submissions.forEach((s) => {
if (s.language) {
se.add(s.language);
}
});

this.languages = [...se].sort();
}

{
const se = new Set<SubmissionStatus>();

this.submissions.forEach((s) => {
se.add(s.status);
});

this.statuses = [...se];
}
}

cleanRank() {
Expand Down

0 comments on commit b547db4

Please sign in to comment.