Merge branch 'master' into 'translations'
# Conflicts: # view-webapp/src/main/webapp/WEB-INF/translations/kr
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.jeudego.pairgoth</groupId>
|
||||
<artifactId>engine-parent</artifactId>
|
||||
<version>0.14</version>
|
||||
<version>0.15</version>
|
||||
</parent>
|
||||
<artifactId>view-webapp</artifactId>
|
||||
|
||||
|
@@ -2,6 +2,7 @@ package org.jeudego.pairgoth.view
|
||||
|
||||
import com.republicate.kson.Json
|
||||
import org.jeudego.pairgoth.ratings.RatingsManager
|
||||
import org.jeudego.pairgoth.web.WebappManager
|
||||
import java.nio.file.Files
|
||||
import java.nio.file.Path
|
||||
import java.nio.file.Paths
|
||||
@@ -26,6 +27,7 @@ class PairgothTool {
|
||||
"RATING" to "Rating",
|
||||
"NBW" to "Number of wins", // Number win
|
||||
"MMS" to "Mac Mahon score", // Macmahon score
|
||||
"SCOREX" to "Score X", // Score X
|
||||
// TODO "STS" to "Strasbourg score", // Strasbourg score
|
||||
// TODO "CPS" to "Cup score", // Cup score
|
||||
|
||||
@@ -74,6 +76,11 @@ class PairgothTool {
|
||||
}
|
||||
}
|
||||
|
||||
fun getMmsPlayersMap(pairables: Collection<Json.Object>) =
|
||||
pairables.associate { part ->
|
||||
Pair(part.getLong("id"), part.getDouble("MMS")?.toLong())
|
||||
}
|
||||
|
||||
fun removeBye(games: Collection<Json.Object>) =
|
||||
games.filter {
|
||||
it.getInt("b")!! != 0 && it.getInt("w")!! != 0
|
||||
@@ -104,4 +111,8 @@ class PairgothTool {
|
||||
}.toSet()
|
||||
return players.filter { p -> !teamed.contains(p.getLong("id")) }
|
||||
}
|
||||
|
||||
// EGF ratings
|
||||
fun displayRatings(ratings: String, country: String): Boolean = WebappManager.properties.getProperty("ratings.${ratings}.enable")?.toBoolean() ?: (ratings.lowercase() != "ffg") || country.lowercase() == "fr"
|
||||
fun showRatings(ratings: String, country: String): Boolean = WebappManager.properties.getProperty("ratings.${ratings}.enable")?.toBoolean() ?: (ratings.lowercase() != "ffg") || country.lowercase() == "fr"
|
||||
}
|
@@ -281,8 +281,13 @@
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
.ui.striped.table>tbody>tr:nth-child(2n),.ui.striped.table>tr:nth-child(2n) {
|
||||
background-color: rgba(0,0,50,.1)
|
||||
.ui.striped.table > tbody > tr:nth-child(2n), .ui.striped.table > tr:nth-child(2n) {
|
||||
background-color: inherit;
|
||||
//background-color: rgba(0,0,50,.1)
|
||||
}
|
||||
|
||||
.ui.striped.table > tbody > tr:nth-child(2n of :not(.filtered)), .ui.striped.table > tr:nth-child(2n of :not(.filtered)) {
|
||||
background-color: rgba(0, 0, 50, 0.1);
|
||||
}
|
||||
|
||||
.form-actions {
|
||||
@@ -303,7 +308,7 @@
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.roundbox {
|
||||
@@ -518,6 +523,21 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@media screen {
|
||||
#players-list {
|
||||
font-size: smaller;
|
||||
}
|
||||
.multi-select .listitem {
|
||||
font-size: smaller;
|
||||
}
|
||||
#results-list {
|
||||
font-size: smaller;
|
||||
}
|
||||
#standings-container {
|
||||
font-size: smaller;
|
||||
}
|
||||
}
|
||||
|
||||
@media print {
|
||||
|
||||
body {
|
||||
@@ -545,7 +565,8 @@
|
||||
margin-top: 0.1em !important;
|
||||
}
|
||||
|
||||
#header, #logo, #lang, .steps, #filter-box, #reglist-mode, #footer, #unpairables, #pairing-buttons, button, #standings-params, #logout, .pairing-stats, .result-sheets, .toggle, #overview {
|
||||
/* TODO - plenty of those elements could just use the .noprint class */
|
||||
#header, #logo, #lang, .steps, #filter-box, #reglist-mode, #footer, #unpairables, #pairing-buttons, button, #standings-params, #logout, .pairing-stats, .result-sheets, .toggle, #overview, .tables-exclusion, .button, .noprint {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@@ -675,9 +696,10 @@
|
||||
display: none;
|
||||
}
|
||||
|
||||
#players-list tr > :first-child {
|
||||
display: none;
|
||||
}
|
||||
/* should final/preliminary column be printed? */
|
||||
/* #players-list tr > :first-child { */
|
||||
/* display: none; */
|
||||
/* } */
|
||||
|
||||
#players-list #players .participation .ui.label {
|
||||
background: none;
|
||||
@@ -726,6 +748,9 @@
|
||||
#standings-table {
|
||||
font-size: 0.70rem;
|
||||
}
|
||||
.title-popup {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -87,6 +87,8 @@
|
||||
flex-flow: row wrap;
|
||||
justify-content: space-between;
|
||||
margin: 0 1em;
|
||||
align-items: baseline;
|
||||
gap: 0.5em;
|
||||
}
|
||||
|
||||
#players-list {
|
||||
@@ -377,7 +379,7 @@
|
||||
gap: 1em;
|
||||
max-width: max(10em, 20vw);
|
||||
}
|
||||
#unpairables {
|
||||
#unpairables, #previous_games {
|
||||
display: flex;
|
||||
flex-flow: column nowrap;
|
||||
min-height: 10vh;
|
||||
@@ -405,6 +407,18 @@
|
||||
margin-top: 0.2em;
|
||||
}
|
||||
|
||||
.bottom-pairing-actions {
|
||||
margin-top: 0.2em;
|
||||
display: flex;
|
||||
flex-flow: row wrap;
|
||||
justify-content: space-between;
|
||||
gap: 0.2em;
|
||||
}
|
||||
|
||||
.tables-exclusion {
|
||||
margin-top: 0.2em;
|
||||
}
|
||||
|
||||
/* results section */
|
||||
|
||||
#results-filter {
|
||||
@@ -471,6 +485,23 @@
|
||||
#standings-container {
|
||||
max-width: 95vw;
|
||||
}
|
||||
|
||||
#standings-table thead tr th {
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
td.game-result {
|
||||
position: relative;
|
||||
.title-popup {
|
||||
position: absolute;
|
||||
top: 90%;
|
||||
background: silver;
|
||||
padding: 4px;
|
||||
left: 10%;
|
||||
white-space: nowrap;
|
||||
z-index: 2;
|
||||
}
|
||||
}
|
||||
|
||||
.ui.steps {
|
||||
margin-top: 0.2em;
|
||||
|
@@ -5,6 +5,7 @@
|
||||
<tool key="translate" class="org.jeudego.pairgoth.view.TranslationTool"/>
|
||||
<tool key="strings" class="org.apache.commons.lang3.StringUtils"/>
|
||||
<tool key="utils" class="org.jeudego.pairgoth.view.PairgothTool"/>
|
||||
<tool key="number" locale="en_US"/>
|
||||
<!--
|
||||
<tool key="number" format="#0.00"/>
|
||||
<tool key="date" locale="fr_FR" format="yyyy-MM-dd"/>
|
||||
|
@@ -1,270 +1,278 @@
|
||||
(docker required) (Docker 필요)
|
||||
(java required) (Java 필요)
|
||||
, allowing you to tweak it in any possible way. Be sure to contribute back your enhancements! 하에 배포되어 자유롭게 수정할 수 있습니다. 개선 및 건의 사항을 전달해 주시면 감사하겠습니다!
|
||||
, the well known pairing system software developed by 의 후속작으로,
|
||||
, your Go Pairing Engine! 에 오신 것을 환영합니다!
|
||||
, last modified , 마지막 수정
|
||||
1st round seeding 1라운드 시드 배정
|
||||
: If you prefer convenience, you can simply use the : 프랑스 바둑 연맹이 제공하는
|
||||
: This mode allows you to run : 이 모드는 로컬 컴퓨터에서
|
||||
: This mode is the best suited for big Go events like congresses, it allows to register players, enter results and manage pairing from several workstations at once. : 이 모드는 큰 바둑 대회인 콩그레스와 같은 행사에 가장 적합합니다. 여러 컴퓨터에서 선수 등록, 결과 입력 및 매칭 관리를 할 수 있습니다.
|
||||
: the :
|
||||
Add player 선수 추가
|
||||
Advanced parameters 고급 설정
|
||||
At its core, 핵심적으로,
|
||||
Browse 파일 선택
|
||||
Byo-yomi periods 초읽기 횟수
|
||||
Byo-yomi stones 착수 횟수
|
||||
Byo-yomi time 초읽기 시간
|
||||
Canadian byo-yomi 캐나다식 초읽기
|
||||
Cancel 취소
|
||||
Change 변경
|
||||
Chinese rules 중국 규칙
|
||||
Choose format 형식 선택
|
||||
Clone 복제
|
||||
Clone example tournament 예제 대회 복제
|
||||
Close 닫기
|
||||
Club 소속
|
||||
Compile from the sources 소스에서 컴파일하기
|
||||
Country 국적
|
||||
Create 생성
|
||||
Crit 기준
|
||||
Ctr 국적
|
||||
Dates 날짜
|
||||
Delete 삭제
|
||||
Director 진행자
|
||||
Download
|
||||
Download _BLANK_WINDOWS Java 포함 Windows용
|
||||
Download the standalone web interface module which suits your need, then follow 독립 실행형 웹 인터페이스 모듈을 다운로드하여,
|
||||
Drop changes? 변경 사항을 폐기하시겠습니까?
|
||||
Edit 편집
|
||||
Encoding 인코딩
|
||||
Enter the magic word 마법의 단어 입력
|
||||
Example tournament 예제 대회
|
||||
Exclude table numbers: 테이블 번호 제외:
|
||||
Export 내보내기
|
||||
Export tournament 대회 내보내기
|
||||
Family name 성
|
||||
Filter 필터
|
||||
Filter... 필터링...
|
||||
Final only 최종 등록
|
||||
First name 이름
|
||||
Fischer timing 피셔 방식
|
||||
French rules 프랑스식
|
||||
Given name 이름
|
||||
Goban 바둑판
|
||||
Handicap 핸디캡
|
||||
Hd correction 핸디캡 보정
|
||||
No hd threshold 핸디캡 임계값 없음
|
||||
How to use
|
||||
? _BLANK_HOWTOUSE 사용 방법은 ?
|
||||
Import 가져오기
|
||||
Import tournament 대회 가져오기
|
||||
Increment 시간 증가분
|
||||
Individual players 개인 선수
|
||||
Information 정보
|
||||
Invalid tournament id 유효하지 않은 대회 ID입니다
|
||||
Japanese rules 일본식
|
||||
Komi 덤
|
||||
Launch
|
||||
_BLANK_LAUNCH 실행
|
||||
Launch a pairing server 매칭 서버 실행하기
|
||||
Launch a standalone instance 독립 실행형 인스턴스 실행하기
|
||||
Location 장소
|
||||
Log in 로그인
|
||||
Luc Vannier
|
||||
MM bar MM 바
|
||||
Mac Mahon 맥마흔
|
||||
Mac Mahon groups 맥마흔 그룹
|
||||
MacMahon 맥마흔
|
||||
Main time 제한 시간
|
||||
Max time 최대 시간
|
||||
MM floor MM 바닥
|
||||
Name 이름
|
||||
Nbw 승
|
||||
New Tournament 새 대회
|
||||
New tournament 새 대회
|
||||
Next rounds seeding 다음 라운드 시드 배정
|
||||
OpenGotha / Pairgoth file OpenGotha / Pairgoth 파일
|
||||
Pair 매칭하기
|
||||
Pair-go tournament 패어바둑 대회
|
||||
Pairing 매칭 시스템
|
||||
Pairings for round 라운드 매칭
|
||||
Participation 참가
|
||||
Preliminary and final 모든 등록
|
||||
Preliminary only 예비 등록
|
||||
Publish 게시
|
||||
Publish standings 순위 게시
|
||||
Rank 기력
|
||||
Rating 레이팅
|
||||
Reg 등록
|
||||
Register 등록
|
||||
Registration 등록
|
||||
Rengo with 2 players teams 2인 팀
|
||||
Rengo with 3 players team 3인 팀
|
||||
Renumber 번호 다시 매기기
|
||||
Required field 필수 항목
|
||||
Reset 재설정
|
||||
Results 결과
|
||||
Results for round 라운드 결과
|
||||
Round-robin 라운드 로빈
|
||||
Rounds 라운드
|
||||
Rules 규칙
|
||||
Search... 검색…
|
||||
Short name 단축명
|
||||
Since the project is still in beta, the sources are only available to FFG actors. If that's your case, you can access the sources here:
|
||||
Split and fold 분할 및 접기
|
||||
Split and random 분할 및 무작위
|
||||
Split and slip 스플릿 앤 슬립
|
||||
Standard byo-yomi 초읽기
|
||||
Standings 순위
|
||||
Standings after round 라운드 후 순위
|
||||
Stay in the browser 브라우저에서 사용하기
|
||||
Sudden death 서든 데스
|
||||
Surround winner's name or ½-½ 승자의 이름 또는 0.5 - 0.5을 둘러싸기
|
||||
Signature: 서명:
|
||||
Swiss 스위스
|
||||
Team of 2 individual players 2인 팀
|
||||
Team of 3 individual players 3인 팀
|
||||
Team of 4 individual players 4인 팀
|
||||
Team of 5 individual players 5인 팀
|
||||
That's the best option if you feel more comfortable when running locally or whenever you want to be able to do the pairing without internet. Pairgoth will launch a local web server on port 8080 to which you can connect using a browser. 로컬에서 실행하는 것이 더 편하거나 인터넷 없이 매칭을 하고 싶을 때 가장 좋은 옵션입니다. Pairgoth는 포트 8080에서 로컬 웹 서버를 실행하며, 이를 브라우저를 통해 연결할 수 있습니다.
|
||||
Time system 제한 시간 방식
|
||||
Tournament director 대회 담당자
|
||||
Tournament name 대회 이름
|
||||
Tournament type 대회 유형
|
||||
Unpair 매칭 취소
|
||||
Unregister 등록 해제
|
||||
Unregister this player? 이 선수를 등록 해제하시겠습니까?
|
||||
Update 업데이트
|
||||
We offer you the flexibility to use 저희는 여러분의 필요에 맞게
|
||||
Welcome to 여러분의 바둑 매칭 엔진
|
||||
What is
|
||||
? _BLANK_WHATIS 란 무엇인가?
|
||||
Your feedback is most welcome! 여러분의 피드백은 언제나 환영입니다!
|
||||
and uses the same algorithm and parameters internally, as well as import and export features towards its format. 내부적으로 동일한 알고리즘과 매개변수를 사용하며, 해당 형식으로의 가져오기 및 내보내기 기능을 지원합니다.
|
||||
apache licence 아파치 라이선스
|
||||
black 흑
|
||||
Black 흑
|
||||
club 소속
|
||||
country 국적
|
||||
d 단
|
||||
end date 종료일
|
||||
first name 이름
|
||||
from 부터
|
||||
games ) 판 )
|
||||
h 시간
|
||||
in a way that best suits your needs. Here are your options: 사용할 수 있게 하고자 합니다. 다음은 선택할 수 있는 옵션들입니다:
|
||||
instance graciously hosted by the French Go Federation. 인스턴스를 편하게 사용하실 수 있습니다.
|
||||
is a Go tournament pairing engine designed to make your tournament experience effortless. 는 여러분의 바둑 대회 경험을 손쉽게 만들어 주는 바둑 대회 매칭 엔진입니다.
|
||||
is the successor of 는<a href="http://vannier.info/jeux/accueil.htm">Luc Vannier</a>가 개발한 잘 알려진 매칭 시스템 소프트웨어인
|
||||
k 급
|
||||
last name 성
|
||||
on your local computer. 를 실행할 수 있게 해줍니다.
|
||||
online tournament 온라인 대회
|
||||
opengotha OpenGotha
|
||||
or 또는
|
||||
pairable players 매칭 가능한 선수
|
||||
pairable, 매칭 가능,
|
||||
pairgoth pairgoth
|
||||
pairing system, ideal for championships with no handicap games, as well as the 매칭 시스템과, 일반 대회 및 컵에 더 적합한
|
||||
pairing system, more suited for classical tournaments and cups. Future versions will support more pairing systems and more features. 매칭 시스템을 지원합니다. 향후 버전에서는 더 많은 매칭 시스템과 기능을 지원할 예정입니다.
|
||||
project is fully open source, and under the very permissive 프로젝트는 완전히 오픈 소스이며,
|
||||
result 결과
|
||||
result sheets 결과 시트
|
||||
sources 소스
|
||||
sources on github 소스를 확인해 보세요
|
||||
_BLANK_GITHUB Github에서
|
||||
standalone, web interface 독립 실행형, 웹 인터페이스 다운로드
|
||||
standalone, web interface, via docker 독립 실행형, 웹 인터페이스 다운로드, Docker를 통한 실행
|
||||
start date 시작 날짜
|
||||
table 테이블
|
||||
Table 테이블
|
||||
the configuration guide 구성 가이드를 따라하세요
|
||||
to 까지
|
||||
tournament location 대회 위치
|
||||
unpairable players 매칭 불가능한 선수
|
||||
unpairable, 매칭 불가능,
|
||||
supports the 는 접바둑이 없는 챔피언십일 경우에 잘 맞는
|
||||
white 백
|
||||
White 백
|
||||
white vs. black 백 vs 흑
|
||||
confirmed. 확인됨
|
||||
Note that login to this instance is reserved to French federation actors plus several external people at our discretion. Send us 이 인스턴스에 로그인하는 것은 프랑스 연맹 관계자와 당사의 재량에 따라 선택된 외부인에게만 허용됩니다. 접근을 요청하려면
|
||||
yyyymmdd-city yyyymmdd-도시
|
||||
an email 이메일
|
||||
to request an access. 을 보내주세요.
|
||||
(not yet available) (현재 제공되지 않음).
|
||||
Log in using 사용하여 로그인
|
||||
(reserved to FFG actors) (FFG 관계자에게만 허용)
|
||||
Log in using an email 이메일로 로그인
|
||||
password 비밀번호
|
||||
Warning: publishing partial results at round 경고: 라운드에서 부분 결과를 게시합니다
|
||||
out of 중에서
|
||||
For any further help or question, contact us 추가적인 도움이 필요하시거나 질문이 있으시면
|
||||
by email 이메일
|
||||
or 이나
|
||||
on our discord channel 디스코드
|
||||
. _BLANK_CONTACT 채널을 통해 문의해 주시기 바랍니다.
|
||||
standalone installer for Windows with Java included 독립 실행형 설치 프로그램 다운로드
|
||||
(please ensure that your Windows user has administrative rights). (Windows 사용자가 관리자 권한을 가지고 있는지 확인하세요).
|
||||
AGA rules 미국바둑협회 규칙
|
||||
initialized from rating 레이팅 기준으로 초기화
|
||||
You can join the
|
||||
Pairgoth mailing list Pairgoth 메일링 리스트
|
||||
to be notified about updates and to discuss the software. 에 등록하여 업데이트 알림을 받고, 소프트웨어에 대해 논의하세요.
|
||||
(give us a star if you have a github account!) (Github 계정이 있으시면 별을 눌러 주세요!).
|
||||
Clear results 결과 지우기
|
||||
choisir un fichier 파일 선택
|
||||
aucun fichier choisi 선택된 파일 없음
|
||||
Round 라운드
|
||||
Participants 참가자
|
||||
participants, 참가자,
|
||||
Paired 매칭됨
|
||||
Base parameters 기본 설정
|
||||
Main parameters 주요 설정
|
||||
Secondary parameters 부가 설정
|
||||
Geographical parameters 지리적 설정
|
||||
Handicap parameters 핸디캡 설정
|
||||
deterministic randomness 결정적 무작위성
|
||||
Randomness: 무작위성
|
||||
none 없음
|
||||
deterministic 결정적
|
||||
non-deterministic 비결정론적
|
||||
balance white and black 점 차이를 선호
|
||||
Round
|
||||
down 내림
|
||||
up 올림
|
||||
NBW/MMS score 라운드 NBW/MMS
|
||||
Special Mac Mahon handling for players absent from a round 라운드에 불참한 선수들에게 특별 맥마흔 처리
|
||||
MMS score for non-played rounds: 불참한 라운드의 MMS:
|
||||
SOS for non-played rounds: 불참한 라운드의 SOS:
|
||||
of player
|
||||
base MMS 기본 MMS
|
||||
base MMS + rounds/2 기본 MMS + 라운드/2
|
||||
Seeding methods inside groups of same score 동일 점수 그룹 내 시드 배정 방법
|
||||
Apply first seeding method up to round
|
||||
_BLANK_SEEDING 라운드까지 첫 번째 매칭 방법 적용
|
||||
First seeding method 첫 번째 시드 배정 방법
|
||||
Second seeding method 두 번째 시드 배정 방법
|
||||
add a sorting on rating 레이팅 정렬 추가
|
||||
Draw-up / draw-down between groups of same score 동일 점수 그룹 간의 상위/하위 매칭
|
||||
try to compensate a previous draw-up/draw-down by a draw-down/draw-up, then 이전의 상위/하위 매칭을 하위/상위 매칭으로 보상 시도한 뒤,
|
||||
pair a player in the 상위 그룹의
|
||||
top 상
|
||||
middle 중
|
||||
bottom 하
|
||||
of the upper group with a player in the 위 선수와 하위 그룹의
|
||||
of the lower group 위 선수를 매칭
|
||||
Do not apply secondary criteria for: 부가 기준을 적용하지 않음:
|
||||
players with a MMS equal to or stronger than MMS가
|
||||
_BLANK_AFTER_RANK_THRESHOLD_ 이상인 선수
|
||||
players who won at least half of their games 절반 이상을 이긴 선수
|
||||
players above the Mac Mahon bar 맥마흔 바 이상인 선수
|
||||
_BLANK_COUNTRY_PREFIX Prefer a score gap of 동일 국가 선수끼리 매칭하는 것보다
|
||||
_BLANK_CLUB_PREFIX Prefer a score gap of 동일 클럽 선수끼리 매칭하는 것보다
|
||||
rather than pairing players of the same country. 점 차이를 선호
|
||||
rather than pairing players of the same club. 점 차이를 선호
|
||||
use MMS rather than rank for handicap 핸디캡에는 랭킹 대신 MMS 사용
|
||||
Handicap ceiling: 핸디캡 상한:
|
||||
round down NBW/MMS score 라운드 내림 라운드 NBW/MMS
|
||||
(docker required) (Docker 필요)
|
||||
(java required) (Java 필요)
|
||||
, allowing you to tweak it in any possible way. Be sure to contribute back your enhancements! 하에 배포되어 자유롭게 수정할 수 있습니다. 개선 및 건의 사항을 전달해 주시면 감사하겠습니다!
|
||||
, the well known pairing system software developed by 의 후속작으로,
|
||||
, your Go Pairing Engine! 에 오신 것을 환영합니다!
|
||||
, last modified , 마지막 수정
|
||||
1st round seeding 1라운드 시드 배정
|
||||
: If you prefer convenience, you can simply use the : 프랑스 바둑 연맹이 제공하는
|
||||
: This mode allows you to run : 이 모드는 로컬 컴퓨터에서
|
||||
: This mode is the best suited for big Go events like congresses, it allows to register players, enter results and manage pairing from several workstations at once. : 이 모드는 큰 바둑 대회인 콩그레스와 같은 행사에 가장 적합합니다. 여러 컴퓨터에서 선수 등록, 결과 입력 및 매칭 관리를 할 수 있습니다.
|
||||
: the :
|
||||
Add player 선수 추가
|
||||
Advanced parameters 고급 설정
|
||||
At its core, 핵심적으로,
|
||||
Browse 파일 선택
|
||||
Byo-yomi periods 초읽기 횟수
|
||||
Byo-yomi stones 착수 횟수
|
||||
Byo-yomi time 초읽기 시간
|
||||
Canadian byo-yomi 캐나다식 초읽기
|
||||
Cancel 취소
|
||||
Change 변경
|
||||
Chinese rules 중국 규칙
|
||||
Choose format 형식 선택
|
||||
Clone 복제
|
||||
Clone example tournament 예제 대회 복제
|
||||
Close 닫기
|
||||
Club 소속
|
||||
Compile from the sources 소스에서 컴파일하기
|
||||
Country 국적
|
||||
Create 생성
|
||||
Crit 기준
|
||||
Ctr 국적
|
||||
Dates 날짜
|
||||
Delete 삭제
|
||||
Director 진행자
|
||||
Download
|
||||
Download _BLANK_WINDOWS Java 포함 Windows용
|
||||
Download the standalone web interface module which suits your need, then follow 독립 실행형 웹 인터페이스 모듈을 다운로드하여,
|
||||
Drop changes? 변경 사항을 폐기하시겠습니까?
|
||||
Edit 편집
|
||||
Encoding 인코딩
|
||||
Enter the magic word 마법의 단어 입력
|
||||
Example tournament 예제 대회
|
||||
Exclude table numbers: 테이블 번호 제외:
|
||||
Export 내보내기
|
||||
Export tournament 대회 내보내기
|
||||
Family name 성
|
||||
Filter 필터
|
||||
Filter... 필터링...
|
||||
Final only 최종 등록
|
||||
First name 이름
|
||||
Fischer timing 피셔 방식
|
||||
French rules 프랑스식
|
||||
Given name 이름
|
||||
Goban 바둑판
|
||||
Handicap 핸디캡
|
||||
Hd correction 핸디캡 보정
|
||||
No hd threshold 핸디캡 임계값 없음
|
||||
How to use
|
||||
? _BLANK_HOWTOUSE 사용 방법은 ?
|
||||
Import 가져오기
|
||||
Import tournament 대회 가져오기
|
||||
Increment 시간 증가분
|
||||
Individual players 개인 선수
|
||||
Information 정보
|
||||
Invalid tournament id 유효하지 않은 대회 ID입니다
|
||||
Japanese rules 일본식
|
||||
Komi 덤
|
||||
Launch
|
||||
_BLANK_LAUNCH 실행
|
||||
Launch a pairing server 매칭 서버 실행하기
|
||||
Launch a standalone instance 독립 실행형 인스턴스 실행하기
|
||||
Location 장소
|
||||
Log in 로그인
|
||||
Luc Vannier
|
||||
MM bar MM 바
|
||||
Mac Mahon 맥마흔
|
||||
Mac Mahon groups 맥마흔 그룹
|
||||
MacMahon 맥마흔
|
||||
Main time 제한 시간
|
||||
Max time 최대 시간
|
||||
MM floor MM 바닥
|
||||
Name 이름
|
||||
Nbw 승
|
||||
New Tournament 새 대회
|
||||
New tournament 새 대회
|
||||
Next rounds seeding 다음 라운드 시드 배정
|
||||
OpenGotha / Pairgoth file OpenGotha / Pairgoth 파일
|
||||
Pair 매칭하기
|
||||
Pair-go tournament 패어바둑 대회
|
||||
Pairing 매칭 시스템
|
||||
Pairings for round 라운드 매칭
|
||||
Participation 참가
|
||||
Preliminary and final 모든 등록
|
||||
Preliminary only 예비 등록
|
||||
Publish 게시
|
||||
Publish standings 순위 게시
|
||||
Rank 기력
|
||||
Rating 레이팅
|
||||
Reg 등록
|
||||
Register 등록
|
||||
Registration 등록
|
||||
Rengo with 2 players teams 2인 팀
|
||||
Rengo with 3 players team 3인 팀
|
||||
Renumber 번호 다시 매기기
|
||||
Required field 필수 항목
|
||||
Reset 재설정
|
||||
Results 결과
|
||||
Results for round 라운드 결과
|
||||
Round-robin 라운드 로빈
|
||||
Rounds 라운드
|
||||
Rules 규칙
|
||||
Search... 검색…
|
||||
Short name 단축명
|
||||
Since the project is still in beta, the sources are only available to FFG actors. If that's your case, you can access the sources here:
|
||||
Split and fold 분할 및 접기
|
||||
Split and random 분할 및 무작위
|
||||
Split and slip 스플릿 앤 슬립
|
||||
Standard byo-yomi 초읽기
|
||||
Standings 순위
|
||||
Standings after round 라운드 후 순위
|
||||
Stay in the browser 브라우저에서 사용하기
|
||||
Sudden death 서든 데스
|
||||
Surround winner's name or ½-½ 승자의 이름 또는 0.5 - 0.5을 둘러싸기
|
||||
Signature: 서명:
|
||||
Swiss 스위스
|
||||
Team of 2 individual players 2인 팀
|
||||
Team of 3 individual players 3인 팀
|
||||
Team of 4 individual players 4인 팀
|
||||
Team of 5 individual players 5인 팀
|
||||
That's the best option if you feel more comfortable when running locally or whenever you want to be able to do the pairing without internet. Pairgoth will launch a local web server on port 8080 to which you can connect using a browser. 로컬에서 실행하는 것이 더 편하거나 인터넷 없이 매칭을 하고 싶을 때 가장 좋은 옵션입니다. Pairgoth는 포트 8080에서 로컬 웹 서버를 실행하며, 이를 브라우저를 통해 연결할 수 있습니다.
|
||||
Time system 제한 시간 방식
|
||||
Tournament director 대회 담당자
|
||||
Tournament name 대회 이름
|
||||
Tournament type 대회 유형
|
||||
Unpair 매칭 취소
|
||||
Unregister 등록 해제
|
||||
Unregister this player? 이 선수를 등록 해제하시겠습니까?
|
||||
Update 업데이트
|
||||
We offer you the flexibility to use 저희는 여러분의 필요에 맞게
|
||||
Welcome to 여러분의 바둑 매칭 엔진
|
||||
What is
|
||||
? _BLANK_WHATIS 란 무엇인가?
|
||||
Your feedback is most welcome! 여러분의 피드백은 언제나 환영입니다!
|
||||
and uses the same algorithm and parameters internally, as well as import and export features towards its format. 내부적으로 동일한 알고리즘과 매개변수를 사용하며, 해당 형식으로의 가져오기 및 내보내기 기능을 지원합니다.
|
||||
apache licence 아파치 라이선스
|
||||
black 흑
|
||||
Black 흑
|
||||
club 소속
|
||||
country 국적
|
||||
d 단
|
||||
end date 종료일
|
||||
first name 이름
|
||||
from 부터
|
||||
games ) 판 )
|
||||
h 시간
|
||||
in a way that best suits your needs. Here are your options: 사용할 수 있게 하고자 합니다. 다음은 선택할 수 있는 옵션들입니다:
|
||||
instance graciously hosted by the French Go Federation. 인스턴스를 편하게 사용하실 수 있습니다.
|
||||
is a Go tournament pairing engine designed to make your tournament experience effortless. 는 여러분의 바둑 대회 경험을 손쉽게 만들어 주는 바둑 대회 매칭 엔진입니다.
|
||||
is the successor of 는<a href="http://vannier.info/jeux/accueil.htm">Luc Vannier</a>가 개발한 잘 알려진 매칭 시스템 소프트웨어인
|
||||
k 급
|
||||
last name 성
|
||||
on your local computer. 를 실행할 수 있게 해줍니다.
|
||||
online tournament 온라인 대회
|
||||
opengotha OpenGotha
|
||||
or 또는
|
||||
pairable players 매칭 가능한 선수
|
||||
pairable, 매칭 가능,
|
||||
pairgoth pairgoth
|
||||
pairing system, ideal for championships with no handicap games, as well as the 매칭 시스템과, 일반 대회 및 컵에 더 적합한
|
||||
pairing system, more suited for classical tournaments and cups. Future versions will support more pairing systems and more features. 매칭 시스템을 지원합니다. 향후 버전에서는 더 많은 매칭 시스템과 기능을 지원할 예정입니다.
|
||||
project is fully open source, and under the very permissive 프로젝트는 완전히 오픈 소스이며,
|
||||
result 결과
|
||||
result sheets 결과 시트
|
||||
sources 소스
|
||||
sources on github 소스를 확인해 보세요
|
||||
_BLANK_GITHUB Github에서
|
||||
standalone, web interface 독립 실행형, 웹 인터페이스 다운로드
|
||||
standalone, web interface, via docker 독립 실행형, 웹 인터페이스 다운로드, Docker를 통한 실행
|
||||
start date 시작 날짜
|
||||
table 테이블
|
||||
Table 테이블
|
||||
the configuration guide 구성 가이드를 따라하세요
|
||||
to 까지
|
||||
tournament location 대회 위치
|
||||
unpairable players 매칭 불가능한 선수
|
||||
unpairable, 매칭 불가능,
|
||||
supports the 는 접바둑이 없는 챔피언십일 경우에 잘 맞는
|
||||
white 백
|
||||
White 백
|
||||
white vs. black 백 vs 흑
|
||||
confirmed. 확인됨
|
||||
Note that login to this instance is reserved to French federation actors plus several external people at our discretion. Send us 이 인스턴스에 로그인하는 것은 프랑스 연맹 관계자와 당사의 재량에 따라 선택된 외부인에게만 허용됩니다. 접근을 요청하려면
|
||||
yyyymmdd-city yyyymmdd-도시
|
||||
an email 이메일
|
||||
to request an access. 을 보내주세요.
|
||||
(not yet available) (현재 제공되지 않음).
|
||||
Log in using 사용하여 로그인
|
||||
(reserved to FFG actors) (FFG 관계자에게만 허용)
|
||||
Log in using an email 이메일로 로그인
|
||||
password 비밀번호
|
||||
Warning: publishing partial results at round 경고: 라운드에서 부분 결과를 게시합니다
|
||||
out of 중에서
|
||||
For any further help or question, contact us 추가적인 도움이 필요하시거나 질문이 있으시면
|
||||
by email 이메일
|
||||
or 이나
|
||||
on our discord channel 디스코드
|
||||
. _BLANK_CONTACT 채널을 통해 문의해 주시기 바랍니다.
|
||||
standalone installer for Windows with Java included 독립 실행형 설치 프로그램 다운로드
|
||||
(please ensure that your Windows user has administrative rights). (Windows 사용자가 관리자 권한을 가지고 있는지 확인하세요).
|
||||
AGA rules 미국바둑협회 규칙
|
||||
initialized from rating 레이팅 기준으로 초기화
|
||||
You can join the
|
||||
Pairgoth mailing list Pairgoth 메일링 리스트
|
||||
to be notified about updates and to discuss the software. 에 등록하여 업데이트 알림을 받고, 소프트웨어에 대해 논의하세요.
|
||||
(give us a star if you have a github account!) (Github 계정이 있으시면 별을 눌러 주세요!).
|
||||
Clear results 결과 지우기
|
||||
choisir un fichier 파일 선택
|
||||
aucun fichier choisi 선택된 파일 없음
|
||||
Round 라운드
|
||||
Participants 참가자
|
||||
participants, 참가자,
|
||||
Paired 매칭됨
|
||||
Base parameters 기본 설정
|
||||
Main parameters 주요 설정
|
||||
Secondary parameters 부가 설정
|
||||
Geographical parameters 지리적 설정
|
||||
Handicap parameters 핸디캡 설정
|
||||
deterministic randomness 결정적 무작위성
|
||||
<<<<<<< e8943b690eca2a284ab2fabd0d014fb77981af21
|
||||
Randomness: 무작위성
|
||||
none 없음
|
||||
deterministic 결정적
|
||||
non-deterministic 비결정론적
|
||||
balance white and black 점 차이를 선호
|
||||
=======
|
||||
Randomness 무작위성
|
||||
none 없음
|
||||
deterministic 없음
|
||||
non-deterministic 비결정론적
|
||||
balance white and black
|
||||
>>>>>>> 5528e07f8e0cdda908847577340c595e9d2df8aa
|
||||
Round
|
||||
down 내림
|
||||
up 올림
|
||||
NBW/MMS score 라운드 NBW/MMS
|
||||
Special Mac Mahon handling for players absent from a round 라운드에 불참한 선수들에게 특별 맥마흔 처리
|
||||
MMS score for non-played rounds: 불참한 라운드의 MMS:
|
||||
SOS for non-played rounds: 불참한 라운드의 SOS:
|
||||
of player
|
||||
base MMS 기본 MMS
|
||||
base MMS + rounds/2 기본 MMS + 라운드/2
|
||||
Seeding methods inside groups of same score 동일 점수 그룹 내 시드 배정 방법
|
||||
Apply first seeding method up to round
|
||||
_BLANK_SEEDING 라운드까지 첫 번째 매칭 방법 적용
|
||||
First seeding method 첫 번째 시드 배정 방법
|
||||
Second seeding method 두 번째 시드 배정 방법
|
||||
add a sorting on rating 레이팅 정렬 추가
|
||||
Draw-up / draw-down between groups of same score 동일 점수 그룹 간의 상위/하위 매칭
|
||||
try to compensate a previous draw-up/draw-down by a draw-down/draw-up, then 이전의 상위/하위 매칭을 하위/상위 매칭으로 보상 시도한 뒤,
|
||||
pair a player in the 상위 그룹의
|
||||
top 상
|
||||
middle 중
|
||||
bottom 하
|
||||
of the upper group with a player in the 위 선수와 하위 그룹의
|
||||
of the lower group 위 선수를 매칭
|
||||
Do not apply secondary criteria for: 부가 기준을 적용하지 않음:
|
||||
players with a MMS equal to or stronger than MMS가
|
||||
_BLANK_AFTER_RANK_THRESHOLD_ 이상인 선수
|
||||
players who won at least half of their games 절반 이상을 이긴 선수
|
||||
players above the Mac Mahon bar 맥마흔 바 이상인 선수
|
||||
_BLANK_COUNTRY_PREFIX Prefer a score gap of 동일 국가 선수끼리 매칭하는 것보다
|
||||
_BLANK_CLUB_PREFIX Prefer a score gap of 동일 클럽 선수끼리 매칭하는 것보다
|
||||
rather than pairing players of the same country. 점 차이를 선호
|
||||
rather than pairing players of the same club. 점 차이를 선호
|
||||
use MMS rather than rank for handicap 핸디캡에는 랭킹 대신 MMS 사용
|
||||
Handicap ceiling: 핸디캡 상한:
|
||||
round down NBW/MMS score 라운드 내림 라운드 NBW/MMS
|
||||
|
@@ -194,6 +194,12 @@ function downloadFile(blob, filename) {
|
||||
document.body.removeChild(link);
|
||||
}
|
||||
|
||||
function isTouchDevice() {
|
||||
return (('ontouchstart' in window) ||
|
||||
(navigator.maxTouchPoints > 0) ||
|
||||
(navigator.msMaxTouchPoints > 0));
|
||||
}
|
||||
|
||||
onLoad(() => {
|
||||
$('button.close').on('click', e => {
|
||||
close_modal();
|
||||
@@ -342,4 +348,28 @@ onLoad(() => {
|
||||
let dialog = e.target.closest('.popup');
|
||||
if (!dialog) close_modal();
|
||||
});
|
||||
|
||||
if (isTouchDevice()) {
|
||||
$("[title]").on('click', e => {
|
||||
let item = e.target.closest('[title]');
|
||||
let title = item.getAttribute('title');
|
||||
let popup = item.find('.title-popup')
|
||||
if (popup.length === 0) {
|
||||
item.insertAdjacentHTML('beforeend', `<span class="title-popup">${title}</span>`);
|
||||
} else {
|
||||
item.removeChild(popup[0]);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Element.clearChildren method
|
||||
if( typeof Element.prototype.clearChildren === 'undefined' ) {
|
||||
Object.defineProperty(Element.prototype, 'clearChildren', {
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
value: function() {
|
||||
while(this.firstChild) this.removeChild(this.lastChild);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@@ -224,17 +224,17 @@ onLoad(() => {
|
||||
let tour = {
|
||||
pairing: {
|
||||
base: {
|
||||
deterministic: form.val('deterministic'),
|
||||
colorBalanceWeight: form.val('colorBalance') ? 1000000.0 : 0.0 // TODO use client side boolean
|
||||
randomness: form.val('randomness'),
|
||||
colorBalance: form.val('colorBalance')
|
||||
},
|
||||
main: {
|
||||
mmsValueAbsent: form.val('mmsValueAbsent'),
|
||||
roundDownScore: form.val('roundDownScore'),
|
||||
sosValueAbsentUseBase: form.val('sosValueAbsentUseBase'),
|
||||
firstSeedLastRound: form.val('firstSeedLastRound'),
|
||||
firstSeedAddCrit: form.val('firstSeedAddRating') ? 'RATING' : 'NONE', // TODO use client side boolean
|
||||
firstSeedAddRating: form.val('firstSeedAddRating'),
|
||||
firstSeed: form.val('firstSeed'),
|
||||
secondSeedAddCrit: form.val('secondSeedAddRating') ? 'RATING' : 'NONE', // TODO use client side boolean
|
||||
secondSeedAddRating: form.val('secondSeedAddRating'),
|
||||
secondSeed: form.val('secondSeed'),
|
||||
upDownCompensate: form.val('upDownCompensate'),
|
||||
upDownUpperMode: form.val('upDownUpperMode'),
|
||||
@@ -281,7 +281,7 @@ onLoad(() => {
|
||||
|
||||
$('select[name="pairing"]').on('change', e => {
|
||||
let pairing = e.target.value.toLowerCase();
|
||||
if (pairing === 'mms') $('#tournament-infos .mms').removeClass('hidden');
|
||||
if (pairing === 'mac_mahon') $('#tournament-infos .mms').removeClass('hidden');
|
||||
else $('#tournament-infos .mms').addClass('hidden');
|
||||
if (pairing === 'swiss') $('#tournament-infos .swiss').removeClass('hidden');
|
||||
else $('#tournament-infos .swiss').addClass('hidden');
|
||||
|
@@ -1,12 +1,31 @@
|
||||
let focused = undefined;
|
||||
|
||||
function pair(parts) {
|
||||
api.postJson(`tour/${tour_id}/pair/${activeRound}`, parts)
|
||||
.then(rst => {
|
||||
if (rst !== 'error') {
|
||||
document.location.reload();
|
||||
}
|
||||
});
|
||||
|
||||
let doWork = () => {
|
||||
api.postJson(`tour/${tour_id}/pair/${activeRound}`, parts)
|
||||
.then(rst => {
|
||||
if (rst !== 'error') {
|
||||
document.location.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
let tablesExclusionControl = $('#exclude-tables');
|
||||
let value = tablesExclusionControl[0].value;
|
||||
let origValue = tablesExclusionControl.data('orig');
|
||||
if (value === origValue) {
|
||||
// tables exclusion value did not change
|
||||
doWork();
|
||||
} else {
|
||||
// tables exclusion value has change, we must save it first
|
||||
api.putJson(`tour/${tour_id}`, { round: activeRound, excludeTables: value })
|
||||
.then(rst => {
|
||||
if (rst !== 'error') {
|
||||
doWork();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function unpair(games) {
|
||||
@@ -19,7 +38,14 @@ function unpair(games) {
|
||||
}
|
||||
|
||||
function renumberTables() {
|
||||
api.putJson(`tour/${tour_id}/pair/${activeRound}`, {})
|
||||
let payload = {}
|
||||
let tablesExclusionControl = $('#exclude-tables');
|
||||
let value = tablesExclusionControl[0].value;
|
||||
let origValue = tablesExclusionControl.data('orig');
|
||||
if (value !== origValue) {
|
||||
payload['excludeTables'] = value;
|
||||
}
|
||||
api.putJson(`tour/${tour_id}/pair/${activeRound}`, payload)
|
||||
.then(rst => {
|
||||
if (rst !== 'error') {
|
||||
document.location.reload();
|
||||
@@ -28,6 +54,7 @@ function renumberTables() {
|
||||
}
|
||||
|
||||
function editGame(game) {
|
||||
// CB TODO - those should be data attributes of the parent game tag
|
||||
let t = game.find('.table');
|
||||
let w = game.find('.white');
|
||||
let b = game.find('.black');
|
||||
@@ -35,6 +62,7 @@ function editGame(game) {
|
||||
|
||||
let form = $('#pairing-form')[0];
|
||||
form.val('id', game.data('id'));
|
||||
form.val('prev-table', t.data('value'));
|
||||
form.val('t', t.data('value'));
|
||||
form.val('w', w.data('id'));
|
||||
$('#edit-pairing-white').text(w.text());
|
||||
@@ -80,12 +108,38 @@ function updatePairable() {
|
||||
});
|
||||
}
|
||||
|
||||
function showOpponents(player) {
|
||||
let id = player.data('id');
|
||||
let games = $(`#standings-table tbody tr[data-id="${id}"] .game-result`)
|
||||
if (games.length) {
|
||||
let title = `${$('#previous_games_prefix').text()}${player.innerText.replace('\n', ' ')}${$('#previous_games_postfix').text()}`;
|
||||
$('#unpairables').addClass('hidden');
|
||||
$('#previous_games')[0].setAttribute('title', title);
|
||||
$('#previous_games')[0].clearChildren();
|
||||
$('#previous_games').removeClass('hidden');
|
||||
for (let r = 0; r < activeRound; ++r) {
|
||||
let game = games[r]
|
||||
let opponent = game.getAttribute('title');
|
||||
if (!opponent) opponent = '';
|
||||
let result = game.text().replace(/^\d+/, '');
|
||||
let listitem = `<div data-id="${id}" class="listitem"><span>R${r+1}</span><span>${opponent}</span><span>${result}</span></div>`
|
||||
$('#previous_games')[0].insertAdjacentHTML('beforeend', listitem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function hideOpponents() {
|
||||
$('#unpairables').removeClass('hidden');
|
||||
$('#previous_games').addClass('hidden');
|
||||
}
|
||||
|
||||
onLoad(()=>{
|
||||
// note - this handler is also in use for lists on Mac Mahon super groups and teams pages
|
||||
$('.listitem').on('click', e => {
|
||||
let listitem = e.target.closest('.listitem');
|
||||
let box = e.target.closest('.multi-select');
|
||||
if (e.shiftKey && typeof(focused) !== 'undefined') {
|
||||
let focusedBox = focused ? focused.closest('.multi-select') : undefined;
|
||||
if (e.shiftKey && typeof(focused) !== 'undefined' && box.getAttribute('id') === focusedBox.getAttribute('id')) {
|
||||
let from = focused.index('.listitem');
|
||||
let to = listitem.index('.listitem');
|
||||
if (from > to) {
|
||||
@@ -102,10 +156,12 @@ onLoad(()=>{
|
||||
if (e.detail === 1) {
|
||||
// single click
|
||||
focused = listitem.toggleClass('selected').attr('draggable', listitem.hasClass('selected'));
|
||||
if (box.getAttribute('id') === 'pairables') showOpponents(focused)
|
||||
} else if (listitem.closest('#pairing-lists')) {
|
||||
// on pairing page
|
||||
if (listitem.closest('#paired')) {
|
||||
// double click
|
||||
hideOpponents()
|
||||
focused = listitem.attr('draggable', listitem.hasClass('selected'));
|
||||
editGame(focused);
|
||||
} else if (listitem.closest('#pairables')) {
|
||||
@@ -162,6 +218,12 @@ onLoad(()=>{
|
||||
b: form.val('b'),
|
||||
h: form.val('h')
|
||||
}
|
||||
let prevTable = form.val('prev-table');
|
||||
if (prevTable !== game.t && $(`.t[data-table="${game.t}"]`).length > 0) {
|
||||
if (!confirm(`This change will trigger a tables renumbering because the destination table #${game.t} is not empty. Proceed?`)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
api.putJson(`tour/${tour_id}/pair/${activeRound}`, game)
|
||||
.then(game => {
|
||||
if (game !== 'error') {
|
||||
@@ -169,10 +231,11 @@ onLoad(()=>{
|
||||
}
|
||||
});
|
||||
});
|
||||
$('.multi-select').on('dblclick', e => {
|
||||
let box = e.target.closest('.multi-select');
|
||||
document.on('dblclick', e => {
|
||||
if (!e.target.closest('.listitem')) {
|
||||
box.find('.listitem').removeClass('selected');
|
||||
$('.listitem').removeClass('selected');
|
||||
focused = undefined;
|
||||
hideOpponents()
|
||||
}
|
||||
});
|
||||
$('#update-pairable').on('click', e => {
|
||||
|
@@ -70,6 +70,13 @@ onLoad(()=>{
|
||||
let newResult = results[(index + 1)%results.length];
|
||||
setResult(gameId, newResult, oldResult);
|
||||
});
|
||||
$('#results-table .result').on('dblclick', e => {
|
||||
let cell = e.target.closest('.result');
|
||||
let gameId = e.target.closest('tr').data('id');
|
||||
let oldResult = cell.data('result');
|
||||
let newResult = '?';
|
||||
setResult(gameId, newResult, oldResult);
|
||||
});
|
||||
$('#results-filter').on('click', e => {
|
||||
let filter = $('#results-filter input')[0];
|
||||
filter.checked = !filter.checked;
|
||||
|
@@ -24,7 +24,18 @@ function publishHtml() {
|
||||
close_modal();
|
||||
}
|
||||
|
||||
function freeze() {
|
||||
api.put(`tour/${tour_id}/standings/${activeRound}`, {}
|
||||
).then(resp => {
|
||||
if (resp.ok) {
|
||||
document.location.reload();
|
||||
}
|
||||
else throw "freeze error"
|
||||
}).catch(err => showError(err));
|
||||
}
|
||||
|
||||
onLoad(() => {
|
||||
new Tablesort($('#standings-table')[0]);
|
||||
$('.criterium').on('click', e => {
|
||||
let alreadyOpen = e.target.closest('select');
|
||||
if (alreadyOpen) return;
|
||||
@@ -85,4 +96,9 @@ onLoad(() => {
|
||||
$('.publish-html').on('click', e => {
|
||||
publishHtml();
|
||||
});
|
||||
$('#freeze').on('click', e => {
|
||||
if (confirm("Once frozen, names, levels and even pairings can be changed, but the scores and the standings will stay the same. Freeze the standings?")) {
|
||||
freeze()
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@@ -28,12 +28,18 @@
|
||||
#end
|
||||
#set($games = $utils.removeBye($roundPairing.games))
|
||||
#set($pages = ($games.size() + 3) / 4)
|
||||
#foreach($i in [1..$games.size()])
|
||||
#set($items = $pages * 4)
|
||||
#foreach($i in [1..$items])
|
||||
#set($j = ($i - 1) / 4 + (($i - 1) % 4) * $pages)
|
||||
#if($j < $games.size())
|
||||
#set($game = $games[$j])
|
||||
#set($white = $pmap[$game.w])
|
||||
#set($black = $pmap[$game.b])
|
||||
#set($game = $games[$j])
|
||||
#set($white = $pmap[$game.w])
|
||||
#set($black = $pmap[$game.b])
|
||||
#else
|
||||
#set($game = { 't': 'xxx', 'h': 'xxx' })
|
||||
#set($white = { 'name': 'xxx', 'firstname': 'xxx', 'rank': -99, 'country': 'XX', 'club': 'xxx' })
|
||||
#set($black = { 'name': 'xxx', 'firstname': 'xxx', 'rank': -99, 'country': 'XX', 'club': 'xxx' })
|
||||
#end
|
||||
#if($foreach.index % 4 == 0)
|
||||
<div class="page">
|
||||
#end
|
||||
@@ -75,7 +81,6 @@
|
||||
</div>
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
onLoad(() => {
|
||||
|
@@ -22,6 +22,14 @@
|
||||
<button class="ui floating choose-round next-round button">»</button>
|
||||
</div>
|
||||
<div class="pairing-stats nobreak">( $pairables.size() pairable, $games.size() games )</div>
|
||||
<div class="tables-exclusion">
|
||||
#if($tour.tablesExclusion && $round <= $tour.tablesExclusion.size())
|
||||
#set($tablesExclusion = $!tour.tablesExclusion[$round - 1])
|
||||
#else
|
||||
#set($tablesExclusion = '')
|
||||
#end
|
||||
Exclude table numbers: <input type="text" id="exclude-tables" name="exclude-tables" placeholder="ex: 1-34, 38, 45-77" data-orig="$tablesExclusion" value="$tablesExclusion"/>
|
||||
</div>
|
||||
<div id="pairing-lists">
|
||||
<div id="pairing-left">
|
||||
<div id="pairables" class="multi-select" title="pairable players">
|
||||
@@ -36,6 +44,9 @@
|
||||
<div data-id="$part.id" class="listitem unpairable"><span class="name">$part.name#if($part.firstname) $part.firstname#end</span><span>#rank($part.rank)#if($part.country) $part.country#end</span></div>
|
||||
#end
|
||||
</div>
|
||||
<div id="previous_games" class="hidden multi-select">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div id="pairing-right">
|
||||
<div class="pairing-buttons">
|
||||
@@ -87,7 +98,7 @@
|
||||
#set($white = $pmap[$game.w])
|
||||
#set($black = $pmap[$game.b])
|
||||
<tr>
|
||||
<td>${game.t}</td>
|
||||
<td class="t" data-table="${game.t}">${game.t}</td>
|
||||
<td class="left">#if($white)${white.name} ${white.firstname} (#rank($white.rank), $white.country $white.club)#{else}BIP#end</td>
|
||||
<td class="left">#if($black)${black.name} ${black.firstname} (#rank($black.rank), $black.country $black.club)#{else}BIP#end</td>
|
||||
<td>${game.h}</td>
|
||||
@@ -103,6 +114,7 @@
|
||||
<div class="popup-body">
|
||||
<form id="pairing-form" class="ui form edit">
|
||||
<input type="hidden" name="id"/>
|
||||
<input type="hidden" name="prev-table"/>
|
||||
<div class="popup-content">
|
||||
<div class="inline fields">
|
||||
<div class="field">
|
||||
@@ -176,3 +188,8 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
## For dynamic texts to be translated, they must be somewhere in the html source.
|
||||
## TODO - gather all "text only" nodes like this somewhere
|
||||
<div id="previous_games_prefix" class="hidden">Games of </div>
|
||||
<div id="previous_games_postfix" class="hidden"></div>
|
@@ -3,7 +3,14 @@
|
||||
<div class="title"><i class="dropdown icon"></i>Base parameters</div>
|
||||
<div class="content">
|
||||
<div class="field">
|
||||
<label><input type="checkbox" name="deterministic" value="true" #if($tour.pairing.base.deterministic) checked #end> deterministic randomness</label>
|
||||
<label>
|
||||
Randomness:
|
||||
<select name="randomness">
|
||||
<option value="none" #if($tour.pairing.base.random == 0.0)selected#end>none</option>
|
||||
<option value="deterministic" #if($tour.pairing.base.random != 0.0 && $tour.pairing.base.deterministic)selected#end>deterministic</option>
|
||||
<option value="non-deterministic" #if($tour.pairing.base.random != 0.0 && !$tour.pairing.base.deterministic)selected#end>non-deterministic</option>
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label><input type="checkbox" name="colorBalance" value="true" #if($tour.pairing.base.colorBalanceWeight) checked #end> balance white and black</label>
|
||||
@@ -14,14 +21,7 @@
|
||||
#if($tour.pairing.type == 'MAC_MAHON')
|
||||
<div class="inline fields">
|
||||
<div class="field">
|
||||
<label>
|
||||
Round
|
||||
<select name="roundDownScore">
|
||||
<option value="true" #if($tour.pairing.main.roundDownScore) selected #end>down</option>
|
||||
<option value="false" #if(!$tour.pairing.main.roundDownScore) selected #end>up</option>
|
||||
</select>
|
||||
NBW/MMS score
|
||||
</label>
|
||||
<label><input type="checkbox" name="roundDownScore" value="true" #if($tour.pairing.main.roundDownScore) checked #end> round down NBW/MMS score</label>
|
||||
</div>
|
||||
</div>
|
||||
#end
|
||||
|
@@ -6,6 +6,26 @@
|
||||
#set($pmap = $utils.toMap($teams))
|
||||
#end
|
||||
|
||||
## Team players do not have an individual MMS
|
||||
#if($tour.type == 'INDIVIDUAL' && $tour.pairing.type == 'MAC_MAHON')
|
||||
#set($mmbase = $api.get("tour/${params.id}/standings/0?include_preliminary=true"))
|
||||
#if($mmbase.isObject() && ($mmbase.error || $mmbase.message))
|
||||
#if($mmbase.error)
|
||||
#set($error = $mmbase.error)
|
||||
#else
|
||||
#set($error = $mmbase.message)
|
||||
#end
|
||||
<script type="text/javascript">
|
||||
onLoad(() => {
|
||||
showError("$error")
|
||||
});
|
||||
</script>
|
||||
#set($mmbase = [])
|
||||
#end
|
||||
#set($mmsMap = $utils.getMmsMap($mmbase))
|
||||
#set($mmsPlayersMap = $utils.getMmsPlayersMap($mmbase))
|
||||
#end
|
||||
|
||||
<div class="tab-content" id="registration-tab">
|
||||
<div id="reg-view">
|
||||
<div id="list-header">
|
||||
@@ -33,14 +53,18 @@
|
||||
<th>First name</th>
|
||||
<th>Country</th>
|
||||
<th>Club</th>
|
||||
##if($tour.country == 'FR')
|
||||
## <th>FFG</th>
|
||||
##else
|
||||
#if($utils.showRatings('egf', $tour.country.toLowerCase()))
|
||||
<th>PIN</th>
|
||||
##end
|
||||
#end
|
||||
#if($utils.showRatings('ffg', $tour.country.toLowerCase()))
|
||||
<th>FFG</th>
|
||||
#end
|
||||
<th>Rank</th>
|
||||
## TableSort bug which inverts specified sort...
|
||||
<th data-sort-default="1" aria-sort="ascending">Rating</th>
|
||||
#if($tour.type == 'INDIVIDUAL' && $tour.pairing.type == 'MAC_MAHON')
|
||||
<th>MMS</th>
|
||||
#end
|
||||
<th>Participation</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -54,13 +78,18 @@
|
||||
<td>$part.firstname</td>
|
||||
<td>$part.country.toUpperCase()</td>
|
||||
<td>$part.club</td>
|
||||
#if($tour.country == 'FR')
|
||||
<td>$!part.ffg</td>
|
||||
#else
|
||||
<td>$!part.egf</td>
|
||||
#if($utils.showRatings('egf', $tour.country.toLowerCase()))
|
||||
<td>$!part.egf </td>
|
||||
#end
|
||||
<td data-sort="$part.rank">#rank($part.rank)#if($part.mmsCorrection) (#if($part.mmsCorrection > 0)+#end$part.mmsCorrection)#end</td>
|
||||
#if($utils.showRatings('ffg', $tour.country.toLowerCase()))
|
||||
<td>$!part.ffg</td>
|
||||
#end
|
||||
## display MMS correction on the screen, but not when printed
|
||||
<td data-sort="$part.rank">#rank($part.rank)#if($part.mmsCorrection)<span class="noprint"> (#if($part.mmsCorrection > 0)+#end$part.mmsCorrection)</span>#end</td>
|
||||
<td>$part.rating</td>
|
||||
#if($tour.type == 'INDIVIDUAL' && $tour.pairing.type == 'MAC_MAHON')
|
||||
<td>$!mmsPlayersMap[$part.id]</td>
|
||||
#end
|
||||
<td class="participating" data-sort="#if($part.skip)$part.skip.size()/part.skip#{else}0#end">
|
||||
<div class="participation">
|
||||
#foreach($round in [1..$tour.rounds])
|
||||
@@ -108,7 +137,15 @@
|
||||
</div>
|
||||
</div>
|
||||
#end
|
||||
<div class="needle eight wide field">
|
||||
#set($needleWidth = 12)
|
||||
#if($utils.displayRatings('egf', $tour.country.toLowerCase()))
|
||||
#set($needleWidth = $needleWidth - 2)
|
||||
#end
|
||||
#if($utils.displayRatings('ffg', $tour.country.toLowerCase()))
|
||||
#set($needleWidth = $needleWidth - 2)
|
||||
#end
|
||||
#set($cssWidth = { 8: 'eight', 10: 'ten', 12: 'twelve' })
|
||||
<div class="needle $cssWidth[$needleWidth] wide field">
|
||||
<div class="ui icon input">
|
||||
<input id="needle" name="needle" type="text" placeholder="Search..." spellcheck="false">
|
||||
<i id="clear-search" class="clickable close icon"></i>
|
||||
@@ -125,6 +162,7 @@
|
||||
</div>
|
||||
</div>
|
||||
*#
|
||||
#if($utils.displayRatings('egf', $tour.country.toLowerCase()))
|
||||
<div class="two wide centered field">
|
||||
<div class="toggle" title="${utils.ratingsDates.egf|'no egf ratings'}">
|
||||
<input id="egf" name="egf" type="checkbox" checked value="true"/>
|
||||
@@ -134,6 +172,8 @@
|
||||
<label>EGF</label>
|
||||
</div>
|
||||
</div>
|
||||
#end
|
||||
#if($utils.displayRatings('ffg', $tour.country.toLowerCase()))
|
||||
<div class="two wide centered field">
|
||||
<div class="toggle" title="${utils.ratingsDates.ffg|'no ffg ratings'}">
|
||||
<input id="ffg" name="ffg" type="checkbox" checked value="true"/>
|
||||
@@ -143,8 +183,9 @@
|
||||
<label>FFG</label>
|
||||
</div>
|
||||
</div>
|
||||
#end
|
||||
<div class="two wide centered field">
|
||||
<div class="toggle" title="${utils.ratingsDates.ffg|'no ffg ratings'}">
|
||||
<div class="toggle" title="browse">
|
||||
<input id="browse" name="browse" type="checkbox" value="true"/>
|
||||
<div class="search-param checkbox">
|
||||
<div class="circle"></div>
|
||||
@@ -249,21 +290,6 @@
|
||||
</div>
|
||||
</div>
|
||||
#if($tour.type == 'INDIVIDUAL' && $tour.pairing.type == 'MAC_MAHON')
|
||||
#set($mmbase = $api.get("tour/${params.id}/standings/0"))
|
||||
#if($mmbase.isObject() && ($mmbase.error || $mmbase.message))
|
||||
#if($mmbase.error)
|
||||
#set($error = $mmbase.error)
|
||||
#else
|
||||
#set($error = $mmbase.message)
|
||||
#end
|
||||
<script type="text/javascript">
|
||||
onLoad(() => {
|
||||
showError("$error")
|
||||
});
|
||||
</script>
|
||||
#set($mmbase = [])
|
||||
#end
|
||||
#set($mmsMap = $utils.getMmsMap($mmbase))
|
||||
<div id="macmahon-groups" class="wide popup">
|
||||
<div class="popup-body">
|
||||
<div class="popup-content">
|
||||
|
@@ -20,6 +20,7 @@
|
||||
<th data-sort-method="number">table</th>
|
||||
<th>white</th>
|
||||
<th>black</th>
|
||||
<th>hd</th>
|
||||
<th>result</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -32,6 +33,7 @@
|
||||
<td data-sort="$game.t">${game.t}.</td>
|
||||
<td class="white player #if($game.r == 'w' || $game.r == '#') winner #elseif($game.r == 'b' || $game.r == '0') looser #end" data-id="$white.id" data-sort="$white.name#if($white.firstname) $white.firstname#end"><span>#if($white)$white.name#if($white.firstname) $white.firstname#end #rank($white.rank)#{else}BIP#end</span></td>
|
||||
<td class="black player #if($game.r == 'b' || $game.r == '#') winner #elseif($game.r == 'w' || $game.r == '0') looser #end" data-id="$black.id" data-sort="$black.name#if($black.firstname) $black.firstname#end"><span>#if($black)$black.name#if($black.firstname) $black.firstname#end #rank($black.rank)#{else}BIP#end</span></td>
|
||||
<td class="handicap centered">$!game.h</td>
|
||||
<td class="result centered" data-sort="$game.r" data-result="$game.r">$dispRst[$game.r]</td>
|
||||
</tr>
|
||||
#end
|
||||
|
@@ -44,6 +44,10 @@
|
||||
});
|
||||
</script>
|
||||
#set($standings = [])
|
||||
#end
|
||||
#set($smap = {})
|
||||
#foreach($part in $standings)
|
||||
#set($smap[$part.num] = $part)
|
||||
#end
|
||||
<table id="standings-table" class="ui striped table">
|
||||
<thead>
|
||||
@@ -56,31 +60,45 @@
|
||||
#foreach($r in [1..$round])
|
||||
<th>R$r</th>
|
||||
#end
|
||||
#set($criteres = [])
|
||||
#foreach($crit in $tour.pairing.placement)
|
||||
#set($junk = $criteres.add($crit))
|
||||
#end
|
||||
#if($criteres[0] == 'SCOREX')
|
||||
#set($junk = $criteres.add(1, 'MMS'))
|
||||
#end
|
||||
#foreach($crit in $criteres)
|
||||
<th>$crit</th>
|
||||
#end
|
||||
</thead>
|
||||
<tbody>
|
||||
#foreach($part in $standings)
|
||||
<tr>
|
||||
<tr data-id="$part.id">
|
||||
<td>$part.num</td>
|
||||
<td>$part.place</td>
|
||||
<td>$part.name#if($part.firstname) $part.firstname#end</td>
|
||||
<td>$esc.html($part.name)#if($part.firstname) $esc.html($part.firstname)#end</td>
|
||||
<td data-sort="$part.rank">#rank($part.rank)</td>
|
||||
<td>#if($part.country)$part.country#end</td>
|
||||
<td>$number.format('0.#', $part.NBW)</td>
|
||||
#set($mx = $round - 1)
|
||||
#foreach($r in [0..$mx])
|
||||
#set($rst = $part.results[$r])
|
||||
#set($opp_num = $math.toLong($rst))
|
||||
#if($opp_num)
|
||||
#set($opponent = $!smap[$opp_num])
|
||||
#else
|
||||
#set($opponent = false)
|
||||
#end
|
||||
#if($rst.contains('+'))
|
||||
#set($rst = "<b>$rst</b>")
|
||||
#elseif($rst.contains('-'))
|
||||
#set($rst = "<i>$rst</i>")
|
||||
#end
|
||||
<td class="nobreak">$rst</td>
|
||||
<td class="nobreak game-result" #if($opponent)title="$esc.html($opponent.name)#if($opponent.firstname) $esc.html($opponent.firstname)#end #rank($opponent.rank)#if($opponent.country) $opponent.country#end"#end>$rst</td>
|
||||
#end
|
||||
#foreach($crit in $tour.pairing.placement)
|
||||
<td>$number.format('0.#', $part[$crit])</td>
|
||||
#foreach($crit in $criteres)
|
||||
#set($value = "$number.format('0.#', $part[$crit])")
|
||||
<td data-sort="$value">$value.replace('.5', '½')</td>
|
||||
#end
|
||||
</tr>
|
||||
#end
|
||||
@@ -88,6 +106,12 @@
|
||||
</table>
|
||||
</div>
|
||||
<div class="right form-actions">
|
||||
#if(!$tour.frozen && $round == $tour.rounds)
|
||||
<button id="freeze" class="ui orange floating right labeled icon button">
|
||||
<i class="snowflake plane outline icon"></i>
|
||||
Freeze
|
||||
</button>
|
||||
#end
|
||||
<button id="publish" class="ui yellow floating right labeled icon button">
|
||||
<i class="paper plane outline icon"></i>
|
||||
Publish
|
||||
|
@@ -26,7 +26,20 @@
|
||||
#if($tour)
|
||||
#set($round = $math.toInteger($!params.round))
|
||||
#if(!$round)
|
||||
#set($round = 1)
|
||||
#set($lastCompleteRound = 0)
|
||||
#foreach($r in [1..$tour.rounds])
|
||||
#set($stats = $tour.stats[$r - 1])
|
||||
#if($stats.ready == $stats.games)
|
||||
#set($lastCompleteRound = $r)
|
||||
#else
|
||||
#break
|
||||
#end
|
||||
#end
|
||||
#if($lastCompleteRound)
|
||||
#set($round = $math.min($lastCompleteRound + 1, $tour.rounds))
|
||||
#else
|
||||
#set($round = 1)
|
||||
#end
|
||||
#else
|
||||
#set($round = $math.min($math.max($round, 1), $tour.rounds))
|
||||
#end
|
||||
|
Reference in New Issue
Block a user