@shzlx/ui-default 4.58.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/README.md +5 -0
  2. package/api.ts +61 -0
  3. package/backendlib/builder.ts +182 -0
  4. package/backendlib/markdown-it-imsize.ts +235 -0
  5. package/backendlib/markdown-it-katex.ts +139 -0
  6. package/backendlib/markdown-it-media.ts +163 -0
  7. package/backendlib/markdown-it-xss.ts +200 -0
  8. package/backendlib/markdown.js +64 -0
  9. package/backendlib/misc.ts +54 -0
  10. package/backendlib/template.ts +279 -0
  11. package/breakpoints.json +5 -0
  12. package/components/DOMAttachedObject.ts +128 -0
  13. package/components/autocomplete/AssignSelectAutoComplete.tsx +22 -0
  14. package/components/autocomplete/CustomSelectAutoComplete.tsx +23 -0
  15. package/components/autocomplete/DomainSelectAutoComplete.tsx +18 -0
  16. package/components/autocomplete/FileSelectAutoComplete.tsx +26 -0
  17. package/components/autocomplete/LanguageSelectAutoComplete.tsx +24 -0
  18. package/components/autocomplete/ProblemSelectAutoComplete.tsx +18 -0
  19. package/components/autocomplete/UserSelectAutoComplete.tsx +23 -0
  20. package/components/autocomplete/components/AssignSelectAutoComplete.tsx +118 -0
  21. package/components/autocomplete/components/DomainSelectAutoComplete.tsx +53 -0
  22. package/components/autocomplete/components/FileSelectAutoComplete.tsx +50 -0
  23. package/components/autocomplete/components/LanguageSelectAutoComplete.tsx +48 -0
  24. package/components/autocomplete/components/ProblemSelectAutoComplete.tsx +54 -0
  25. package/components/autocomplete/components/UserSelectAutoComplete.tsx +54 -0
  26. package/components/autocomplete/domainselectautocomplete.page.styl +6 -0
  27. package/components/autocomplete/index.tsx +110 -0
  28. package/components/autocomplete/problemselectautocomplete.page.styl +6 -0
  29. package/components/autocomplete/userselectautocomplete.page.styl +6 -0
  30. package/components/browser-update.page.ts +27 -0
  31. package/components/calendar/calendar.page.styl +129 -0
  32. package/components/calendar/index.js +367 -0
  33. package/components/clipboard.page.ts +23 -0
  34. package/components/contest/contest.page.styl +119 -0
  35. package/components/contest/contest.page.ts +23 -0
  36. package/components/contest/contest_sidebar.page.styl +21 -0
  37. package/components/contest/problem-contest-bg.png +0 -0
  38. package/components/contest/problem-contest-bg@2x.png +0 -0
  39. package/components/customFont.page.tsx +90 -0
  40. package/components/datepicker/datepicker.page.tsx +94 -0
  41. package/components/dialog/DomDialog.ts +145 -0
  42. package/components/dialog/dialog.page.styl +40 -0
  43. package/components/dialog/index.tsx +285 -0
  44. package/components/discussion/CommentBox.js +103 -0
  45. package/components/discussion/collapsible.page.styl +40 -0
  46. package/components/discussion/collapsible.page.tsx +62 -0
  47. package/components/discussion/comments.page.styl +142 -0
  48. package/components/discussion/comments.page.tsx +192 -0
  49. package/components/discussion/discussion.page.styl +17 -0
  50. package/components/discussion/history.page.tsx +81 -0
  51. package/components/discussion/reaction.page.styl +30 -0
  52. package/components/discussion/reaction.page.tsx +103 -0
  53. package/components/drop/drop.page.styl +40 -0
  54. package/components/dropdown/Dropdown.js +50 -0
  55. package/components/dropdown/dropdown.page.styl +33 -0
  56. package/components/dropdown/dropdown.page.ts +8 -0
  57. package/components/editor/cmeditor.page.ts +23 -0
  58. package/components/editor/cmeditor.styl +10 -0
  59. package/components/editor/index.tsx +293 -0
  60. package/components/editor/mdeditor.ts +60 -0
  61. package/components/editor/textareaHandler.ts +29 -0
  62. package/components/footer/footer.page.styl +94 -0
  63. package/components/footer/footer.page.ts +26 -0
  64. package/components/form/button.page.default.styl +59 -0
  65. package/components/form/button.page.styl +36 -0
  66. package/components/form/checkbox.page.styl +89 -0
  67. package/components/form/form.page.styl +200 -0
  68. package/components/form/form.page.ts +20 -0
  69. package/components/form/multiSelectCheckbox.page.js +46 -0
  70. package/components/form/radiobox.page.styl +62 -0
  71. package/components/form/select.page.styl +29 -0
  72. package/components/form/textbox.page.styl +79 -0
  73. package/components/form/textbox.page.ts +21 -0
  74. package/components/form/var.inc.styl +14 -0
  75. package/components/header/header.page.styl +79 -0
  76. package/components/highlighter/code-example.js +111 -0
  77. package/components/highlighter/highlighter.page.styl +99 -0
  78. package/components/highlighter/highlighter.page.ts +72 -0
  79. package/components/highlighter/meta.js +15 -0
  80. package/components/highlighter/prismjs.js +122 -0
  81. package/components/hint.page.styl +9 -0
  82. package/components/hint.ts +19 -0
  83. package/components/hitokoto/index.page.js +21 -0
  84. package/components/hotkey/hotkey.page.js +83 -0
  85. package/components/katex/katex.page.js +26 -0
  86. package/components/katex/katex.page.styl +2 -0
  87. package/components/languageselect.tsx +94 -0
  88. package/components/loader/loader.page.styl +40 -0
  89. package/components/mantine.page.tsx +39 -0
  90. package/components/marker/Marker.js +192 -0
  91. package/components/marker/MarkerReactive.js +55 -0
  92. package/components/marker/marker.page.js +8 -0
  93. package/components/marker/marker.page.styl +57 -0
  94. package/components/media/media.page.js +46 -0
  95. package/components/menu/menu-heading.page.js +28 -0
  96. package/components/menu/menu.page.js +18 -0
  97. package/components/menu/menu.page.styl +68 -0
  98. package/components/message/index.page.ts +166 -0
  99. package/components/message/worker.ts +110 -0
  100. package/components/messagepad/DialogueListItem.page.styl +28 -0
  101. package/components/messagepad/DialogueListItemComponent.jsx +39 -0
  102. package/components/messagepad/Message.page.styl +64 -0
  103. package/components/messagepad/MessageComponent.jsx +33 -0
  104. package/components/messagepad/MessagePad.page.styl +99 -0
  105. package/components/messagepad/MessagePadDialogueContentContainer.jsx +104 -0
  106. package/components/messagepad/MessagePadDialogueListContainer.jsx +49 -0
  107. package/components/messagepad/MessagePadInputContainer.jsx +100 -0
  108. package/components/messagepad/index.jsx +49 -0
  109. package/components/messagepad/reducers/activeId.ts +36 -0
  110. package/components/messagepad/reducers/dialogues.js +53 -0
  111. package/components/messagepad/reducers/index.ts +14 -0
  112. package/components/messagepad/reducers/inputs.js +43 -0
  113. package/components/messagepad/reducers/isPosting.ts +49 -0
  114. package/components/monaco/index.ts +178 -0
  115. package/components/monaco/languages/markdown.ts +97 -0
  116. package/components/monaco/languages/typescript.ts +45 -0
  117. package/components/monaco/languages/yaml.ts +22 -0
  118. package/components/monaco/loader.ts +96 -0
  119. package/components/monaco/monaco.styl +30 -0
  120. package/components/monaco/nls.js +31 -0
  121. package/components/monaco/schema/problemconfig.ts +123 -0
  122. package/components/navigation/hamburgers.page.styl +87 -0
  123. package/components/navigation/nav-logo-small_dark.png +0 -0
  124. package/components/navigation/navigation.page.js +203 -0
  125. package/components/navigation/navigation.page.styl +211 -0
  126. package/components/notification/index.ts +105 -0
  127. package/components/notification/notification.page.js +14 -0
  128. package/components/notification/notification.page.styl +84 -0
  129. package/components/nprogress.page.styl +50 -0
  130. package/components/omnisearch/index.page.tsx +124 -0
  131. package/components/omnisearch/omnibar.page.styl +138 -0
  132. package/components/pager/pager.page.styl +57 -0
  133. package/components/preview/preview.page.ts +187 -0
  134. package/components/problem/create.page.js +12 -0
  135. package/components/problem/list.page.js +9 -0
  136. package/components/problem/rp.page.styl +4 -0
  137. package/components/problem/tag.page.styl +84 -0
  138. package/components/problemconfig/BasicForm.tsx +92 -0
  139. package/components/problemconfig/ProblemConfigEditor.tsx +170 -0
  140. package/components/problemconfig/ProblemConfigForm.tsx +140 -0
  141. package/components/problemconfig/ProblemConfigTree.tsx +163 -0
  142. package/components/problemconfig/ProblemType.tsx +165 -0
  143. package/components/problemconfig/index.tsx +91 -0
  144. package/components/problemconfig/reducer/config.ts +173 -0
  145. package/components/problemconfig/reducer/index.ts +11 -0
  146. package/components/problemconfig/reducer/testdata.ts +16 -0
  147. package/components/problemconfig/tree/AddTestcase.tsx +137 -0
  148. package/components/problemconfig/tree/SelectionManager.tsx +140 -0
  149. package/components/problemconfig/tree/SubtaskSettings.tsx +180 -0
  150. package/components/problemconfig/tree/Testcase.tsx +98 -0
  151. package/components/profile/backgrounds/1.jpg +0 -0
  152. package/components/profile/backgrounds/10.jpg +0 -0
  153. package/components/profile/backgrounds/11.jpg +0 -0
  154. package/components/profile/backgrounds/12.jpg +0 -0
  155. package/components/profile/backgrounds/13.jpg +0 -0
  156. package/components/profile/backgrounds/14.jpg +0 -0
  157. package/components/profile/backgrounds/15.jpg +0 -0
  158. package/components/profile/backgrounds/16.jpg +0 -0
  159. package/components/profile/backgrounds/17.jpg +0 -0
  160. package/components/profile/backgrounds/18.jpg +0 -0
  161. package/components/profile/backgrounds/19.jpg +0 -0
  162. package/components/profile/backgrounds/2.jpg +0 -0
  163. package/components/profile/backgrounds/20.jpg +0 -0
  164. package/components/profile/backgrounds/21.jpg +0 -0
  165. package/components/profile/backgrounds/3.jpg +0 -0
  166. package/components/profile/backgrounds/4.jpg +0 -0
  167. package/components/profile/backgrounds/5.jpg +0 -0
  168. package/components/profile/backgrounds/6.jpg +0 -0
  169. package/components/profile/backgrounds/7.jpg +0 -0
  170. package/components/profile/backgrounds/8.jpg +0 -0
  171. package/components/profile/backgrounds/9.jpg +0 -0
  172. package/components/profile/backgrounds/gen_thumbnails.sh +7 -0
  173. package/components/profile/backgrounds/thumbnail/1.jpg +0 -0
  174. package/components/profile/backgrounds/thumbnail/10.jpg +0 -0
  175. package/components/profile/backgrounds/thumbnail/11.jpg +0 -0
  176. package/components/profile/backgrounds/thumbnail/12.jpg +0 -0
  177. package/components/profile/backgrounds/thumbnail/13.jpg +0 -0
  178. package/components/profile/backgrounds/thumbnail/14.jpg +0 -0
  179. package/components/profile/backgrounds/thumbnail/15.jpg +0 -0
  180. package/components/profile/backgrounds/thumbnail/16.jpg +0 -0
  181. package/components/profile/backgrounds/thumbnail/17.jpg +0 -0
  182. package/components/profile/backgrounds/thumbnail/18.jpg +0 -0
  183. package/components/profile/backgrounds/thumbnail/19.jpg +0 -0
  184. package/components/profile/backgrounds/thumbnail/2.jpg +0 -0
  185. package/components/profile/backgrounds/thumbnail/20.jpg +0 -0
  186. package/components/profile/backgrounds/thumbnail/21.jpg +0 -0
  187. package/components/profile/backgrounds/thumbnail/3.jpg +0 -0
  188. package/components/profile/backgrounds/thumbnail/4.jpg +0 -0
  189. package/components/profile/backgrounds/thumbnail/5.jpg +0 -0
  190. package/components/profile/backgrounds/thumbnail/6.jpg +0 -0
  191. package/components/profile/backgrounds/thumbnail/7.jpg +0 -0
  192. package/components/profile/backgrounds/thumbnail/8.jpg +0 -0
  193. package/components/profile/backgrounds/thumbnail/9.jpg +0 -0
  194. package/components/profile/profile.page.styl +23 -0
  195. package/components/react/DomComponent.tsx +14 -0
  196. package/components/react/IconComponent.tsx +20 -0
  197. package/components/record/record.page.styl +26 -0
  198. package/components/rotator/index.js +75 -0
  199. package/components/rotator/rotator.page.styl +20 -0
  200. package/components/scratchpad/DataInput.page.styl +17 -0
  201. package/components/scratchpad/DataInputComponent.jsx +45 -0
  202. package/components/scratchpad/Editor.page.styl +13 -0
  203. package/components/scratchpad/Panel.page.styl +18 -0
  204. package/components/scratchpad/PanelButton.page.styl +15 -0
  205. package/components/scratchpad/PanelButtonComponent.jsx +19 -0
  206. package/components/scratchpad/PanelComponent.jsx +25 -0
  207. package/components/scratchpad/ScratchpadEditorContainer.tsx +137 -0
  208. package/components/scratchpad/ScratchpadPretestContainer.jsx +57 -0
  209. package/components/scratchpad/ScratchpadRecordsContainer.jsx +45 -0
  210. package/components/scratchpad/ScratchpadRecordsRowContainer.jsx +83 -0
  211. package/components/scratchpad/ScratchpadSettings.tsx +48 -0
  212. package/components/scratchpad/ScratchpadToolbarContainer.jsx +190 -0
  213. package/components/scratchpad/Tab.page.styl +24 -0
  214. package/components/scratchpad/Toolbar.page.styl +53 -0
  215. package/components/scratchpad/ToolbarComponent.jsx +85 -0
  216. package/components/scratchpad/index.tsx +132 -0
  217. package/components/scratchpad/reducers/editor.ts +24 -0
  218. package/components/scratchpad/reducers/index.ts +17 -0
  219. package/components/scratchpad/reducers/pretest.ts +34 -0
  220. package/components/scratchpad/reducers/records.ts +40 -0
  221. package/components/scratchpad/reducers/state.ts +10 -0
  222. package/components/scratchpad/reducers/ui.ts +152 -0
  223. package/components/scratchpad/scratchpad.page.styl +55 -0
  224. package/components/scratchpad/var.inc.styl +2 -0
  225. package/components/selectUser.tsx +16 -0
  226. package/components/signin/signInDialog.page.js +84 -0
  227. package/components/signin/signin_dialog.page.styl +57 -0
  228. package/components/smoothscroll/smoothscroll.page.js +44 -0
  229. package/components/socket/index.ts +68 -0
  230. package/components/star/star.page.styl +20 -0
  231. package/components/star/star.page.ts +58 -0
  232. package/components/sticky/sticky.page.js +66 -0
  233. package/components/tab/Tab.js +168 -0
  234. package/components/tab/tab.page.js +9 -0
  235. package/components/tab/tab.page.styl +105 -0
  236. package/components/tab/var.inc.styl +3 -0
  237. package/components/table/StyledTable.js +51 -0
  238. package/components/table/styledTable.page.js +8 -0
  239. package/components/table/table.page.styl +73 -0
  240. package/components/time/time.page.js +47 -0
  241. package/components/tooltip/Tooltip.js +49 -0
  242. package/components/tooltip/tooltip.page.js +29 -0
  243. package/components/tooltip/tooltip.page.styl +69 -0
  244. package/components/training/training.page.styl +25 -0
  245. package/components/upload.tsx +103 -0
  246. package/components/vote/vote.page.js +43 -0
  247. package/components/zipDownloader/index.ts +157 -0
  248. package/constant/domain.js +21 -0
  249. package/constant/message.js +5 -0
  250. package/constant/record.js +52 -0
  251. package/context.ts +11 -0
  252. package/entry.js +72 -0
  253. package/hydro.ts +112 -0
  254. package/index.ts +226 -0
  255. package/lazyload.ts +69 -0
  256. package/locales/en.yaml +71 -0
  257. package/locales/ko.yaml +823 -0
  258. package/locales/zh.yaml +1137 -0
  259. package/locales/zh_TW.yaml +1133 -0
  260. package/misc/Page.ts +49 -0
  261. package/misc/PageLoader.js +31 -0
  262. package/misc/float.styl +14 -0
  263. package/misc/grid.styl +1048 -0
  264. package/misc/immersive-background.jpg +0 -0
  265. package/misc/immersive-background@2x.jpg +0 -0
  266. package/misc/immersive.styl +23 -0
  267. package/misc/nothing.styl +13 -0
  268. package/misc/puzzled_twd2.svg +1 -0
  269. package/misc/section.styl +105 -0
  270. package/misc/slideout.styl +46 -0
  271. package/misc/structure.styl +158 -0
  272. package/misc/textalign.styl +11 -0
  273. package/misc/typography.styl +485 -0
  274. package/package.json +148 -0
  275. package/polyfill.ts +90 -0
  276. package/postcss.config.js +15 -0
  277. package/sentry.ts +26 -0
  278. package/service-worker.ts +265 -0
  279. package/setting.yaml +98 -0
  280. package/templates/about.html +14 -0
  281. package/templates/bsod.html +35 -0
  282. package/templates/components/comments_discussion.html +165 -0
  283. package/templates/components/comments_solution.html +171 -0
  284. package/templates/components/contest.html +12 -0
  285. package/templates/components/form.html +214 -0
  286. package/templates/components/home.html +20 -0
  287. package/templates/components/homework.html +8 -0
  288. package/templates/components/md_hint.html +39 -0
  289. package/templates/components/noscript_note.html +15 -0
  290. package/templates/components/nothing.html +6 -0
  291. package/templates/components/paginator.html +25 -0
  292. package/templates/components/problem.html +33 -0
  293. package/templates/components/record.html +21 -0
  294. package/templates/components/sidemenu.html +11 -0
  295. package/templates/components/user.html +49 -0
  296. package/templates/contest_balloon.html +48 -0
  297. package/templates/contest_clarification.html +103 -0
  298. package/templates/contest_detail.html +56 -0
  299. package/templates/contest_edit.html +259 -0
  300. package/templates/contest_main.html +146 -0
  301. package/templates/contest_manage.html +80 -0
  302. package/templates/contest_print.html +27 -0
  303. package/templates/contest_problemlist.html +231 -0
  304. package/templates/contest_scoreboard.html +46 -0
  305. package/templates/contest_scoreboard_download_html.html +71 -0
  306. package/templates/contest_user.html +47 -0
  307. package/templates/discussion_create.html +28 -0
  308. package/templates/discussion_detail.html +149 -0
  309. package/templates/discussion_edit.html +30 -0
  310. package/templates/discussion_main_or_node.html +47 -0
  311. package/templates/domain_base.html +26 -0
  312. package/templates/domain_create.html +55 -0
  313. package/templates/domain_dashboard.html +45 -0
  314. package/templates/domain_edit.html +6 -0
  315. package/templates/domain_group.html +51 -0
  316. package/templates/domain_join.html +47 -0
  317. package/templates/domain_join_applications.html +67 -0
  318. package/templates/domain_permission.html +66 -0
  319. package/templates/domain_role.html +71 -0
  320. package/templates/domain_user.html +86 -0
  321. package/templates/domain_user_raw.html +5 -0
  322. package/templates/error.html +25 -0
  323. package/templates/home_domain.html +64 -0
  324. package/templates/home_files.html +16 -0
  325. package/templates/home_messages.html +9 -0
  326. package/templates/home_security.html +224 -0
  327. package/templates/home_settings.html +21 -0
  328. package/templates/homework_detail.html +82 -0
  329. package/templates/homework_edit.html +138 -0
  330. package/templates/homework_files.html +24 -0
  331. package/templates/homework_main.html +76 -0
  332. package/templates/layout/basic.html +27 -0
  333. package/templates/layout/home_base.html +13 -0
  334. package/templates/layout/html5.html +74 -0
  335. package/templates/layout/immersive.html +22 -0
  336. package/templates/layout/mail.html +31 -0
  337. package/templates/layout/simple.html +4 -0
  338. package/templates/layout/wiki_base.html +16 -0
  339. package/templates/main.html +22 -0
  340. package/templates/manage_base.html +24 -0
  341. package/templates/manage_config.html +6 -0
  342. package/templates/manage_dashboard.html +27 -0
  343. package/templates/manage_script.html +56 -0
  344. package/templates/manage_setting.html +6 -0
  345. package/templates/manage_user_import.html +23 -0
  346. package/templates/manage_user_priv.html +76 -0
  347. package/templates/partials/category.html +19 -0
  348. package/templates/partials/contest.html +3 -0
  349. package/templates/partials/contest_balloon.html +37 -0
  350. package/templates/partials/contest_sidebar.html +150 -0
  351. package/templates/partials/contest_sidebar_management.html +56 -0
  352. package/templates/partials/contest_user.html +19 -0
  353. package/templates/partials/discussion_edit_form.html +45 -0
  354. package/templates/partials/discussion_list.html +50 -0
  355. package/templates/partials/discussion_nodes_widget.html +17 -0
  356. package/templates/partials/files.html +49 -0
  357. package/templates/partials/footer.html +108 -0
  358. package/templates/partials/hamburger.html +7 -0
  359. package/templates/partials/header_mobile.html +12 -0
  360. package/templates/partials/homepage/bulletin.html +7 -0
  361. package/templates/partials/homepage/contest.html +48 -0
  362. package/templates/partials/homepage/discussion.html +13 -0
  363. package/templates/partials/homepage/discussion_nodes.html +4 -0
  364. package/templates/partials/homepage/error.html +5 -0
  365. package/templates/partials/homepage/hitokoto.html +6 -0
  366. package/templates/partials/homepage/homework.html +45 -0
  367. package/templates/partials/homepage/problem_search.html +13 -0
  368. package/templates/partials/homepage/ranking.html +39 -0
  369. package/templates/partials/homepage/recent_problems.html +17 -0
  370. package/templates/partials/homepage/starred_problems.html +15 -0
  371. package/templates/partials/homepage/suggestion.html +34 -0
  372. package/templates/partials/homepage/training.html +50 -0
  373. package/templates/partials/homework.html +3 -0
  374. package/templates/partials/homework_default_penalty_rules.yaml +6 -0
  375. package/templates/partials/homework_sidebar.html +93 -0
  376. package/templates/partials/login_dialog.html +56 -0
  377. package/templates/partials/manage_user_priv.html +78 -0
  378. package/templates/partials/nav.html +138 -0
  379. package/templates/partials/problem-sidebar-information.html +25 -0
  380. package/templates/partials/problem.html +2 -0
  381. package/templates/partials/problem_category_dialog.html +43 -0
  382. package/templates/partials/problem_default.md +26 -0
  383. package/templates/partials/problem_description.html +33 -0
  384. package/templates/partials/problem_files.html +63 -0
  385. package/templates/partials/problem_list.html +68 -0
  386. package/templates/partials/problem_lucky.html +10 -0
  387. package/templates/partials/problem_sidebar.html +14 -0
  388. package/templates/partials/problem_sidebar_contest.html +43 -0
  389. package/templates/partials/problem_sidebar_homework.html +42 -0
  390. package/templates/partials/problem_sidebar_normal.html +152 -0
  391. package/templates/partials/problem_stat.html +3 -0
  392. package/templates/partials/scoreboard.html +79 -0
  393. package/templates/partials/setting.html +92 -0
  394. package/templates/partials/training_default.json +14 -0
  395. package/templates/partials/training_detail.html +153 -0
  396. package/templates/partials/user.html +2 -0
  397. package/templates/partials/user_detail/activity.html +18 -0
  398. package/templates/partials/user_detail/solution.html +29 -0
  399. package/templates/problem_config.html +39 -0
  400. package/templates/problem_detail.html +150 -0
  401. package/templates/problem_edit.html +111 -0
  402. package/templates/problem_files.html +91 -0
  403. package/templates/problem_hack.html +41 -0
  404. package/templates/problem_import.html +58 -0
  405. package/templates/problem_main.html +100 -0
  406. package/templates/problem_solution.html +55 -0
  407. package/templates/problem_statistics.html +96 -0
  408. package/templates/problem_submit.html +40 -0
  409. package/templates/ranking.html +81 -0
  410. package/templates/record_detail.html +134 -0
  411. package/templates/record_detail_status.html +93 -0
  412. package/templates/record_detail_summary.html +19 -0
  413. package/templates/record_main.html +142 -0
  414. package/templates/record_main_tr.html +35 -0
  415. package/templates/status.html +75 -0
  416. package/templates/training_detail.html +120 -0
  417. package/templates/training_edit.html +68 -0
  418. package/templates/training_files.html +64 -0
  419. package/templates/training_main.html +107 -0
  420. package/templates/user_changemail_mail.html +6 -0
  421. package/templates/user_changemail_mail_sent.html +9 -0
  422. package/templates/user_delete_pending.html +10 -0
  423. package/templates/user_detail.html +181 -0
  424. package/templates/user_login.html +46 -0
  425. package/templates/user_logout.html +13 -0
  426. package/templates/user_lostpass.html +27 -0
  427. package/templates/user_lostpass_mail.html +6 -0
  428. package/templates/user_lostpass_mail_sent.html +9 -0
  429. package/templates/user_lostpass_with_code.html +29 -0
  430. package/templates/user_register.html +22 -0
  431. package/templates/user_register_mail.html +6 -0
  432. package/templates/user_register_mail_sent.html +9 -0
  433. package/templates/user_register_with_code.html +35 -0
  434. package/templates/user_sudo.html +54 -0
  435. package/templates/user_sudo_redirect.html +18 -0
  436. package/templates/wiki_help.html +189 -0
  437. package/theme/bp6-compat.css +48 -0
  438. package/theme/dark.styl +397 -0
  439. package/theme/default.js +33 -0
  440. package/typed.d.ts +20 -0
  441. package/utils/base.ts +209 -0
  442. package/utils/base64.js +104 -0
  443. package/utils/db.ts +32 -0
  444. package/utils/index.ts +73 -0
  445. package/utils/loadReactRedux.ts +32 -0
  446. package/utils/mediaQuery.ts +13 -0
  447. package/utils/pjax.js +148 -0
  448. package/utils/slide.ts +57 -0
@@ -0,0 +1,48 @@
1
+ {% import "components/nothing.html" as nothing with context %}
2
+ {% extends "layout/basic.html" %}
3
+ {% block content %}
4
+ {{ set(UiContext, 'tdoc', tdoc) }}
5
+ <div class="row">
6
+ <div class="medium-9 columns">
7
+ <div class="section">
8
+ <div class="section__header">
9
+ <h1 class="section__title">{{ _('Balloon Status') }}</h1>
10
+ <div class="section__tools">
11
+ <button class="primary rounded button" name="set_color">{{ _('Set Color') }}</button>
12
+ </div>
13
+ </div>
14
+ {{ noscript_note.render() }}
15
+ <div class="section__body no-padding">
16
+ {% if not tdoc.balloon|length %}
17
+ {{ nothing.render('Please set the balloon color for each problem first.') }}
18
+ {% else %}
19
+ <table class="data-table record_main__table">
20
+ <colgroup>
21
+ <col class="col--status">
22
+ <col class="col--bid">
23
+ <col class="col--problem">
24
+ <col class="col--submit-by">
25
+ <col class="col--send-by">
26
+ <col class="col--awards">
27
+ </colgroup>
28
+ <thead>
29
+ <tr>
30
+ <th class="col--status record-status--border">{{ _('Status') }}</th>
31
+ <th class="col--bid">{{ _('#') }}</th>
32
+ <th class="col--problem">{{ _('Problem') }}</th>
33
+ <th class="col--submit-by">{{ _('Submit By') }}</th>
34
+ <th class="col--send-by">{{ _('Send By') }}</th>
35
+ <th class="col--awards">{{ _('Awards') }}</th>
36
+ </tr>
37
+ </thead>
38
+ {% include "partials/contest_balloon.html" %}
39
+ </table>
40
+ {% endif %}
41
+ </div>
42
+ </div>
43
+ </div>
44
+ <div class="medium-3 columns">
45
+ {% include 'partials/contest_sidebar_management.html' %}
46
+ </div>
47
+ </div>
48
+ {% endblock %}
@@ -0,0 +1,103 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% import "components/contest.html" as contest with context %}
3
+ {% import "components/problem.html" as problem with context %}
4
+ {% block content %}
5
+ {{ set(UiContext, 'tdoc', tdoc) }}
6
+ <div class="row">
7
+ <div class="medium-9 columns">
8
+ <div class="section">
9
+ <div class="section__header">
10
+ <h1 class="section__title">{{ _('Contest Clarifications') }}</h1>
11
+ <div class="section__tools">
12
+ <a href="#reply_or_broadcast" class="primary rounded button" name="broadcast" data-title="{{ _('Send Broadcast Message') }}" data-did="">{{ _('Send Broadcast Message') }}</a>
13
+ </div>
14
+ </div>
15
+ <div class="section__body">
16
+ {% if not tcdocs.length %}
17
+ {{ nothing.render('Oh, there is no clarification!', compact=true) }}
18
+ {% else %}
19
+ <ul class="dczcomments__list">
20
+ {% for doc in tcdocs %}
21
+ <li class="dczcomments__item" id="clarification_{{ doc._id }}" data-did="{{ doc._id }}">
22
+ <div class="media">
23
+ <div class="media__body top" style="max-width:100%">
24
+ <div class="clearfix">
25
+ <div class="supplementary dczcomments__supplementary">
26
+ {{_('Subject') }}: {{ contest.render_clarification_subject(tdoc,pdict,doc.subject) }} | {% if doc.owner == 0 %}<b>{{ _('Jury') }}</b>{% else %}{{ user.render_inline(udict[doc.owner], badge=false) }}{% endif %} @ {{ datetimeSpan(doc._id)|safe }}
27
+ </div>
28
+ {% if doc.owner %}
29
+ <div class="dczcomments__operations nojs--hide">
30
+ <a href="#reply_or_broadcast" name="reply" data-title="{{ _('Reply') }}#{{ doc._id }}" data-did="{{ doc._id }}"
31
+ ><span class="icon icon-reply"></span>{{ _('Reply') }}</a>
32
+ </div>
33
+ {% endif %}
34
+ </div>
35
+ <div class="typo richmedia" data-emoji-enabled>
36
+ {{ doc['content']|markdown|safe }}
37
+ </div>
38
+ </div>
39
+ </div>
40
+ <ul class="dczcomments__replies">
41
+ {%- for rdoc in doc['reply'] -%}
42
+ <li class="dczcomments__reply">
43
+ <div class="media">
44
+ <div class="media__left top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
45
+ <div class="media__body top">
46
+ <div class="clearfix">
47
+ <div class="supplementary dczcomments__supplementary">
48
+ <b>{{ _('Jury') }}</b>
49
+ </div>
50
+ </div>
51
+ <div class="typo richmedia" data-emoji-enabled>
52
+ {{ rdoc['content']|markdown|safe }}
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </li>
57
+ {%- endfor -%}
58
+ </ul>
59
+ </li>
60
+ {% endfor %}
61
+ </ul>
62
+ {% endif %}
63
+ </div>
64
+ <div id="reply_or_broadcast">
65
+ <div class="section__header">
66
+ <h1 class="section__title">{{ _('Send Broadcast Message') }}</h1>
67
+ </div>
68
+ <div class="section__body typo">
69
+ <form method="post">
70
+ <div class="clarification-container"></div>
71
+ <input type="hidden" name="operation" value="clarification">
72
+ <input type="hidden" name="did" value="">
73
+ <div class="row">
74
+ <div class="medium-12 columns form__item_subject">
75
+ <label>
76
+ {{ _('Subject') }}
77
+ <select name="subject" class="select">
78
+ <option value="0">{{ _('General Issue') }}</option>
79
+ <option value="-1">{{ _('Technical Issue') }}</option>
80
+ {% for pid in tdoc.pids %}
81
+ <option value="{{ pid }}">{{ utils.getAlphabeticId(loop.index0) }}. {{ pdict[pid].title }}</option>
82
+ {% endfor %}
83
+ </select>
84
+ </label>
85
+ </div>
86
+ <div class="medium-12 columns form__item">
87
+ <label>
88
+ {{ _('Content') }}
89
+ <textarea name="content" class="textbox" data-markdown required></textarea>
90
+ </label>
91
+ </div>
92
+ </div>
93
+ <button type="submit" class="rounded primary button">{{ _('Submit') }}</button>
94
+ </form>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ <div class="medium-3 columns">
100
+ {% include 'partials/contest_sidebar_management.html' %}
101
+ </div>
102
+ </div>
103
+ {% endblock %}
@@ -0,0 +1,56 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% import "components/contest.html" as contest with context %}
3
+ {% import "components/record.html" as record with context %}
4
+ {% import "components/problem.html" as problem with context %}
5
+ {% block content %}
6
+ {{ set(UiContext, 'tdoc', tdoc) }}
7
+ {{ set(UiContext, 'tsdoc', tsdoc) }}
8
+ <div class="row">
9
+ <div class="medium-9 columns">
10
+ <div class="section">
11
+ <div class="section__header" style="align: center">
12
+ <h1 class="section__title">{{ tdoc.title }}</h1>
13
+ </div>
14
+ <div class="section__body">
15
+ <span class="problem__tag-item">{{ _(model.contest.statusText(tdoc, tsdoc)) }}</span>
16
+ <span class="problem__tag-item icon icon-award">{{ _(model.contest.RULES[tdoc.rule].TEXT) }}</span>
17
+ <span class="problem__tag-item">{{ _('Start at') }}: {{ contest.render_time(tsdoc.startAt or tdoc.beginAt) }}</span>
18
+ <span class="problem__tag-item icon icon-schedule">{{ contest.render_duration(tdoc) }} {{ _('hour(s)') }}</span>
19
+ <span class="problem__tag-item">{{ _('Host') }}: {{ user.render_inline(udict[tdoc.owner], badge=false) }}</span>
20
+ <span class="problem__tag-item icon icon-user--multiple">{{ tdoc['attend']|default(0) }}</span>
21
+ {% if tsdoc.attend %}
22
+ <span class="problem__tag-item icon icon-check">{{ _('Attended') }}</span>
23
+ {% endif %}
24
+ </div>
25
+ </div>
26
+ <div class="section">
27
+ <div class="section__body typo richmedia">
28
+ {{ tdoc['content']|markdown|safe }}
29
+ {% if model.contest.isOngoing(tdoc, tsdoc) %}
30
+ <blockquote class="warn">
31
+ <p>{{ _('We will check code similarity after this contest.') }}</p>
32
+ </blockquote>
33
+ {% endif %}
34
+ {% if tdoc.duration %}
35
+ <blockquote class="note">
36
+ <p>{{ _('The contest is a flexible time contest. You need to complete the contest within a specified time after you attended.') }}</p>
37
+ </blockquote>
38
+ {% endif %}
39
+ </div>
40
+ </div>
41
+ {% if files.length %}
42
+ <div class="section">
43
+ <div class="section__header">
44
+ <h1 class="section__title">{{ _('Files') }}</h1>
45
+ </div>
46
+ {% set filetype = 'private' %}
47
+ {% include "partials/files.html" %}
48
+ </div>
49
+ {% endif %}
50
+ </div>
51
+ <div class="medium-3 columns">
52
+ {% set owner_udoc = udict[tdoc.owner] %}
53
+ {% include "partials/contest_sidebar.html" %}
54
+ </div>
55
+ </div>
56
+ {% endblock %}
@@ -0,0 +1,259 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% block content %}
3
+ <div class="row">
4
+ <div class="medium-9 columns">
5
+ <div class="section">
6
+ <form method="post">
7
+ <div class="section__header">
8
+ <h2 class="section__title">{{ _('Basic Info') }}</h2>
9
+ </div>
10
+ <div class="section__body">
11
+ <div class="row">
12
+ {{ form.form_select({
13
+ columns:3,
14
+ label:'Rule',
15
+ name:'rule',
16
+ options:rules,
17
+ value:tdoc['rule']|default(''),
18
+ row:false
19
+ }) }}
20
+ {{ form.form_text({
21
+ columns:9,
22
+ label:'Title',
23
+ name:'title',
24
+ placeholder:_('title'),
25
+ value:tdoc.title|default(''),
26
+ autofocus:true,
27
+ row:false
28
+ }) }}
29
+ </div>
30
+ <div class="row">
31
+ {{ form.form_text({
32
+ columns:3,
33
+ label:'Begin Date',
34
+ name:'beginAtDate',
35
+ placeholder:'YYYY-mm-dd',
36
+ value:beginAt.format('YYYY-M-D'),
37
+ date:true,
38
+ row:false
39
+ }) }}
40
+ {{ form.form_text({
41
+ columns:3,
42
+ label:'Begin Time',
43
+ name:'beginAtTime',
44
+ placeholder:'HH:MM',
45
+ value:beginAt.format('H:mm'),
46
+ time:true,
47
+ row:false
48
+ }) }}
49
+ {{ form.form_text({
50
+ columns:2,
51
+ label:'Duration (hours)',
52
+ name:'duration',
53
+ value:duration|default('3'),
54
+ row:false
55
+ }) }}
56
+ {{ form.form_text({
57
+ columns:4,
58
+ label:'End Time',
59
+ name:'endAt',
60
+ placeholder:'YYYY-mm-dd HH:MM',
61
+ value:beginAt.add(duration, 'hours').format('YYYY-M-D HH:mm'),
62
+ disabled:true,
63
+ row:false
64
+ }) }}
65
+ </div>
66
+ {{ form.form_text({
67
+ columns:12,
68
+ label:'Problems',
69
+ name:'pids',
70
+ value:pids,
71
+ placeholder:_("Seperated with ','"),
72
+ row:true
73
+ }) }}
74
+ {{ form.form_textarea({
75
+ columns:null,
76
+ label:'Description',
77
+ name:'content',
78
+ value:tdoc['content']|default(''),
79
+ markdown:true
80
+ }) }}
81
+ </div>
82
+ <div style="padding-top: 0" class="section__header">
83
+ <h2 class="section__title">{{ _('Permission Control') }}</h2>
84
+ </div>
85
+ <div class="section__body">
86
+ {{ form.form_text({
87
+ columns:12,
88
+ label:'Contest Maintainer',
89
+ name:'maintainer',
90
+ help_text:_('Allow to maintain this {0}').format(_('contest')),
91
+ value:tdoc.maintainer|default('')
92
+ }) }}
93
+ <div class="row">
94
+ {{ form.form_select({
95
+ columns:3,
96
+ label:'Permission Control',
97
+ name:'permission',
98
+ options:{
99
+ 'public': _('Public'),
100
+ 'invite': _('Require Invitation Code'),
101
+ 'assign': _('Assign User or Group')
102
+ },
103
+ value: ("public" if not tdoc._code else "invite") if not tdoc.assign|length else "assign",
104
+ disabled:true,
105
+ row:false
106
+ }) }}
107
+ <div style="display: none" data-perm="assign">
108
+ {{ form.form_text({
109
+ columns:9,
110
+ label:'Assign',
111
+ name:'assign',
112
+ placeholder:_('Group / UID'),
113
+ value:tdoc.assign|default(''),
114
+ disabled:true,
115
+ row:false
116
+ }) }}
117
+ </div>
118
+ <div style="display: none" data-perm="invite">
119
+ {{ form.form_text({
120
+ columns:9,
121
+ label:'Invitation Code',
122
+ name:'code',
123
+ placeholder:_('(leave blank if none)'),
124
+ value:tdoc._code|default(''),
125
+ disabled:true,
126
+ row:false
127
+ }) }}
128
+ </div>
129
+ </div>
130
+ </div>
131
+ <div style="padding-top: 0" class="section__header">
132
+ <h2 class="section__title">{{ _('Contest Settings') }}</h2>
133
+ </div>
134
+ <div class="section__body">
135
+ {{ form.form_text({
136
+ columns:12,
137
+ label:'Submission language limit',
138
+ name:'langs',
139
+ value:tdoc.langs|default(''),
140
+ placeholder:_("Seperated with ','"),
141
+ row:true
142
+ }) }}
143
+ <div class="row">
144
+ {{ form.form_checkbox({
145
+ columns:2,
146
+ label:'Rated',
147
+ name:'rated',
148
+ placeholder:_('Is rated'),
149
+ value:tdoc.rated|default(true),
150
+ row:false
151
+ }) }}
152
+ {{ form.form_checkbox({
153
+ columns:3,
154
+ label:'Auto hide-and show',
155
+ name:'autoHide',
156
+ placeholder:_('Auto hide problems during the contest'),
157
+ value:handler.user.hasPerm(perm.PERM_EDIT_PROBLEM) and (tdoc.autoHide|default(true)),
158
+ disabled:not handler.user.hasPerm(perm.PERM_EDIT_PROBLEM),
159
+ row:false
160
+ }) }}
161
+ {{ form.form_checkbox({
162
+ columns:3,
163
+ label:'Allow View Code',
164
+ name:'allowViewCode',
165
+ placeholder:_('Allow user view others code after contest'),
166
+ value:tdoc.allowViewCode|default(true),
167
+ row:false
168
+ }) }}
169
+ {{ form.form_checkbox({
170
+ columns:4,
171
+ label:'Allow Print',
172
+ name:'allowPrint',
173
+ placeholder:_('Allow user to print during contest'),
174
+ value:tdoc.allowPrint|default(false),
175
+ row:false
176
+ }) }}
177
+ <div style="display: none" class="contest-rule-settings contest-rule--oi contest-rule--strictioi">
178
+ {{ form.form_checkbox({
179
+ columns:4,
180
+ label:'Keep Scoreboard Hidden',
181
+ name:'keepScoreboardHidden',
182
+ placeholder:_('Keep scoreboard hidden even after contest ends'),
183
+ value:tdoc.keepScoreboardHidden|default(false),
184
+ disabled:true,
185
+ row:false
186
+ }) }}
187
+ </div>
188
+ <div style="display: none" class="contest-rule-settings contest-rule--acm contest-rule--ioi">
189
+ {{ form.form_text({
190
+ columns:4,
191
+ label:'Lock (minutes)',
192
+ name:'lock',
193
+ placeholder:_('(leave blank if none)'),
194
+ value:(((tdoc.endAt - tdoc.lockAt)/60000)|int) if tdoc.lockAt else '',
195
+ help_text:_('Freeze scoreboard with N minutes remaining'),
196
+ disabled:true,
197
+ row:false
198
+ }) }}
199
+ </div>
200
+ <div style="display: none" class="contest-rule-settings contest-rule--oi contest-rule--ioi contest-rule--ledo contest-rule--strictioi">
201
+ {{ form.form_text({
202
+ columns:4,
203
+ label:'Flexable Duration',
204
+ name:'contestDuration',
205
+ placeholder:_('(leave blank if none)'),
206
+ value:tdoc.duration|default(''),
207
+ help_text:_('Limit user to finish contest within N hours'),
208
+ disabled:true,
209
+ row:false
210
+ }) }}
211
+ </div>
212
+ </div>
213
+ <div class="row">
214
+ <div class="columns">
215
+ {% if page_name == 'contest_edit' %}
216
+ <button name="operation" value="update" type="submit" class="rounded primary button">
217
+ {{ _('Update') }}
218
+ </button>
219
+ <button name="operation" value="update" type="submit" formaction="{{ url('contest_create') }}" class="rounded button">
220
+ {{ _('Clone') }}
221
+ </button>
222
+ {% if handler.user.own(tdoc) or handler.user.hasPerm(perm.PERM_EDIT_CONTEST) %}
223
+ <button name="operation" value="delete" type="submit" class="rounded button">
224
+ {{ _('Delete') }}
225
+ </button>
226
+ {% endif %}
227
+ {% else %}
228
+ <button name="operation" value="update" type="submit" class="rounded primary button">
229
+ {{ _('Create') }}
230
+ </button>
231
+ {% endif %}
232
+ <button type="button" class="rounded button" onclick="window.history.go(-1)">
233
+ {{ _('Cancel') }}
234
+ </button>
235
+ </div>
236
+ </div>
237
+ </form>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ <div class="medium-3 columns">
242
+ {% if tdoc %}
243
+ <div class="section side">
244
+ <div class="section__header">
245
+ <h1 class="section__title">{{ _('Files') }}</h1>
246
+ <div class="section__tools">
247
+ <button class="primary rounded button" name="upload_file" data-type="public" data-sidebar="true">{{ _('Upload') }}</button>
248
+ </div>
249
+ </div>
250
+ {% set sidebar = true %}
251
+ {% set files = tdoc.files %}
252
+ {% set filetype = "public" %}
253
+ {% include "partials/files.html" %}
254
+ </div>
255
+ {% endif %}
256
+ {% include 'components/md_hint.html' %}
257
+ </div>
258
+ </div>
259
+ {% endblock %}
@@ -0,0 +1,146 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% import "components/contest.html" as contest with context %}
3
+ {% macro render_important_contest(view, title, tdoc) %}
4
+ <div class="section immersive--content section--contest {{ view }}">
5
+ <div class="media">
6
+ <div class="media__body middle">
7
+ <div class="section__body">
8
+ <div>
9
+ <h2 class="status_title">{{ _(title) }}</h2>
10
+ </div>
11
+ <h1>{{ tdoc.title }}</h1>
12
+ <ul class="info">
13
+ <li>
14
+ <span class="icon icon-award"></span>
15
+ {{ _('Rule') }}: {{ _(model.contest.RULES[tdoc['rule']].TEXT) }}
16
+ </li>
17
+ <li>
18
+ <span class="icon icon-calendar"></span>
19
+ {{ _('Start at') }}: {{ contest.render_time(tsdoc.startAt or tdoc.beginAt) }}
20
+ </li>
21
+ <li>
22
+ <span class="icon icon-schedule--fill"></span>
23
+ {{ _('Duration') }}: {{ contest.render_duration(tdoc) }} {{ _('hour(s)') }}
24
+ </li>
25
+ <li>
26
+ <span class="icon icon-user--multiple"></span>
27
+ {{ _('Partic.') }}: {{ tdoc['attend']|default(0) }}
28
+ </li>
29
+ </ul>
30
+ </div>
31
+ </div>
32
+ <div class="media__right middle">
33
+ <div class="section__body">
34
+ <a href="{{ url('contest_detail', tid=tdoc.docId) }}" class="detail-button">{{ _('View Details') }}</a>
35
+ <div class="typo text-center">
36
+ {% if tsdict[tdoc.docId].attend %}
37
+ <p><span class="icon icon-check"></span> {{ _('Attended') }}</p>
38
+ {% else %}
39
+ <p><span class="icon icon-schedule"></span> {{ _('Not Attended') }}</p>
40
+ {% endif %}
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ {% endmacro %}
47
+ {% block content %}
48
+ <div class="row">
49
+ <div class="medium-9 columns">
50
+ {%- for tdoc in tdocs -%}
51
+ {% if model.contest.isOngoing(tdoc, tsdoc) %}
52
+ {{ render_important_contest('live', 'Live...', tdoc) }}
53
+ {% elif model.contest.isUpcoming(tdoc) %}
54
+ {{ render_important_contest('ready', 'Ready (☆▽☆)', tdoc) }}
55
+ {% endif %}
56
+ {%- endfor -%}
57
+ <div class="section">
58
+ <div class="section__header">
59
+ <h1 class="section__title">{{ _('All Contests') if not rule else _('All {0} Contests').format(_(model.contest.RULES[rule].TEXT)) }}</h1>
60
+ <div class="section__tools">
61
+ <form method="get" name="filter-form">
62
+ <input type="text" class="inline compact textbox" name="q" value="{{ q }}" placeholder="{{ _('Search contests...') }}">
63
+ <select class="inline compact select" name="group">
64
+ <option value=""{% if not group %} selected{% endif %}>{{ _('All') }}</option>
65
+ {%- for g in groups -%}
66
+ <option value="{{ g }}"{% if group == g %} selected{% endif %}>{{ g }}</option>
67
+ {%- endfor -%}
68
+ {%- if not groups|length -%}
69
+ <option disabled>{{ _('No group available') }}</option>
70
+ {%- endif -%}
71
+ </select>
72
+ <select class="inline compact select" name="rule">
73
+ <option value=""{% if not rule %} selected{% endif %}>{{ _('All') }}</option>
74
+ {%- for k, v in model.contest.RULES -%}
75
+ {% if not v.hidden %}
76
+ <option value="{{ k }}"{% if rule == k %} selected{% endif %}>{{ _('All {0} Contests').format(v.TEXT) }}</option>
77
+ {% endif %}
78
+ {%- endfor -%}
79
+ </select>
80
+ <button type="submit" class="button hasjs--hide">
81
+ {{ _('Search') }}
82
+ </button>
83
+ </form>
84
+ </div>
85
+ </div>
86
+ <div class="section__body no-padding">
87
+ {% if not tdocs.length %}
88
+ {{ nothing.render('There are no contests...') }}
89
+ {% else %}
90
+ <ol class="section__list contest__list">
91
+ {%- for tdoc in tdocs -%}
92
+ <li class="section__list__item contest__item contest-type--{{ tdoc['rule'] }}">
93
+ <div class="media">
94
+ <div class="media__left medium">
95
+ <div class="contest__date numbox">
96
+ <div class="numbox__num large">{{ datetimeSpan(tdoc['beginAt'], false, 'D')|safe }}</div>
97
+ <div class="numbox__text">{{ datetimeSpan(tdoc['beginAt'], false, 'YYYY-M')|safe }}</div>
98
+ </div>
99
+ </div>
100
+ <div class="media__body medium">
101
+ <h1 class="contest__title"><a href="{{ url('contest_detail', tid=tdoc.docId) }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
102
+ <ul class="supplementary list">
103
+ <li>
104
+ <a href="?rule={{ tdoc['rule'] }}" class="contest-type-tag"><span class="icon icon-award"></span>{{ _(model.contest.RULES[tdoc.rule].TEXT) }}</a>
105
+ </li>
106
+ {% if tdoc.rated %}
107
+ <li class="contest-tag-rated"><span class="icon icon-star"></span>Rated</li>
108
+ {% endif %}
109
+ <li>
110
+ <span class="icon icon-schedule--fill text-blue"></span> {{ contest.render_duration(tdoc) }} {{ _('hour(s)') }}
111
+ </li>
112
+ <li>
113
+ <span class="icon icon-user--multiple"></span> {{ tdoc['attend']|default(0) }}
114
+ </li>
115
+ {% if tsdict[tdoc.docId].attend %}
116
+ <li class="contest__info-attended">
117
+ <span class="icon icon-check"></span> {{ _('Attended') }}
118
+ </li>
119
+ {% endif %}
120
+ </ul>
121
+ </div>
122
+ </div>
123
+ </li>
124
+ {%- endfor -%}
125
+ </ol>
126
+ {{ paginator.render(page, tpcount, add_qs=qs) }}
127
+ {% endif %}
128
+ </div>
129
+ </div>
130
+ </div>
131
+ <div class="medium-3 columns">
132
+ {% if handler.user.hasPerm(perm.PERM_CREATE_CONTEST) %}
133
+ <div class="section side">
134
+ <div class="section__header">
135
+ <h1 class="section__title">
136
+ {{ _('Create Contest') }}
137
+ </h1>
138
+ </div>
139
+ <div class="section__body">
140
+ <p><a href="{{ url('contest_create') }}" class="expanded primary button">{{ _('Create a contest') }}</a></p>
141
+ </div>
142
+ </div>
143
+ {% endif %}
144
+ </div>
145
+ </div>
146
+ {% endblock %}