@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,150 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% block content %}
3
+ <script>
4
+ {{ set(UiContext, {
5
+ problemId: pdoc.pid|default(pdoc.docId),
6
+ problemNumId: pdoc.docId,
7
+ codeLang: handler.user.codeLang,
8
+ codeTemplate: handler.user.codeTemplate,
9
+ pdoc: pdoc
10
+ }) }}
11
+ {% if tdoc %}
12
+ {{ set(UiContext, 'tdoc', tdoc) }}
13
+ {{ set(UiContext, 'tsdoc', tsdoc) }}
14
+ {% endif %}
15
+ {% if tdoc and mode == 'contest' %}
16
+ {{ set(UiContext, 'canViewRecord', model.contest.canShowSelfRecord.call(handler, tdoc)) }}
17
+ {{ set(UiContext, 'postSubmitUrl', url('problem_submit', pid=pdoc.docId, query={tid:tdoc.docId})) }}
18
+ {{ set(UiContext, 'getSubmissionsUrl', url('record_main', query={fullStatus:'true', pid:pdoc.docId, tid:tdoc.docId})) }}
19
+ {{ set(UiContext, 'getRecordDetailUrl', url('record_detail', rid='{rid}', query={tid:tdoc.docId})) }}
20
+ {{ set(UiContext, 'pretestConnUrl', "record-conn?pretest=1&uidOrName=" + handler.user._id + "&pid=" + pdoc.docId + "&domainId=" + handler.args.domainId + "&tid=" + tdoc.docId) }}
21
+ {% else %}
22
+ {{ set(UiContext, 'canViewRecord', true) }}
23
+ {{ set(UiContext, 'postSubmitUrl', url('problem_submit', pid=pdoc.docId)) }}
24
+ {{ set(UiContext, 'getSubmissionsUrl', url('record_main', query={fullStatus:'true', pid:pdoc.docId})) }}
25
+ {{ set(UiContext, 'getRecordDetailUrl', url('record_detail', rid='{rid}')) }}
26
+ {{ set(UiContext, 'pretestConnUrl', "record-conn?pretest=1&uidOrName=" + handler.user._id + "&pid=" + pdoc.docId + "&domainId=" + handler.args.domainId) }}
27
+ {% endif %}
28
+ </script>
29
+ {% if not tdoc %}
30
+ {% block ogp %}
31
+ {% set preferredLang = handler.request.query.lang or handler.user.viewLang or handler.session.viewLang %}
32
+ {% set renderredContent = pdoc.content|content(preferredLang, pdoc.html) %}
33
+ {% set langs = pdoc.content|contentLang %}
34
+ {% for k in langs %}
35
+ {% if k != preferredLang %}
36
+ <meta property="og:locale:alternate" content="{{ k }}" />
37
+ {% else %}
38
+ <meta property="og:locale" content="{{ k }}" />
39
+ {% endif %}
40
+ {% endfor %}
41
+ <meta property="og:title" content="{{ pdoc.pid|default(pdoc.docId) }}. {{ pdoc.title }} - {{ model.system.get('server.name') }}" />
42
+ <meta property="og:description" content="{{ renderredContent|problemPreview|truncate(100, true) }}" />
43
+ {% endblock %}
44
+ {% endif %}
45
+ <div class="row" data-sticky-parent>
46
+ <div class="medium-9 columns">
47
+ <div class="section">
48
+ <div class="section__header">
49
+ <h1 class="section__title">
50
+ {% if rdoc %}
51
+ <a href="{{ url('record_detail', {rid:rdoc._id}) }}">
52
+ <span class="icon record-status--icon {{ model.builtin.STATUS_CODES[rdoc['status']] }}"></span>
53
+ <span class="record-status--text {{ model.builtin.STATUS_CODES[rdoc['status']] }}">{{ rdoc.score }}</span>
54
+ </a>
55
+ {% endif %}
56
+ {% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) and not tdoc %}
57
+ <form class="form--inline" action="" method="post">
58
+ <input type="hidden" name="star" value="{{ 'true' if not psdoc.star else 'false' }}">
59
+ <input type="hidden" name="operation" value="star">
60
+ <button class="star{% if psdoc.star %} activated{% endif %}" type="submit">
61
+ <span class="starred--hide"><span class="icon icon-star--outline" data-tooltip="{{ _('Star') }}"></span></span>
62
+ <span class="starred--show"><span class="icon icon-star" data-tooltip="{{ _('Unstar') }}"></span></span>
63
+ </button>
64
+ </form>
65
+ {% endif %}
66
+ {%- if not tdoc or tdoc.pids|length > 1 -%}
67
+ {%- if tdoc -%}
68
+ {{ utils.getAlphabeticId(tdoc.pids.indexOf(pdoc.docId)) }}
69
+ {%- elif pdoc.pid and pdoc.pid.includes('-') -%}
70
+ {{ pdoc.pid.split('-').join('#') }}
71
+ {%- else -%}
72
+ #{{ pdoc.pid|default(pdoc.docId) }}
73
+ {%- endif -%}. {% endif %}{{ pdoc.title }}
74
+ </h1>
75
+ {% if tdoc and tdoc.pids|length <= 26 and tdoc.pids|length > 1 %}
76
+ <div class="section__tools contest-problems">
77
+ {% for pid in tdoc.pids -%}
78
+ {% set status = tsdoc.detail[pid].status %}
79
+ {% set pass = status == STATUS.STATUS_ACCEPTED %}
80
+ {% set fail = status and not pass %}
81
+ <a href="{{ url('problem_detail', pid=pid, query={tid:tdoc.docId}) }}"
82
+ class="{% if pass %}pass{% elif fail %}fail{% endif %}
83
+ {% if pid==pdoc.docId %} active{% endif %}">
84
+ <span class="id">{{ utils.getAlphabeticId(loop.index0) }}</span>
85
+ {% if status %}<span class="icon icon-{% if pass %}check{% else %}close{% endif %}"></span>{% endif %}
86
+ </a>
87
+ {%- endfor %}
88
+ </div>
89
+ {% endif %}
90
+ </div>
91
+ <div class="section__body">
92
+ <ul class="problem__tags">
93
+ {% if not tdoc %}
94
+ <span class="problem__tag-item">{{ _('ID') }}: {{ pdoc.docId }}</span>
95
+ {% endif %}
96
+ <span class="problem__tag-item icon icon-book">{{ _('problem_type.' + pdoc.config.type).format(pdoc.config.subType) }}</span>
97
+ {% if pdoc.config.type == 'default' and pdoc.config.subType %}
98
+ <span class="problem__tag-item icon icon-book">{{ _('File IO: {0}').format(pdoc.config.subType) }}</span>
99
+ {% endif %}
100
+ {% if pdoc.config.type != 'objective' and pdoc.config.type != 'submit_answer' %}
101
+ <span class="problem__tag-item icon icon-stopwatch">{{ pdoc.config.timeMax if pdoc.config.timeMax == pdoc.config.timeMin else pdoc.config.timeMin+'~'+pdoc.config.timeMax }}ms</span>
102
+ <span class="problem__tag-item icon icon-comparison">{{ pdoc.config.memoryMax if pdoc.config.memoryMax == pdoc.config.memoryMin else pdoc.config.memoryMin+'~'+pdoc.config.memoryMax }}MiB</span>
103
+ {% endif %}
104
+ {% if not tdoc %}
105
+ <a class="problem__tag-item interactive" href="{{ url('record_main', query={pid:pdoc.docId}) }}">{{ _('Tried') }}: {{ pdoc.nSubmit }}</a>
106
+ <a class="problem__tag-item interactive" href="{{ url('record_main', query={pid:pdoc.docId, status:1}) }}">{{ _('Accepted') }}: {{ pdoc.nAccept if ((not tdoc) or showAccept) else '?' }}</a>
107
+ <span class="problem__tag-item">{{ _('Difficulty') }}: {{ pdoc['difficulty'] or lib.difficulty(pdoc.nSubmit, pdoc.nAccept) or _('(None)') }}</span>
108
+ <span class="problem__tag-item interactive">{{ _('Uploaded By') }}: {{ user.render_inline(udoc, badge=false) }}</span>
109
+ {% endif %}
110
+ {% if pdoc.tag.length %}
111
+ <span name="show_tags" class="problem__tag-item interactive nojs--hide icon icon-tag">{{ _('Tags') + '>' }}</span>
112
+ {%- for tag in pdoc.tag -%}
113
+ <span class="problem__tag-item tags hasjs--hide">{{ tag }}</span>
114
+ {%- endfor -%}
115
+ {% endif %}
116
+ </ul>
117
+ </div>
118
+ </div>
119
+ <div class="section">
120
+ <div class="problem-content-container"><div class="problem-content" data-marker-enabled>
121
+ <div class="section__header non-scratchpad--hide">
122
+ <h1 class="section__title">{{ pdoc.title }}</h1>
123
+ </div>
124
+ {% if pdoc.content|contentLang|length > 1 %}
125
+ <div class="section__tab-container">
126
+ <div class="section__tab-header-wrapper">
127
+ <ul class="section__tab-header flex-row">
128
+ {% for k in pdoc.content|contentLang %}
129
+ <a class="section__tab-header-item {{'tab--active' if (handler.request.query.lang or handler.user.viewLang or handler.session.viewLang or (pdoc.content|contentLang)[0] ) == k }}" data-lang="{{ k }}" href="./{{pdoc.pid|default(pdoc.docId)}}?lang={{k}}">
130
+ {{ handler.ctx.i18n.get('__langname', k) or _('Unknown language') }}
131
+ </a>
132
+ {% endfor %}
133
+ </ul>
134
+ </div>
135
+ </div>
136
+ {% endif %}
137
+ {% include "partials/problem_description.html" %}
138
+ </div></div>
139
+ </div>
140
+ </div>
141
+ <div class="medium-3 columns"><div data-sticky="large">
142
+ {% include "partials/problem_sidebar.html" %}
143
+ </div></div>
144
+ </div>
145
+ <div style="display:none" class="outer-loader-container"><div class="loader"></div></div>
146
+ <div class="scratchpad-container" style="display:none">
147
+ <div style="display:none" class="loader-container"><div class="loader"></div></div>
148
+ <div id="scratchpad" style="opacity:0"></div>
149
+ </div>
150
+ {% endblock %}
@@ -0,0 +1,111 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% block content %}
3
+ <div class="row">
4
+ <div class="medium-9 columns">
5
+ <div class="section">
6
+ <div class="section__body">
7
+ <form method="post">
8
+ <div class="row">
9
+ <div class="medium-3 columns">
10
+ <label>
11
+ {{ _('pid') }}
12
+ <br>
13
+ <label>
14
+ <input name="pid" placeholder="P1000" value="{{ pdoc['pid']|default('') }}" class="textbox">
15
+ </label>
16
+ </label>
17
+ </div>
18
+ <div class="medium-7 columns">
19
+ <label>
20
+ {{ _('Title') }}
21
+ <input name="title" placeholder="{{ _('title') }}" value="{{ pdoc['title']|default('') }}" class="textbox"{% if page_name == 'problem_create' %} autofocus{% endif %}>
22
+ </label>
23
+ </div>
24
+ <div class="medium-2 columns">
25
+ <label>
26
+ <br>
27
+ <label class="checkbox">
28
+ <input type="checkbox" name="hidden" value="on"{% if pdoc['hidden'] %} checked{% endif %} class="checkbox">{{ _('Hidden') }}
29
+ </label>
30
+ </label>
31
+ </div>
32
+ </div>
33
+ <div class="row">
34
+ {{ form.form_text({
35
+ row:false,
36
+ columns:9,
37
+ label:'Tags',
38
+ help_text:'Split by \', \'.',
39
+ name:'tag',
40
+ value:pdoc['tag']|default([])|join(', ')
41
+ }) }}
42
+ {{ form.form_text({
43
+ row:false,
44
+ columns:3,
45
+ label:'Difficulty',
46
+ help_text:'From 1-10',
47
+ name:'difficulty',
48
+ value:pdoc['difficulty'] or ''
49
+ }) }}
50
+ </div>
51
+ <div class="section__tab-container nojs--hide">
52
+ <div class="section__tab-header-wrapper">
53
+ <ul class="section__tab-header">
54
+ <li class="section__tab-header-item tab--active" data-lang="{{ _('__id') }}">{{ _('__langname') }}</li>
55
+ {% for k, v in statementLangs %}{% if k != handler.user.viewLang %}
56
+ <li class="section__tab-header-item" data-lang="{{ k }}">{{ v }}</li>
57
+ {% endif %}{% endfor %}
58
+ </ul>
59
+ </div>
60
+ </div>
61
+ <div><textarea data-editor{% if page_name == 'problem_edit' %} autofocus{% endif %} class="textbox auto-resize nojs--hide"></textarea></div>
62
+ <textarea name="content" class="textbox hasjs--hide" data-markdown-upload style="height: 500px">{% if pdoc %}{{ pdoc['content']|toString }}{% else %}{% include 'partials/problem_default.md' %}{% endif %}</textarea>
63
+ <div class="row"><div class="columns">
64
+ {% if page_name == 'problem_edit' %}
65
+ <button type="submit" class="rounded primary button">
66
+ {{ _('Update') }}
67
+ </button>
68
+ {% if handler.user.own(pdoc, perm.PERM_EDIT_PROBLEM_SELF) or handler.user.hasPerm(perm.PERM_EDIT_PROBLEM) %}
69
+ <button name="operation" value="delete" type="submit" class="rounded button">
70
+ {{ _('Delete') }}
71
+ </button>
72
+ {% endif %}
73
+ {% else %}
74
+ <button type="submit" class="rounded primary button">
75
+ {{ _('Create') }}
76
+ </button>
77
+ {% endif %}
78
+ </div></div>
79
+ </form>
80
+ </div>
81
+ </div>
82
+ </div>
83
+ <div class="medium-3 columns">
84
+ <div class="section side visiable nojs--hide section--problem-sidebar-tags">
85
+ <div class="section__header">
86
+ <h1 class="section__title">{{ _('Categories') }} ({{ _('click to add') }})</h1>
87
+ </div>
88
+ <div class="section__body problem-sidebar-tags__detail">
89
+ {% include "partials/category.html" %}
90
+ </div>
91
+ </div>
92
+ {% if page_name == 'problem_edit' %}
93
+ <div class="section side" data-type="additional_file" data-sidebar>
94
+ <div class="section__header">
95
+ <h1 class="section__title">{{_('Additional Files')}}</h1>
96
+ <div class="section__tools">
97
+ <button class="primary rounded button" name="upload_file">{{ _('Upload') }}</button>
98
+ </div>
99
+ </div>
100
+ {% set sidebar = true %}
101
+ {% set can_edit = true %}
102
+ {% set filetype = "additional_file" %}
103
+ {% include "partials/problem_files.html" %}
104
+ </div>
105
+ {% include "partials/problem_sidebar.html" %}
106
+ {% else %}
107
+ {% include 'components/md_hint.html' %}
108
+ {% endif %}
109
+ </div>
110
+ </div>
111
+ {% endblock %}
@@ -0,0 +1,91 @@
1
+ {% import "components/nothing.html" as nothing with context %}
2
+ {% extends "layout/basic.html" %}
3
+ {% block content %}
4
+ <div class="row">
5
+ <div class="medium-5 columns" data-type="testdata">
6
+ <div class="section">
7
+ <div class="section__header">
8
+ <h1 class="section__title">{{ _('Testdata') }}</h1>
9
+ <div class="section__tools">
10
+ {% if not reference and (handler.user.own(pdoc, perm.PERM_EDIT_PROBLEM_SELF) or handler.user.hasPerm(perm.PERM_EDIT_PROBLEM)) %}
11
+ <a href="{{ url('problem_config', pid=pdoc.docId) }}" class="primary rounded button">{{ _('Config') }}</a>
12
+ <button class="primary rounded button" name="create_testdata">{{ _('Create') }}</button>
13
+ <button class="primary rounded button" name="upload_file">{{ _('Upload') }}</button>
14
+ {% elif reference %}
15
+ <a href="{{ url('problem_detail', domainId=pdoc.reference.domainId, pid=pdoc.reference.pid) }}" class="primary rounded button">{{ _('Source') }}</a>
16
+ {% endif %}
17
+ </div>
18
+ </div>
19
+ {{ noscript_note.render() }}
20
+ {% set filetype = "testdata" %}
21
+ {% set can_edit = (handler.user.own(pdoc, perm.PERM_EDIT_PROBLEM_SELF) or handler.user.hasPerm(perm.PERM_EDIT_PROBLEM)) and not reference %}
22
+ {% include "partials/problem_files.html" %}
23
+ {% if not reference and (handler.user.own(pdoc) or handler.user.hasPerm(perm.PERM_READ_PROBLEM_DATA) or handler.user.hasPriv(PRIV.PRIV_READ_PROBLEM_DATA)) %}
24
+ <div class="section__body">
25
+ <button class="rounded button" name="download_selected">{{ _('Download Selected') }}</button>
26
+ {% if handler.user.own(pdoc, perm.PERM_EDIT_PROBLEM_SELF) or handler.user.hasPerm(perm.PERM_EDIT_PROBLEM) %}
27
+ <button class="rounded button" name="remove_selected">{{ _('Remove Selected') }}</button>
28
+ <button class="rounded button" name="rename_selected">{{ _('Rename Selected') }}</button>
29
+ {% endif %}
30
+ </div>
31
+ {% endif %}
32
+ </div>
33
+ {% if not reference and (handler.user.own(pdoc, perm.PERM_EDIT_PROBLEM_SELF) or handler.user.hasPerm(perm.PERM_EDIT_PROBLEM)) %}
34
+ {{ set(UiContext, {
35
+ pdoc: pdoc
36
+ }) }}
37
+ <div class="section">
38
+ <div class="section__header">
39
+ <h1 class="section__title">{{ _('Generate Testdata') }}(Beta)</h1>
40
+ </div>
41
+ {{ noscript_note.render() }}
42
+ <div class="section__body generate">
43
+ {% if pdoc.config.type === 'default' %}
44
+ {{ form.form_text({
45
+ columns: 12,
46
+ label:'Data Generator',
47
+ name:'gen',
48
+ help_text:'A data generator is a program that generates testdata. It should output result to stdout.'
49
+ }) }}
50
+ {{ form.form_text({
51
+ columns: 12,
52
+ label:'Standard Program',
53
+ name:'std',
54
+ help_text:'A standard program is a program that solves the problem. It should output answer to stdout.'
55
+ }) }}
56
+ <button class="rounded button" name="generate_testdata">{{ _('Generate') }}</button>
57
+ {% else %}
58
+ {{ nothing.render('Generate testdata is not supported for this problem type.') }}
59
+ {% endif %}
60
+ </div>
61
+ </div>
62
+ {% endif %}
63
+ </div>
64
+ <div class="medium-4 columns" data-type="additional_file">
65
+ <div class="section">
66
+ <div class="section__header">
67
+ <h1 class="section__title">{{ _('Additional Files') }}</h1>
68
+ <div class="section__tools">
69
+ {% if (handler.user.own(pdoc, perm.PERM_EDIT_PROBLEM_SELF) or handler.user.hasPerm(perm.PERM_EDIT_PROBLEM)) and not reference %}
70
+ <button class="primary rounded button" name="create_file">{{ _('Create') }}</button>
71
+ <button class="primary rounded button" name="upload_file">{{ _('Upload') }}</button>
72
+ {% endif %}
73
+ </div>
74
+ </div>
75
+ {% set filetype = "additional_file" %}
76
+ {% set can_edit = (handler.user.own(pdoc, perm.PERM_EDIT_PROBLEM_SELF) or handler.user.hasPerm(perm.PERM_EDIT_PROBLEM)) and not reference %}
77
+ {% include "partials/problem_files.html" %}
78
+ <div class="section__body">
79
+ <button class="rounded button" name="download_selected">{{ _('Download Selected') }}</button>
80
+ {% if (handler.user.own(pdoc, perm.PERM_EDIT_PROBLEM_SELF) or handler.user.hasPerm(perm.PERM_EDIT_PROBLEM)) and not reference %}
81
+ <button class="rounded button" name="remove_selected">{{ _('Remove Selected') }}</button>
82
+ <button class="rounded button" name="rename_selected">{{ _('Rename Selected') }}</button>
83
+ {% endif %}
84
+ </div>
85
+ </div>
86
+ </div>
87
+ <div class="medium-3 columns">
88
+ {% include "partials/problem_sidebar.html" %}
89
+ </div>
90
+ </div>
91
+ {% endblock %}
@@ -0,0 +1,41 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% block content %}
3
+ {{ set(UiContext, 'pdoc', pdoc) }}
4
+ <div class="row">
5
+ <div class="medium-9 columns">
6
+ <div class="section">
7
+ <div class="section__header">
8
+ <h1 class="section__title">{{ _('Hack submission') }} #{{ rid }}</h1>
9
+ </div>
10
+ <div class="section__body">
11
+ <form method="post" enctype="multipart/form-data">
12
+ {{ form.form_textarea({label:'Input', columns:12, name:'input', extra_class:'monospace', autofocus:true, nospellcheck:true}) }}
13
+ <div class="row">
14
+ <div class="medium-12 columns">
15
+ <p>{{ _('Or upload a file:') }} <input type="file" name="file"></p>
16
+ <br />
17
+ </div>
18
+ </div>
19
+ <div class="row"><div class="columns">
20
+ <label>
21
+ {{ _('Auto organize input') }}
22
+ <br />
23
+ <label class="checkbox">
24
+ <input type="checkbox" name="autoOrganizeInput" class="checkbox">
25
+ {{ _('Auto adjust the format of line breaks and remove unnecessary whitespace characters.') }}
26
+ </label>
27
+ </label>
28
+ </div></div>
29
+ <div class="row"><div class="columns">
30
+ <input type="submit" class="rounded primary button" value="{{ _('Submit') }}">
31
+ </div></div>
32
+ </form>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ <div class="medium-3 columns">
37
+ {% include "partials/problem_sidebar.html" %}
38
+ </div>
39
+ </div>
40
+
41
+ {% endblock %}
@@ -0,0 +1,58 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% block content %}
3
+ <div class="row">
4
+ <div class="medium-9 columns">
5
+ <div class="section">
6
+ <div class="section__body">
7
+ <form method="post" enctype="multipart/form-data">
8
+ <div class="row">
9
+ <div class="medium-12 columns">
10
+ <p>{{ _('Upload zipfile') }} {% if type %}({{ _('Type') }}: {{type}}){% endif %}: <input type="file" name="file"></p>
11
+ <br />
12
+ </div>
13
+ </div>
14
+ <div class="row">
15
+ {{ form.form_text({
16
+ label:'preferredPrefix',
17
+ columns:6,
18
+ name:'preferredPrefix',
19
+ row:false,
20
+ help_text:_('The preferred problem ID prefix.'),
21
+ placeholder:_('Leave empty for default')
22
+ }) }}
23
+ {{ form.form_checkbox({
24
+ label:'Hidden',
25
+ columns:6,
26
+ name:'hidden',
27
+ placeholder:_('Make the problem hidden.'),
28
+ row:false
29
+ }) }}
30
+ {% if handler.user.hasPriv(PRIV.PRIV_EDIT_SYSTEM) and not type %}
31
+ {{ form.form_checkbox({
32
+ label:'Keep original user',
33
+ columns:6,
34
+ name:'keepUser',
35
+ placeholder:_('Keep original problem owner. Only used if this problemset is exported from current system.'),
36
+ row:false
37
+ }) }}
38
+ {% endif %}
39
+ </div>
40
+ <div class="row"><div class="columns">
41
+ <input type="submit" class="rounded primary button" value="{{ _('Upload') }}">
42
+ </div></div>
43
+ </form>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ <div class="medium-3 columns">
48
+ <div class="section side">
49
+ <div class="section__body typo">
50
+ <h2>{{ _('What is this?') }}</h2>
51
+ <p>{{ _('With this feature, you can import problems that you can view from a site to here. Their title, content, tags and categories will be imported.') }}</p>
52
+ <h2>{{ _('About preferredPrefix option') }}</h2>
53
+ <p>{{ _('preferredPrefix_hint') }}</p>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </div>
58
+ {% endblock %}
@@ -0,0 +1,100 @@
1
+ {% import "components/record.html" as record with context %}
2
+ {% import "components/problem.html" as problem with context %}
3
+ {% extends "layout/basic.html" %}
4
+ {% block content %}
5
+ <div class="row">
6
+ <div class="medium-9 columns">
7
+ <div class="section display-mode">
8
+ <div class="section__body no-padding">
9
+ <form method="get" id="searchForm" action="{{ url('problem_main') }}">
10
+ <div class="search">
11
+ <input name="q" type="text" value="{{ qs }}" placeholder="{{ _('Search') }}">
12
+ {% include "partials/problem_stat.html" %}
13
+ <select name="sort" class="search-sort">
14
+ {%- for sortType in ["default", "recent"] -%}
15
+ <option value="{{ sortType }}" {{ "selected" if sort == sortType else "" }}>{{ _('sort::' + sortType) }}</option>
16
+ {%- endfor -%}
17
+ </select>
18
+ <button type="submit">
19
+ <span class="icon icon-search"></span>
20
+ </button>
21
+ </div>
22
+ </form>
23
+ </div>
24
+ <div class="section__body no-padding">
25
+ {% include "partials/problem_list.html" %}
26
+ </div>
27
+ </div>
28
+ </div>
29
+ <div class="medium-3 columns">
30
+ {% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
31
+ <div class="section side nojs--hide">
32
+ <ol class="menu">
33
+ <a href="javascript:;" class="menu__link edit-mode-hide" name="enter-edit-mode">
34
+ <span class="icon icon-edit"></span>
35
+ {{ _('Enter Edit Mode') }}
36
+ </a>
37
+ <a href="javascript:;" class="menu__link display-mode-hide" name="leave-edit-mode">
38
+ <span class="icon icon-edit"></span>
39
+ {{ _('Leave Edit Mode') }}
40
+ </a>
41
+ <div id="problem_selection" class="display-mode-hide"></div>
42
+ {% if handler.user.hasPerm(perm.PERM_EDIT_PROBLEM) %}
43
+ <a href="javascript:;" class="menu__link display-mode-hide" name="hide_selected_problems">
44
+ <span class="icon icon-close"></span>
45
+ {{ _('Hide Selected') }}
46
+ </a>
47
+ <a href="javascript:;" class="menu__link display-mode-hide" name="unhide_selected_problems">
48
+ <span class="icon icon-check"></span>
49
+ {{ _('Unhide Selected') }}
50
+ </a>
51
+ <a href="javascript:;" class="menu__link display-mode-hide" name="download_selected_problems">
52
+ <span class="icon icon-download"></span>
53
+ {{ _('Download Selected') }}
54
+ </a>
55
+ <a href="javascript:;" class="menu__link display-mode-hide" name="delete_selected_problems">
56
+ <span class="icon icon-delete"></span>
57
+ {{ _('Remove Selected') }}
58
+ </a>
59
+ {% endif %}
60
+ <a href="javascript:;" class="menu__link display-mode-hide" name="copy_selected_problems">
61
+ <span class="icon icon-copy"></span>
62
+ {{ _('Copy Selected') }}
63
+ </a>
64
+ </ol>
65
+ </div>
66
+ {% endif %}
67
+ {% if handler.user.hasPerm(perm.PERM_CREATE_PROBLEM) %}
68
+ <div class="section side">
69
+ <div class="section__header">
70
+ <h1 class="section__title">{{ _('Create Problem') }}</h1>
71
+ </div>
72
+ <ol class="menu">
73
+ {%- for item in ui.getNodes('ProblemAdd') -%}
74
+ <a href="{{ url(item.name, item.args) }}" class="menu__link">
75
+ <span class="icon icon-{{ item.args.icon|default('add') }}"></span>
76
+ {{ _(item.args.text) }}
77
+ </a>
78
+ {%- endfor -%}
79
+ </ol>
80
+ <div class="section__body">
81
+ <div class="typo supplementary">
82
+ <p>{{ _('You have permission to create problems for this domain.') }}</p>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ {% endif %}
87
+ <div class="section side">
88
+ <div class="section__header edit-mode-hide">
89
+ <h1 class="section__title">{{ _('Categories') }}</h1>
90
+ </div>
91
+ <div class="section__body">
92
+ {% include "partials/category.html" %}
93
+ </div>
94
+ <div class="section__body edit-mode-hide">
95
+ {% include "partials/problem_lucky.html" %}
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ {% endblock %}
@@ -0,0 +1,55 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% import "components/comments_solution.html" as comments with context %}
3
+ {% block content %}
4
+ <div class="row">
5
+ <div class="medium-9 columns">
6
+ <div class="section">
7
+ <div class="section__header">
8
+ <h1 class="section__title">{{ _('{0} solutions').format(pscount) }}</h1>
9
+ </div>
10
+ <div class="section__body">
11
+ {{ comments.render(
12
+ view = 'solution',
13
+ docs = psdocs,
14
+ udict = udict,
15
+ comment_ref = 'psid',
16
+ reply_ref = 'psrid',
17
+ comment_placeholder = 'Write Your Solution',
18
+ comment_post_op = 'submit',
19
+ comment_edit_op = 'edit_solution',
20
+ comment_post_text = 'Share',
21
+ reply_post_op = 'reply',
22
+ reply_edit_op = 'edit_reply',
23
+ comment_delete_op = 'delete_solution',
24
+ reply_delete_op = 'delete_reply',
25
+ comment_post_perm = perm.PERM_CREATE_PROBLEM_SOLUTION,
26
+ comment_edit_perm = perm.PERM_NEVER,
27
+ comment_edit_self_perm = perm.PERM_EDIT_PROBLEM_SOLUTION_SELF,
28
+ comment_delete_perm = perm.PERM_DELETE_PROBLEM_SOLUTION,
29
+ comment_delete_self_perm = perm.PERM_DELETE_PROBLEM_SOLUTION_SELF,
30
+ reply_post_perm = perm.PERM_REPLY_PROBLEM_SOLUTION,
31
+ reply_edit_perm = perm.PERM_NEVER,
32
+ reply_edit_self_perm = perm.PERM_EDIT_PROBLEM_SOLUTION_REPLY_SELF,
33
+ reply_delete_perm = perm.PERM_DELETE_PROBLEM_SOLUTION_REPLY,
34
+ reply_delete_self_perm = perm.PERM_DELETE_PROBLEM_SOLUTION_REPLY_SELF
35
+ ) }}
36
+ {% if not sid %}
37
+ {{ paginator.render(page, pcount) }}
38
+ {% endif %}
39
+ {% if drcount == 0 %}
40
+ {{ nothing.render('No solutions so far...') }}
41
+ {% endif %}
42
+ </div>
43
+ </div>
44
+ {% if sid %}
45
+ <div class="section">
46
+ <a href="{{ url('problem_solution', pid=pdoc.pid|default(pdoc.docId)) }}" class="menu__link" style="width: 100%">{{ _('View all {0} solutions').format(pscount) }}</a>
47
+ </div>
48
+ {% endif %}
49
+ </div>
50
+ <div class="medium-3 columns">
51
+ {% set owner_udoc = udict[pdoc.owner] %}
52
+ {% include "partials/problem_sidebar.html" %}
53
+ </div>
54
+ </div>
55
+ {% endblock %}