@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,75 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% block content %}
3
+ <div class="row">
4
+ <div class="medium-12 columns">
5
+ <div class="section">
6
+ <div class="section__tab-container">
7
+ <ul class="section__tabs">
8
+ <li class="section__tab-item">
9
+ <h1 class="section__tab-title">{{ _('Servers') }}</h1>
10
+ <div class="section__tab-main">
11
+ <table class="data-table">
12
+ <colgroup>
13
+ <col class="col--id">
14
+ <col class="col--status">
15
+ <col class="col--os">
16
+ <col class="col--cpu">
17
+ <col class="col--memory">
18
+ <col class="col--request">
19
+ </colgroup>
20
+ <thead>
21
+ <tr>
22
+ <th class="col--id">{{ _('ID') }}</th>
23
+ <th class="col--status">{{ _('Current Status') }}</th>
24
+ <th class="col--os">{{ _('OS Info') }}</th>
25
+ <th class="col--cpu">{{ _('CPU Info') }}</th>
26
+ <th class="col--memory">{{ _('Memory Info') }}</th>
27
+ <th class="col--request">{{ _('Handled requests') }}</th>
28
+ </tr>
29
+ </thead>
30
+ <tbody>
31
+ {%- for doc in stats -%}
32
+ <tr>
33
+ <td class="col--id">{{ doc._id.toHexString()|truncate(8,True,'') }}</td>
34
+ <td class="col--status">{% if doc.isOnline %}{{ doc.status }}{% else %}{{ datetimeSpan(doc.updateAt)|safe }}{% endif %}</td>
35
+ <td class="col--os" data-tooltip="{{ doc.osinfo.kernel }}">{{ doc.osinfo.distro }} {{ doc.osinfo.release }} {{ doc.osinfo.codename }} {{ doc.osinfo.arch }}</td>
36
+ <td class="col--cpu" data-tooltip="{{ doc.cpu.flags }}">{{ doc.cpu.manufacturer }} {{ doc.cpu.brand }}@{{ doc.cpu.speed }}GHz</td>
37
+ <td class="col--memory"{% if doc.stack %} data-tooltip="Stack size: {{ doc.stack }}MB"{% endif %}>{{ size(doc.memory.used) }}/{{ size(doc.memory.total) }}</td>
38
+ <td class="col--request">{{ doc.reqCount }}</td>
39
+ </tr>
40
+ {%- endfor -%}
41
+ </tbody>
42
+ </table>
43
+ </div>
44
+ </li>
45
+ {% if compilers|length %}
46
+ <li class="section__tab-item">
47
+ <h1 class="section__tab-title">{{ _('Compiler Versions') }}</h1>
48
+ <div class="section__tab-main">
49
+ <div class="section__body typo">
50
+ {% for line in compilers %}
51
+ <p>{{ line.key|join(', ') }}</p>
52
+ <pre><code>{{ line.message }}</code></pre>
53
+ {% endfor %}
54
+ </div>
55
+ </div>
56
+ </li>
57
+ {% endif %}
58
+ <li class="section__tab-item">
59
+ <h1 class="section__tab-title">{{ _('Compile Commands') }}</h1>
60
+ <div class="section__tab-main">
61
+ <div class="section__body typo">
62
+ <ul>
63
+ {%- for k, v in languages -%}
64
+ <li>{{ k }} <pre>{{ v }}</pre></li>
65
+ {%- endfor -%}
66
+ </ul>
67
+ </div>
68
+ </div>
69
+ </li>
70
+ </ul>
71
+ </div>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ {% endblock %}
@@ -0,0 +1,120 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% block content %}
3
+ <div class="row" data-sticky-parent>
4
+ {%- if Object.keys(udict).length -%}
5
+ <div class="medium-2 columns mobile--hide">
6
+ <div data-sticky="large"><div class="section side">
7
+ <ol class="menu">
8
+ <li class="menu__item nojs--hide">
9
+ <form method="get" id="searchForm">
10
+ <select name="group" class="select"{% if not groups.length %} style="display:none"{% endif %}>
11
+ <option value="all" selected>{{ _('All') }}</option>
12
+ {% for group in groups %}
13
+ <option value="{{ group.uids.join(',') }}">{{ group.name }}</option>
14
+ {% endfor %}
15
+ </select>
16
+ <input name="uid" type="text" class="search__input textbox" placeholder="{{ _('Select User') }}">
17
+ </form>
18
+ </li>
19
+ <ul class="enroll_user_menu">
20
+ {%- for uid, udoc in udict -%}
21
+ <li class="menu__item enroll_user_menu_item" data-uid="{{ uid }}" data-uname="{{ udoc.uname }}" {% if handler.user.hasPerm(perm.PERM_VIEW_USER_PRIVATE_INFO) and udoc.displayName %}data-displayname="{{ udoc.displayName }}"{% endif %}>
22
+ <a href="./{{ tdoc._id }}?uid={{ uid }}" class="menu__link{% if (handler.request.query.uid or handler.user._id) == uid %} active{% endif %}">
23
+ <span class="user-profile-link">
24
+ <img class="small user-profile-avatar v-center" loading="lazy" src="{{ avatarUrl(udoc.avatar|default('')) }}" width="20" height="20">
25
+ <span class="user-profile-name">
26
+ {% if handler.user.hasPerm(perm.PERM_VIEW_USER_PRIVATE_INFO) and udoc.displayName and udoc.displayName != udoc.uname %}
27
+ {{ udoc.displayName }} ({{ udoc.uname }})
28
+ {% else %}
29
+ {{ udoc.uname }}
30
+ {% endif %}
31
+ </span>
32
+ </span>
33
+ </a>
34
+ </li>
35
+ {%- endfor -%}
36
+ </ul>
37
+ </ol>
38
+ </div></div>
39
+ </div>
40
+ <div class="medium-7 columns">
41
+ {%- else -%}
42
+ <div class="medium-9 columns">
43
+ {%- endif -%}
44
+ <div class="section">
45
+ <div class="section__body typo">
46
+ {{ tdoc['content'] }}
47
+ </div>
48
+ <div class="section__body typo richmedia">
49
+ {% if not handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
50
+ <blockquote class="typo note">
51
+ <p>{{ _('Login to join training plan') }}</p>
52
+ </blockquote>
53
+ {% elif not tsdoc.enroll %}
54
+ <blockquote class="typo note">
55
+ <p>{{ _('page.training_detail.invalid_when_not_enrolled') }}</p>
56
+ </blockquote>
57
+ {% endif %}
58
+ {% if missing.length %}
59
+ <blockquote class="warn">
60
+ <p>{{ _('Some problems in the training are missing or you do not have permission to view them.') }}</p>
61
+ <p>{{ missing|join(', ') }}</p>
62
+ </blockquote>
63
+ {% endif %}
64
+ {{ tdoc.description|default('')|markdown|safe }}
65
+ </div>
66
+ </div>
67
+ <div class="section">
68
+ {% include "partials/training_detail.html" %}
69
+ </div>
70
+ </div>
71
+ <div class="medium-3 columns" data-sticky="large">
72
+ <div class="section side">
73
+ <div>
74
+ <ol class="menu">
75
+ {% if not tsdoc['enroll'] and handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
76
+ <li class="menu__item">
77
+ <form action="" method="POST">
78
+ <input type="hidden" name="operation" value="enroll">
79
+ <button class="menu__link" type="submit">
80
+ <span class="icon icon-add"></span> {{ _('Enroll Training') }}
81
+ </button>
82
+ </form>
83
+ </li>
84
+ {% endif %}
85
+ {% if handler.user.own(tdoc) or handler.user.hasPerm(perm.PERM_EDIT_TRAINING) %}
86
+ <li class="menu__item"><a class="menu__link" href="{{ url('training_edit', tid=tdoc.docId) }}">
87
+ <span class="icon icon-edit"></span> {{ _('Edit') }}
88
+ </a></li>
89
+ <li class="menu__item"><a class="menu__link" href="{{ url('training_files', tid=tdoc.docId) }}">
90
+ <span class="icon icon-file"></span> {{ _('Files') }}
91
+ </a></li>
92
+ {% endif %}
93
+ <li class="menu__item"><a class="menu__link" href="{{ url('wiki_help', anchor='training') }}">
94
+ <span class="icon icon-help"></span> {{ _('Help') }}
95
+ </a></li>
96
+ <li class="menu__seperator"></li>
97
+ </ol>
98
+ </div>
99
+ <div class="section__body typo">
100
+ <dl class="large horizontal">
101
+ {% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
102
+ <dt>{{ _('Status') }}</dt><dd>{% if tsdoc['enroll'] %}{{ _('Completed' if tsdoc['done'] else 'In Progress') }}{% else %}{{ _('Not Enrolled') }}{% endif %}</dd>
103
+ {% endif %}
104
+ {% if tsdoc['enroll'] %}
105
+ <dt>{{ _('Progress') }}</dt><dd>{{ _('Completed') }} {{ (100 * tsdoc['donePids']|length / pids|length)|round|int }}%</dd>
106
+ {% endif %}
107
+ <dt>{{ _('Enrollees') }}</dt><dd>{{ tdoc.attend|default(0) }}</dd>
108
+ <dt>{{ _('Created By') }}</dt>
109
+ <dd>{{ user.render_inline(udoc, badge=false) }}</dd>
110
+ </dl>
111
+ </div>
112
+ </div>
113
+ <div class="section side">
114
+ <ol class="menu">
115
+ {{ sidemenu.render_item('list', 'training_detail', {tid:tdoc._id}, label='tasks_list', menu_item='training_detail') }}
116
+ </ol>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ {% endblock %}
@@ -0,0 +1,68 @@
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-9 columns">
10
+ <label>
11
+ {{ _('Title') }}
12
+ <input name="title" placeholder="{{ _('title') }}" value="{{ tdoc.title|default('') }}" class="textbox" autofocus>
13
+ </label>
14
+ </div>
15
+ <div class="medium-3 columns">
16
+ <label>
17
+ {{ _('Pin') }}
18
+ <input name="pin" placeholder="{{ _('Pin level') }}" value="{{ tdoc.pin|default(0) }}" class="textbox">
19
+ </label>
20
+ </div>
21
+ </div>
22
+ <div class="row"><div class="columns">
23
+ <label>
24
+ {{ _('Introduce') }}
25
+ <textarea name="content" class="textbox">{{ tdoc['content']|default('') }}</textarea>
26
+ <p class="help-text">{{ _('Introduce must not exceed 500 characters and it will be shown in the list view.') }}</p>
27
+ </label>
28
+ </div></div>
29
+ <div class="row"><div class="columns">
30
+ <label>
31
+ {{ _('Description') }}
32
+ <textarea name="description" class="textbox" data-markdown style="height: 200px">{{ tdoc['description']|default('') }}</textarea>
33
+ </label>
34
+ </div></div>
35
+ <div class="row"><div class="columns">
36
+ <label>
37
+ {{ _('Plan') }}
38
+ <textarea data-json name="dag" class="textbox" style="height: 500px">{% if tdoc %}{{ dag }}{% else %}{% include 'partials/training_default.json' %}{% endif %}</textarea>
39
+ </label>
40
+ </div></div>
41
+ <div class="row"><div class="columns">
42
+ {% if page_name == 'training_edit' %}
43
+ <button type="submit" class="rounded primary button">
44
+ {{ _('Update') }}
45
+ </button>
46
+ {% if handler.user.own(tdoc) or handler.user.hasPerm(perm.PERM_EDIT_TRAINING) %}
47
+ <button name="operation" value="delete" type="submit" class="rounded button">
48
+ {{ _('Delete') }}
49
+ </button>
50
+ {% endif %}
51
+ {% else %}
52
+ <button type="submit" class="rounded primary button">
53
+ {{ _('Create') }}
54
+ </button>
55
+ {% endif %}
56
+ <button type="button" class="rounded button" onclick="window.history.go(-1)">
57
+ {{ _('Cancel') }}
58
+ </button>
59
+ </div></div>
60
+ </form>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ <div class="medium-3 columns">
65
+ {% include 'components/md_hint.html' %}
66
+ </div>
67
+ </div>
68
+ {% endblock %}
@@ -0,0 +1,64 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% block content %}
3
+ {{ set(UiContext, 'tdoc', tdoc) }}
4
+ <div class="row">
5
+ <div class="medium-9 columns">
6
+ <div class="section">
7
+ <div class="section__header">
8
+ <h1 class="section__title">{{ _('Files') }}</h1>
9
+ <div class="section__tools">
10
+ <button class="primary rounded button" name="upload_file">{{ _('Upload File') }}</button>
11
+ </div>
12
+ </div>
13
+ {{ noscript_note.render() }}
14
+ {% include "partials/files.html" %}
15
+ <div class="section__body">
16
+ <button class="rounded button" name="remove_selected">{{ _('Remove Selected') }}</button>
17
+ </div>
18
+ </div>
19
+ </div>
20
+ <div class="medium-3 columns">
21
+ <div class="section side">
22
+ <div>
23
+ <ol class="menu">
24
+ <li class="menu__item"><a class="menu__link" href="{{ url('training_detail', tid=tdoc.docId) }}">
25
+ <span class="icon icon-award"></span> {{ _('View Training') }}
26
+ </a></li>
27
+ {% if not tsdoc['enroll'] and handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
28
+ <li class="menu__item">
29
+ <form action="" method="POST">
30
+ <input type="hidden" name="operation" value="enroll">
31
+ <button class="menu__link" type="submit">
32
+ <span class="icon icon-add"></span> {{ _('Enroll Training') }}
33
+ </button>
34
+ </form>
35
+ </li>
36
+ {% endif %}
37
+ {% if handler.user.own(tdoc) or handler.user.hasPerm(perm.PERM_EDIT_TRAINING) %}
38
+ <li class="menu__item"><a class="menu__link" href="{{ url('training_edit', tid=tdoc.docId) }}">
39
+ <span class="icon icon-edit"></span> {{ _('Edit') }}
40
+ </a></li>
41
+ <li class="menu__item"><a class="menu__link" href="{{ url('training_files', tid=tdoc.docId) }}">
42
+ <span class="icon icon-file"></span> {{ _('Files') }}
43
+ </a></li>
44
+ {% endif %}
45
+ <li class="menu__item"><a class="menu__link" href="{{ url('wiki_help', anchor='training') }}">
46
+ <span class="icon icon-help"></span> {{ _('Help') }}
47
+ </a></li>
48
+ <li class="menu__seperator"></li>
49
+ </ol>
50
+ </div>
51
+ <div class="section__body typo">
52
+ <dl class="large horizontal">
53
+ {% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
54
+ <dt>{{ _('Status') }}</dt><dd>{% if tsdoc['enroll'] %}{{ _('Completed' if tsdoc['done'] else 'In Progress') }}{% else %}{{ _('Not Enrolled') }}{% endif %}</dd>
55
+ {% endif %}
56
+ <dt>{{ _('Enrollees') }}</dt><dd>{{ tdoc.attend|default(0) }}</dd>
57
+ <dt>{{ _('Created By') }}</dt>
58
+ <dd>{{ user.render_inline(udoc, badge=false) }}</dd>
59
+ </dl>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ {% endblock %}
@@ -0,0 +1,107 @@
1
+ {% extends "layout/basic.html" %}
2
+ {% block content %}
3
+ <div class="row">
4
+ <div class="large-9 columns">
5
+ <div class="section">
6
+ <div class="section__header">
7
+ <h1 class="section__title">{{ _('All Training Plans') }}</h1>
8
+ <div class="section__tools">
9
+ <form method="get" class="filter-form" name="filter-form">
10
+ <input type="text" class="inline compact textbox" name="q" value="{{ q }}" placeholder="{{ _('Search training...') }}">
11
+ <button type="submit" class="compact button">
12
+ {{ _('Search') }}
13
+ </button>
14
+ </form>
15
+ </div>
16
+ </div>
17
+ {% if not tdocs.length %}
18
+ {{ nothing.render('Sorry, there are no training plans.') }}
19
+ {% else %}
20
+ <ol class="section__list all primary training__list">
21
+ {%- for tdoc in tdocs -%}
22
+ <li class="section__list__item training__item">
23
+ <div class="media">
24
+ <div class="media__left middle">
25
+ <div class="training__participants numbox">
26
+ <div class="numbox__num large">{{ tdoc.attend|default(0) }}</div>
27
+ <div class="numbox__text">{{ _('Enrolled') }}</div>
28
+ </div>
29
+ </div>
30
+ <div class="media__body middle">
31
+ <h1 class="training__title"><a href="{{ url('training_detail', tid=tdoc.docId) }}" data-emoji-enabled>{{ tdoc.title }}</a></h1>
32
+ <div class="training__intro typo">
33
+ <p>{{ tdoc['content'] }}</p>
34
+ </div>
35
+ <ul class="supplementary list training__progress">
36
+ <li>
37
+ <span class="icon icon-flag text-blue"></span> {{ _('{0} sections').format(tdoc['dag']|length) }}, {{ _('{0} problems').format(model.training.getPids(tdoc.dag)|length) }}
38
+ </li>
39
+ <li>
40
+ {% if tsdict[tdoc.docId]['enroll'] %}
41
+ {% if not tsdict[tdoc.docId]['done'] %}
42
+ <span class="icon training-status--icon progress"></span>
43
+ <span class="training-status--text progress">{{ _('Completed') }} {{ (100 * tsdict[tdoc.docId]['donePids']|length / model.training.getPids(tdoc.dag)|length)|round|int }}%</span>
44
+ {% else %}
45
+ <span class="icon training-status--icon done"></span>
46
+ <span class="training-status--text done">{{ _('Completed') }} 100%</span>
47
+ {% endif %}
48
+ {% elif handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
49
+ <span class="icon training-status--icon outside"></span> <span class="training-status--text outside">{{ _('Not Enrolled') }}</span>
50
+ {% endif %}
51
+ </li>
52
+ </ul>
53
+ </div>
54
+ </div>
55
+ </li>
56
+ {%- endfor -%}
57
+ </ol>
58
+ {{ paginator.render(page, tpcount, add_qs=qs) }}
59
+ {% endif %}
60
+ </div>
61
+ </div>
62
+ <div class="large-3 columns">
63
+ {% if handler.user.hasPerm(perm.PERM_CREATE_TRAINING) %}
64
+ <div class="section side">
65
+ <div class="section__header">
66
+ <h1 class="section__title">{{ _('Create Training Plan') }}</h1>
67
+ </div>
68
+ <ol class="menu">
69
+ <li class="menu__item">
70
+ <a href="{{ url('training_create') }}" class="menu__link"><span class="icon icon-add"></span> {{ _('New Training Plan') }}</a>
71
+ </li>
72
+ </ol>
73
+ <div class="section__body">
74
+ <div class="typo supplementary">
75
+ <p>{{ _('You can create your own training plans and share them with others.') }}</p>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ {% endif %}
80
+ {% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
81
+ <div class="section side">
82
+ <div class="section__header">
83
+ <h1 class="section__title">{{ _('Enrolled') }}</h1>
84
+ </div>
85
+ <div class="section__body">
86
+ <ol class="my secondary training__list">
87
+ {%- for tid, tsdoc in tsdict -%}
88
+ {% if tsdoc['enroll'] %}
89
+ {% set progress = (100 * (tsdoc['donePids']|length) / (model.training.getPids(tdict[tsdoc['docId']].dag)|length))|round|int %}
90
+ <li class="training__item"><div class="media">
91
+ <div class="media__left">
92
+ <span class="icon training-status--icon {% if tsdoc['done'] %}done{% else %}progress{% endif %}"></span>
93
+ </div>
94
+ <div class="media__body">
95
+ <h1 class="training__title"><a href="{{ url('training_detail', tid=tsdoc.docId) }}" data-emoji-enabled>{{ tdict[tsdoc['docId']]['title'] }}</a></h1>
96
+ <div class="supplementary training__progress"><div class="training__progress-bar"><div class="training__progress-track" style="width:{{ progress }}%;"></div></div> {{ _('Complete') }} {{ progress }}%</div>
97
+ </div>
98
+ </div></li>
99
+ {% endif %}
100
+ {%- endfor -%}
101
+ </ol>
102
+ </div>
103
+ </div>
104
+ {% endif %}
105
+ </div>
106
+ </div>
107
+ {% endblock %}
@@ -0,0 +1,6 @@
1
+ {% extends "layout/mail.html" %}
2
+ {% block title %}{{ _('Change Email') }}{% endblock %}
3
+ {% block content %}
4
+ <p>{{ _('Hello, {0}! You can click following link to active your new email of your {1} account:').format(uname, handler.domain.ui.name|default(model.system.get('server.name'))) }}</p>
5
+ <p><a href="{{ url_prefix }}{{ path }}">{{ url_prefix }}{{ path }}</a></p>
6
+ {% endblock %}
@@ -0,0 +1,9 @@
1
+ {% extends "layout/immersive.html" %}
2
+ {% block content %}
3
+ <div class="immersive--content immersive--center">
4
+ <h1>{{ _('New Email') }}</h1>
5
+ <div class="text-center">
6
+ {{ _('Confirmation mail has been sent to your new email.') }}
7
+ </div>
8
+ </div>
9
+ {% endblock %}
@@ -0,0 +1,10 @@
1
+ {% extends "layout/immersive.html" %}
2
+ {% block content %}
3
+ <div class="immersive--content immersive--center">
4
+ <h1>{{ _('Done') }}</h1>
5
+ <div class="text-center">
6
+ {{ _('Your account will be deleted in 7 days.') }}
7
+ {{ _('You can cancel this at user setting page.') }}
8
+ </div>
9
+ </div>
10
+ {% endblock %}
@@ -0,0 +1,181 @@
1
+ {% import "components/home.html" as home with context %}
2
+ {% import "components/problem.html" as problem with context %}
3
+ {% extends "layout/basic.html" %}
4
+ {% block content %}
5
+ {{ set(UiContext, 'udoc', udoc) }}
6
+ <style>
7
+ .user-profile-bg {
8
+ background-image: url("{{ udoc.backgroundImage }}"), url("/components/profile/backgrounds/1.jpg");
9
+ }
10
+ </style>
11
+ <div class="row">
12
+ <div class="medium-9 columns">
13
+ <div class="section">
14
+ <div class="profile-header user-profile-bg">
15
+ <div class="profile-header__content">
16
+ <div class="media">
17
+ <div class="media__left">
18
+ <img src="{{ avatarUrl(udoc.avatar, 120) }}" width="120" height="120" class="large user-profile-avatar">
19
+ </div>
20
+ <div class="media__body profile-header__main">
21
+ <h1>
22
+ {{ udoc['uname'] }}
23
+ {% if handler.user.hasPerm(perm.PERM_VIEW_USER_PRIVATE_INFO) and udoc.displayName %}<small>({{ udoc['displayName'] }})</small>{% endif %}
24
+ </h1>
25
+ <p>
26
+ {{ _('UID') }}: {{ udoc['_id'] }},
27
+ {{ _('Registered at') }} {{ datetimeSpan(udoc['regat'])|safe }},
28
+ {{ _('last login at') }} {{ datetimeSpan(udoc['loginat'])|safe }},
29
+ {% if sdoc and sdoc.updateAt %}
30
+ {{ _('last active at') }} {{ datetimeSpan(sdoc['updateAt'])|safe if Date.now() - sdoc.updateAt.getTime() > 300000 else _('just now') }}.
31
+ {% else %}
32
+ {{ _('currently offline') }}.
33
+ {% endif %}
34
+ </p>
35
+ <p>{{ _('Solved {0} problems, RP: {1} (No. {2})').format(udoc.nAccept|default(0), udoc['rp']|default(0.0)|round(2), udoc['rank']|default('?')) }}</p>
36
+ {% for page in findSubModule('partials/profile_header/') %}{% if not page.endsWith('.source') %}{% include page %}{% endif %}{% endfor %}
37
+ {% if udoc._id != 1 and not udoc.hasPriv(PRIV.PRIV_USER_PROFILE) %}
38
+ <p>{{ _('This user was banned.') }}</p>
39
+ {% endif %}
40
+ <div class="profile-header__contact-bar">
41
+ {% if isSelfProfile %}
42
+ <a class="profile-header__contact-item" href="{{ url('home_settings', category='account') }}" data-tooltip="{{ _('Edit Profile') }}">
43
+ <span class="icon icon-edit"></span>
44
+ </a>
45
+ {% endif %}
46
+ <a class="profile-header__contact-item" href="{{ url('home_messages', query={target:udoc._id}) }}" target="_blank" data-tooltip="{{ _('Send Message') }}">
47
+ <span class="icon icon-comment--multiple"></span>
48
+ </a>
49
+ {% if udoc['mail'] %}
50
+ <a class="profile-header__contact-item" href="javascript:;" data-copy="{{ udoc['mail'] | base64_encode }}" data-tooltip="{{ _('Copy Email') }}">
51
+ <span class="icon icon-mail"></span>
52
+ </a>
53
+ {% endif %}
54
+ {% if udoc['qq'] %}
55
+ <a class="profile-header__contact-item" href="javascript:;" data-copy="{{ udoc['qq'] | base64_encode }}" data-tooltip="{{ _('Copy QQ Number') }}">
56
+ <span class="icon icon-qq"></span>
57
+ </a>
58
+ {% endif %}
59
+ {% if udoc['wechat'] %}
60
+ <a class="profile-header__contact-item" href="javascript:;" data-copy="{{ udoc['wechat'] | base64_encode }}" data-tooltip="{{ _('Copy WeChat Account') }}">
61
+ <span class="icon icon-wechat"></span>
62
+ </a>
63
+ {% endif %}
64
+ {% if udoc.gender and udoc.gender != model.builtin.USER_GENDER_OTHER %}
65
+ <span
66
+ class="profile-header__contact-item"
67
+ data-tooltip="{{ model.builtin.USER_GENDER_RANGE[udoc.gender] }}"
68
+ >
69
+ {{ model.builtin.USER_GENDER_ICONS[udoc.gender] }}
70
+ </span>
71
+ {% endif %}
72
+ {% if udoc.hasPriv(PRIV.PRIV_MOD_BADGE) %}
73
+ <span
74
+ class="profile-header__contact-item user-profile-badge badge--su"
75
+ data-tooltip="{{ _('{0} is a superuser.').format(_('She' if udoc.gender == 1 else 'He')) }}"
76
+ >
77
+ SU
78
+ </span>
79
+ {% elif udoc.hasPerm(perm.PERM_MOD_BADGE) %}
80
+ <span
81
+ class="profile-header__contact-item user-profile-badge badge--mod"
82
+ data-tooltip="{{ _('{0} is a moderator of this domain.').format(_('She' if udoc.gender == 1 else 'He')) }}"
83
+ >
84
+ MOD
85
+ </span>
86
+ {% endif %}
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ <div class="profile-content">
93
+ <div class="section__tab-container immersive memo">
94
+ <ul class="section__tabs">
95
+ <li class="section__tab-item">
96
+ <h1 class="section__tab-title">{{ _('Bio') }}</h1>
97
+ <div class="section__tab-main">
98
+ {% if not udoc.bio %}
99
+ {{ nothing.render("This person is lazy and didn't write anything.") }}
100
+ {% else %}
101
+ <div class="section__body typo richmedia">
102
+ {{ udoc.bio|default('')|markdown|safe }}
103
+ </div>
104
+ {% endif %}
105
+ </div>
106
+ </li>
107
+ {% if pdocs.length %}
108
+ <li class="section__tab-item">
109
+ <h1 class="section__tab-title">{{ _('Accepted Problems') }}</h1>
110
+ <div class="section__tab-main">
111
+ <div class="typo section__body no-media">
112
+ {% set _mark = Math.ceil(pdocs.length/4) %}
113
+ {% macro col(pdocs) %}
114
+ <div class="medium-3 columns"><ul>
115
+ {% for pdoc in pdocs %}
116
+ <li>{{ problem.render_problem_title(pdoc, show_tags=false, small=true) }}</li>
117
+ {% endfor %}
118
+ </ul></div>
119
+ {% endmacro %}
120
+ <div class="row">
121
+ {{ col(pdocs.slice(0, _mark)) }}
122
+ {{ col(pdocs.slice(_mark, _mark*2)) }}
123
+ {{ col(pdocs.slice(_mark*2, _mark*3)) }}
124
+ {{ col(pdocs.slice(_mark*3)) }}
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </li>
129
+ {% endif %}
130
+ {% for page in findSubModule('partials/user_detail/') %}{% include page %}{% endfor %}
131
+ </ul>
132
+ </div>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ <div class="medium-3 columns">
137
+ {% if isSelfProfile %}
138
+ {{ home.render_sidebar() }}
139
+ {% endif %}
140
+ <div class="section side">
141
+ <div class="section__body">
142
+ <div class="balancer sidebar-user-stat">
143
+ <div class="balancer__body">
144
+ <div class="numbox">
145
+ <div class="numbox__num medium">{{ udoc.nSubmit or 0 }}</div>
146
+ <div class="numbox__text">{{ _('Submitted') }}</div>
147
+ </div>
148
+ </div>
149
+ <div class="balancer__body">
150
+ <div class="numbox">
151
+ <div class="numbox__num medium">{{ udoc.nAccept or 0 }}</div>
152
+ <div class="numbox__text">{{ _('Accepted') }}</div>
153
+ </div>
154
+ </div>
155
+ <div class="balancer__body">
156
+ <div class="numbox">
157
+ <div class="numbox__num medium">{{ udoc.nLiked or 0 }}</div>
158
+ <div class="numbox__text">{{ _('Solutions Liked') }}</div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ {% if tags.length %}
165
+ <div class="section side">
166
+ <div class="section__header">
167
+ <h2 class="section__title">{{ _('Problem Tags') }}</h2>
168
+ </div>
169
+ <div class="typo section__body no-media">
170
+ <dl class="exlarge horizontal">
171
+ {% for tag in tags %}
172
+ <dt>{{ tag[0] }}</dt>
173
+ <dd>{{ tag[1] }}</dd>
174
+ {% endfor %}
175
+ </dl>
176
+ </div>
177
+ </div>
178
+ {% endif %}
179
+ </div>
180
+ </div>
181
+ {% endblock %}