Skip to content
This repository has been archived by the owner on Feb 5, 2024. It is now read-only.

[WIP]Contest page #26

Merged
merged 81 commits into from
May 14, 2018
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
eac4e5f
とりあえず見た目だけ作った
Fukusan64 Apr 20, 2018
9f0c5db
いらないスタイルまわりを消した
Fukusan64 Apr 20, 2018
2e2c88d
問題描画部分を分離
Fukusan64 Apr 20, 2018
0ab3801
インデントを揃えた
Fukusan64 Apr 20, 2018
0994fb1
Merge branch 'master' of https://github.com/gedorinku/koneko-client i…
Fukusan64 Apr 20, 2018
05ee223
contestのurlを再設定
Fukusan64 Apr 21, 2018
0a6567c
詳細を開閉できるようにした
Fukusan64 Apr 21, 2018
85e0526
タブが(表示だけ)動くようにした
Fukusan64 Apr 21, 2018
adae3c8
消してなかったhrefが見つかった()
Fukusan64 Apr 21, 2018
21f36ba
ちょっとリファクタリング
Fukusan64 Apr 21, 2018
25f010b
ボタンじゃないかなって思ったので変更
Fukusan64 Apr 21, 2018
306e0f8
hashみてタブを最初から開くようにした
Fukusan64 Apr 21, 2018
4ea27a7
Merge branch 'master' of https://github.com/gedorinku/koneko-client i…
Fukusan64 Apr 22, 2018
a49b0b3
contestsModuleを追加
Fukusan64 Apr 27, 2018
267e6e1
contestの情報を取得するようにした
Fukusan64 Apr 29, 2018
e8f5765
forEachをmapに変更
Fukusan64 Apr 29, 2018
e3cda6e
IQ、WJを表示するようにした、スピナーは消した
Fukusan64 Apr 29, 2018
f47ddac
名前が変な気がした
Fukusan64 Apr 30, 2018
bd7b8cd
Merge branch 'master' of https://github.com/gedorinku/koneko-client i…
Fukusan64 May 3, 2018
dca2d8c
いつの間にか壊れてたから直した
Fukusan64 May 3, 2018
579a3db
statusesの監視を実装したつもり
Fukusan64 May 3, 2018
81292fc
監視している状態でコンテストを開くと状態が即座には更新されなさそうなので追記
Fukusan64 May 3, 2018
eaaed12
初期値はどっちでもいいことに気づいたので安全そうな方にした
Fukusan64 May 3, 2018
01f4ca9
待たなくていいので待たない
Fukusan64 May 3, 2018
9d86645
小さくしたときに壊れるところを適当に直した(あんまりちいさくするとスタイル崩壊するのは変わってない)
Fukusan64 May 4, 2018
0f4c224
応急処置
Fukusan64 May 4, 2018
cc1222f
作問者の名前を出すようにした
Fukusan64 May 4, 2018
745d721
とりあえずモーダルが出せるようになった(中身は未実装)
Fukusan64 May 4, 2018
9879168
Merge branch 'master' of https://github.com/gedorinku/koneko-client i…
Fukusan64 May 4, 2018
fd81aae
momentがすごそうだったのでつかった
Fukusan64 May 4, 2018
9c214d6
Merge branch 'master' of https://github.com/gedorinku/koneko-client i…
Fukusan64 May 6, 2018
83e3ce1
問題表示部分の実装を取り込んだ
Fukusan64 May 6, 2018
f4e72c3
エラー表示
Fukusan64 May 6, 2018
8fec1c2
Merge branch 'master' of https://github.com/gedorinku/koneko-client i…
Fukusan64 May 6, 2018
ba13917
modalコンポーネントをつくって再利用するようにした
Fukusan64 May 6, 2018
2dce9fc
問題が閲覧できないとき問題表示関連のものが見えないようにした
Fukusan64 May 6, 2018
56bcd74
参加者保存してなかった(汗)
Fukusan64 May 6, 2018
c95d130
ログイン確認のためにgetSelfしたときにサーバーと端末の時刻のズレを保存するようにした
Fukusan64 May 7, 2018
e255d74
問題が出ないときの表示をちょっと作った
Fukusan64 May 7, 2018
709642d
カウントダウンするやつ作った
Fukusan64 May 7, 2018
b1b70b7
怒られてたので修正
Fukusan64 May 7, 2018
468eeea
開催中はコンテスト開催中と出すようにした
Fukusan64 May 7, 2018
01516c8
問題の下に奴らがいたので消えるようにした
Fukusan64 May 7, 2018
f35d187
日付3桁もいらんやろ2桁にした
Fukusan64 May 8, 2018
fa82c79
fix typo
Fukusan64 May 8, 2018
09bb448
参加者情報を所得できるようにした
Fukusan64 May 8, 2018
bb289e7
参加者を表示するようにした
Fukusan64 May 8, 2018
7b87bf1
ユーザー情報を保存すうるようにした
Fukusan64 May 9, 2018
af884e8
数字は避けておこうと思った
Fukusan64 May 9, 2018
69f34d2
コンテスト参加を実装
Fukusan64 May 9, 2018
efa2ffb
念の為コンテスト終了後にタイマーが変な表示をする問題を修正
Fukusan64 May 9, 2018
c92407a
提出一覧と順位ボタンが押せないときにdisabledになるようにした
Fukusan64 May 9, 2018
65f7e3e
怒られたので修正
Fukusan64 May 9, 2018
9d42bc5
Merge branch 'master' of https://github.com/gedorinku/koneko-client i…
Fukusan64 May 9, 2018
21a8121
何回も送信されると怖いのでonceを追加
Fukusan64 May 10, 2018
4d867be
writerは参加ボタンが出ないようにした(logはデバック用なのでenterに戻した)
Fukusan64 May 10, 2018
4bf1e90
コンテスト開始時に自動更新するようにした
Fukusan64 May 10, 2018
976ee5c
nullへの対応が甘かった部分を修正
Fukusan64 May 10, 2018
887f321
コンテスト開始時にコンテストすべてを読み込んでいたので問題のみに変更
Fukusan64 May 10, 2018
c7e0fb4
参加ボタン表示の条件に参加済みであるかを追加
Fukusan64 May 10, 2018
b076ad3
diffの初期値が謎の値すぎるのでとりあえず5分にした
Fukusan64 May 10, 2018
553736f
Merge branch 'master' of https://github.com/gedorinku/koneko-client i…
Fukusan64 May 10, 2018
8d9b796
存在しないコンテストを開かれたとき404に飛ばすようにした
Fukusan64 May 10, 2018
a90d0b8
リンターに怒られてたので修正
Fukusan64 May 10, 2018
aacf064
終了後のコンテストで参加ボタンが出てしまっていたので修正
Fukusan64 May 10, 2018
f3dcd33
Merge branch 'master' of https://github.com/gedorinku/koneko-client i…
Fukusan64 May 11, 2018
aacaee4
モーダルに横幅を大きくするオプションを追加
Fukusan64 May 11, 2018
4afbcc3
怒られていたので修正
Fukusan64 May 13, 2018
7cb053e
tableの見た目を作ったheader固定は一旦諦めた
Fukusan64 May 13, 2018
b94dc77
提出済みの問題があるとき、コンテストを開くとタグの表示が変になっていたので修正
Fukusan64 May 13, 2018
ccf43e1
vuejsのバグを踏んでいたのでonceを一旦消す
Fukusan64 May 13, 2018
c4bb549
順位の表示を実装(バグありそうなので注意)
Fukusan64 May 13, 2018
d616fa5
覚書を追加
Fukusan64 May 13, 2018
eb4970f
WA数表示とACした問題の背景色の変更を実装
Fukusan64 May 13, 2018
63cb15a
テーブルのセルの幅を固めた
Fukusan64 May 14, 2018
6c3bd9a
順位表にACした時刻を表示するようにした
Fukusan64 May 14, 2018
d391e51
WA数の表示を変更、AC時間の表示を時刻からコンテスト開始からの経過時間に変更
Fukusan64 May 14, 2018
59f09fc
console.log書きっぱなしだった
Fukusan64 May 14, 2018
c9d7b96
デバッグのままだった()
Fukusan64 May 14, 2018
deef8df
WA数が0のときWA数表示をしないようにした
Fukusan64 May 14, 2018
42394ce
Merge branch 'master' into contest-page
gedorinku May 14, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/api/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ export default {
const res = await axios.get(`${API_ENDPOINT}/contests/${contestID}/statuses`, getConfig(sessionID));
return res;
},
async getContestStandings(sessionID, contestID) {
const res = await axios.get(`${API_ENDPOINT}/contests/${contestID}/standings`, getConfig(sessionID));
return res;
},
async enterContest(sessionID, contestID) {
const res = await axios.post(`${API_ENDPOINT}/contests/${contestID}/enter`, {}, getConfig(sessionID));
return res;
Expand Down
8 changes: 7 additions & 1 deletion src/components/common/Modal.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<template>
<div class="modal" :class="{ 'is-active': isActive }">
<div class="modal-background" @click="$emit('close')"></div>
<div class="modal-card">
<div class="modal-card" :class="{wide: isWide}">
<header class="modal-card-head">
<p class="modal-card-title">{{title}}</p>
<button class="delete" aria-label="close" @click="$emit('close')"></button>
Expand All @@ -20,6 +20,12 @@ export default {
props: {
title: String,
isActive: Boolean,
isWide: Boolean,
},
};
</script>
<style scoped>
.wide{
width: 90%;
}
</style>
67 changes: 57 additions & 10 deletions src/components/contest/Contest.vue
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
</div>
<div class="navbar-end">
<span v-if="canEnter && !isEntered && problems === null" class="navbar-item">
<button @click.once="enter()" class="button is-large is-outlined">
<button @click="enter" class="button is-large is-outlined">
コンテストに参加する
</button>
</span>
Expand All @@ -33,7 +33,7 @@
提出一覧
</button>
<button
@click="showRanking"
@click="showStandings"
class="button is-outlined"
:disabled="problems === null || problems.length === 0"
>
Expand Down Expand Up @@ -82,8 +82,44 @@
<div class="column">
<Problem :problem="problems[activeTab]"/>
</div>
<Modal :isActive="showRankingModal" @close="showRankingModal = false" title="順位">
<h1>aaa</h1>
<Modal
:isActive="showStandingsModal"
@close="showStandingsModal = false"
isWide
title="順位"
>
<table class="table is-fullwidth fixed-table">
<thead>
<tr>
<th>順位</th>
<th>名前</th>
<th v-for="(_, i) in problems" :key="i">
{{num2alpha(i).toUpperCase()}}
</th>
<th>合計</th>
</tr>
</thead>
<tbody>
<tr v-for="(column, i) in standings" :key="i">
<td>{{i + 1}}</td>
<td>{{column.displayName}}</td>
<td
v-for="(detail, j) in column.details"
:key="j"
v-if="detail"
:class="{'is-success': detail.accepted}"
>
{{detail.point}}<br>
<template v-if="detail.accepted">
{{formatDate(detail.updatedAt, 'HH:mm:ss')}}<br>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

表示するのはコンテストが始まってからの時間の方がわかりやすくないですか?
こんな感じ↓
https://arc097.contest.atcoder.jp/standings

</template>
{{detail.wrongCount}} WA
</td>
<td v-else>-</td>
<td>{{column.totalPoint}}</td>
</tr>
</tbody>
</table>
</Modal>
<Modal :isActive="showSubmitListModal" @close="showSubmitListModal = false" title="提出一覧">
<h1>bbb</h1>
Expand Down Expand Up @@ -136,7 +172,7 @@ export default {
data() {
return {
showDescription: false,
showRankingModal: false,
showStandingsModal: false,
showSubmitListModal: false,
activeTab: 0,
diff: 300000,
Expand All @@ -152,6 +188,7 @@ export default {
'endAt',
'writers',
'problems',
'standings',
'participants',
'id',
'error',
Expand Down Expand Up @@ -180,11 +217,16 @@ export default {
const intervalId = setInterval(() => {
const serverTime = moment().add(this.timeDiff);
this.diff = moment(this.startAt).diff(serverTime);
if (this.problems !== null) {
clearInterval(intervalId);
return false;
}
if (this.diff <= 0 && this.isEntered) {
this.getProblems();
clearInterval(intervalId);
return false;
}
if (this.problems !== null) clearInterval(intervalId);
return false;
}, 1000);
},
beforeDestroy() {
Expand All @@ -196,6 +238,7 @@ export default {
'statusesWatcher',
'updateContest',
'getProblems',
'getStandings',
'enter',
]),
...mapMutations('koneko/contests', [
Expand All @@ -207,16 +250,17 @@ export default {
showSubmitList() {
this.showSubmitListModal = true;
},
showRanking() {
this.showRankingModal = true;
showStandings() {
this.showStandingsModal = true;
this.getStandings();
},
num2alpha(num) {
return String.fromCharCode(97 + num);
},
formatDate(date) {
formatDate(date, format) {
return moment(date)
.locale('ja')
.format('YYYY/MM/DD(ddd) HH:mm')
.format(format || 'YYYY/MM/DD(ddd) HH:mm')
;
},
},
Expand Down Expand Up @@ -251,4 +295,7 @@ export default {
.margin-bottom{
margin-bottom: 20px;
}
.fixed-table{
table-layout: fixed;
}
</style>
31 changes: 31 additions & 0 deletions src/store/modules/contests.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export default {
writers: [],
problems: null,
participants: [],
standings: [],
statusesWatcherFlag: false,
requiredWatching: false,
isWaitingJudge: false,
Expand Down Expand Up @@ -58,6 +59,9 @@ export default {
setProblems(state, problems) {
state.problems = problems.map(v => ({ ...v, status: -1 }));
},
setStandings(state, standings) {
state.standings = standings;
},
setStatuses(state, statuses) {
statuses.forEach((statusElem) => {
for (let i = 0; i < state.problems.length; i += 1) {
Expand Down Expand Up @@ -134,5 +138,32 @@ export default {
commit('setError', e);
}
},
async getStandings({ commit, rootState, state }) {
const getDetailsArray = (details, problemsMap, length) => {
const detailsArray = [];
detailsArray.length = length;
detailsArray.fill(null);
details.forEach((v) => {
detailsArray[problemsMap.get(v.problemID)] = v;
});
return detailsArray;
};
try {
const users = (await api.getUsers(rootState.koneko.sessionID)).data;
// dispatch('koneko/users/fetchUsers', null, { root: true })にしたらエラーハンドリングどうするって思ったから
const usersMap = new Map(users.map(v => [v.id, v.displayName]));
const problemsMap = new Map(state.problems.map((v, index) => [v.id, index]));
const standings = (await api.getContestStandings(rootState.koneko.sessionID, state.id)).data
.map(v => ({
totalPoint: v.point,
displayName: usersMap.get(v.userID),
details: getDetailsArray(v.details, problemsMap, state.problems.length),
}))
;
commit('setStandings', standings);
} catch (e) {
commit('setError', e);
}
},
},
};