@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.
- package/README.md +5 -0
- package/api.ts +61 -0
- package/backendlib/builder.ts +182 -0
- package/backendlib/markdown-it-imsize.ts +235 -0
- package/backendlib/markdown-it-katex.ts +139 -0
- package/backendlib/markdown-it-media.ts +163 -0
- package/backendlib/markdown-it-xss.ts +200 -0
- package/backendlib/markdown.js +64 -0
- package/backendlib/misc.ts +54 -0
- package/backendlib/template.ts +279 -0
- package/breakpoints.json +5 -0
- package/components/DOMAttachedObject.ts +128 -0
- package/components/autocomplete/AssignSelectAutoComplete.tsx +22 -0
- package/components/autocomplete/CustomSelectAutoComplete.tsx +23 -0
- package/components/autocomplete/DomainSelectAutoComplete.tsx +18 -0
- package/components/autocomplete/FileSelectAutoComplete.tsx +26 -0
- package/components/autocomplete/LanguageSelectAutoComplete.tsx +24 -0
- package/components/autocomplete/ProblemSelectAutoComplete.tsx +18 -0
- package/components/autocomplete/UserSelectAutoComplete.tsx +23 -0
- package/components/autocomplete/components/AssignSelectAutoComplete.tsx +118 -0
- package/components/autocomplete/components/DomainSelectAutoComplete.tsx +53 -0
- package/components/autocomplete/components/FileSelectAutoComplete.tsx +50 -0
- package/components/autocomplete/components/LanguageSelectAutoComplete.tsx +48 -0
- package/components/autocomplete/components/ProblemSelectAutoComplete.tsx +54 -0
- package/components/autocomplete/components/UserSelectAutoComplete.tsx +54 -0
- package/components/autocomplete/domainselectautocomplete.page.styl +6 -0
- package/components/autocomplete/index.tsx +110 -0
- package/components/autocomplete/problemselectautocomplete.page.styl +6 -0
- package/components/autocomplete/userselectautocomplete.page.styl +6 -0
- package/components/browser-update.page.ts +27 -0
- package/components/calendar/calendar.page.styl +129 -0
- package/components/calendar/index.js +367 -0
- package/components/clipboard.page.ts +23 -0
- package/components/contest/contest.page.styl +119 -0
- package/components/contest/contest.page.ts +23 -0
- package/components/contest/contest_sidebar.page.styl +21 -0
- package/components/contest/problem-contest-bg.png +0 -0
- package/components/contest/problem-contest-bg@2x.png +0 -0
- package/components/customFont.page.tsx +90 -0
- package/components/datepicker/datepicker.page.tsx +94 -0
- package/components/dialog/DomDialog.ts +145 -0
- package/components/dialog/dialog.page.styl +40 -0
- package/components/dialog/index.tsx +285 -0
- package/components/discussion/CommentBox.js +103 -0
- package/components/discussion/collapsible.page.styl +40 -0
- package/components/discussion/collapsible.page.tsx +62 -0
- package/components/discussion/comments.page.styl +142 -0
- package/components/discussion/comments.page.tsx +192 -0
- package/components/discussion/discussion.page.styl +17 -0
- package/components/discussion/history.page.tsx +81 -0
- package/components/discussion/reaction.page.styl +30 -0
- package/components/discussion/reaction.page.tsx +103 -0
- package/components/drop/drop.page.styl +40 -0
- package/components/dropdown/Dropdown.js +50 -0
- package/components/dropdown/dropdown.page.styl +33 -0
- package/components/dropdown/dropdown.page.ts +8 -0
- package/components/editor/cmeditor.page.ts +23 -0
- package/components/editor/cmeditor.styl +10 -0
- package/components/editor/index.tsx +293 -0
- package/components/editor/mdeditor.ts +60 -0
- package/components/editor/textareaHandler.ts +29 -0
- package/components/footer/footer.page.styl +94 -0
- package/components/footer/footer.page.ts +26 -0
- package/components/form/button.page.default.styl +59 -0
- package/components/form/button.page.styl +36 -0
- package/components/form/checkbox.page.styl +89 -0
- package/components/form/form.page.styl +200 -0
- package/components/form/form.page.ts +20 -0
- package/components/form/multiSelectCheckbox.page.js +46 -0
- package/components/form/radiobox.page.styl +62 -0
- package/components/form/select.page.styl +29 -0
- package/components/form/textbox.page.styl +79 -0
- package/components/form/textbox.page.ts +21 -0
- package/components/form/var.inc.styl +14 -0
- package/components/header/header.page.styl +79 -0
- package/components/highlighter/code-example.js +111 -0
- package/components/highlighter/highlighter.page.styl +99 -0
- package/components/highlighter/highlighter.page.ts +72 -0
- package/components/highlighter/meta.js +15 -0
- package/components/highlighter/prismjs.js +122 -0
- package/components/hint.page.styl +9 -0
- package/components/hint.ts +19 -0
- package/components/hitokoto/index.page.js +21 -0
- package/components/hotkey/hotkey.page.js +83 -0
- package/components/katex/katex.page.js +26 -0
- package/components/katex/katex.page.styl +2 -0
- package/components/languageselect.tsx +94 -0
- package/components/loader/loader.page.styl +40 -0
- package/components/mantine.page.tsx +39 -0
- package/components/marker/Marker.js +192 -0
- package/components/marker/MarkerReactive.js +55 -0
- package/components/marker/marker.page.js +8 -0
- package/components/marker/marker.page.styl +57 -0
- package/components/media/media.page.js +46 -0
- package/components/menu/menu-heading.page.js +28 -0
- package/components/menu/menu.page.js +18 -0
- package/components/menu/menu.page.styl +68 -0
- package/components/message/index.page.ts +166 -0
- package/components/message/worker.ts +110 -0
- package/components/messagepad/DialogueListItem.page.styl +28 -0
- package/components/messagepad/DialogueListItemComponent.jsx +39 -0
- package/components/messagepad/Message.page.styl +64 -0
- package/components/messagepad/MessageComponent.jsx +33 -0
- package/components/messagepad/MessagePad.page.styl +99 -0
- package/components/messagepad/MessagePadDialogueContentContainer.jsx +104 -0
- package/components/messagepad/MessagePadDialogueListContainer.jsx +49 -0
- package/components/messagepad/MessagePadInputContainer.jsx +100 -0
- package/components/messagepad/index.jsx +49 -0
- package/components/messagepad/reducers/activeId.ts +36 -0
- package/components/messagepad/reducers/dialogues.js +53 -0
- package/components/messagepad/reducers/index.ts +14 -0
- package/components/messagepad/reducers/inputs.js +43 -0
- package/components/messagepad/reducers/isPosting.ts +49 -0
- package/components/monaco/index.ts +178 -0
- package/components/monaco/languages/markdown.ts +97 -0
- package/components/monaco/languages/typescript.ts +45 -0
- package/components/monaco/languages/yaml.ts +22 -0
- package/components/monaco/loader.ts +96 -0
- package/components/monaco/monaco.styl +30 -0
- package/components/monaco/nls.js +31 -0
- package/components/monaco/schema/problemconfig.ts +123 -0
- package/components/navigation/hamburgers.page.styl +87 -0
- package/components/navigation/nav-logo-small_dark.png +0 -0
- package/components/navigation/navigation.page.js +203 -0
- package/components/navigation/navigation.page.styl +211 -0
- package/components/notification/index.ts +105 -0
- package/components/notification/notification.page.js +14 -0
- package/components/notification/notification.page.styl +84 -0
- package/components/nprogress.page.styl +50 -0
- package/components/omnisearch/index.page.tsx +124 -0
- package/components/omnisearch/omnibar.page.styl +138 -0
- package/components/pager/pager.page.styl +57 -0
- package/components/preview/preview.page.ts +187 -0
- package/components/problem/create.page.js +12 -0
- package/components/problem/list.page.js +9 -0
- package/components/problem/rp.page.styl +4 -0
- package/components/problem/tag.page.styl +84 -0
- package/components/problemconfig/BasicForm.tsx +92 -0
- package/components/problemconfig/ProblemConfigEditor.tsx +170 -0
- package/components/problemconfig/ProblemConfigForm.tsx +140 -0
- package/components/problemconfig/ProblemConfigTree.tsx +163 -0
- package/components/problemconfig/ProblemType.tsx +165 -0
- package/components/problemconfig/index.tsx +91 -0
- package/components/problemconfig/reducer/config.ts +173 -0
- package/components/problemconfig/reducer/index.ts +11 -0
- package/components/problemconfig/reducer/testdata.ts +16 -0
- package/components/problemconfig/tree/AddTestcase.tsx +137 -0
- package/components/problemconfig/tree/SelectionManager.tsx +140 -0
- package/components/problemconfig/tree/SubtaskSettings.tsx +180 -0
- package/components/problemconfig/tree/Testcase.tsx +98 -0
- package/components/profile/backgrounds/1.jpg +0 -0
- package/components/profile/backgrounds/10.jpg +0 -0
- package/components/profile/backgrounds/11.jpg +0 -0
- package/components/profile/backgrounds/12.jpg +0 -0
- package/components/profile/backgrounds/13.jpg +0 -0
- package/components/profile/backgrounds/14.jpg +0 -0
- package/components/profile/backgrounds/15.jpg +0 -0
- package/components/profile/backgrounds/16.jpg +0 -0
- package/components/profile/backgrounds/17.jpg +0 -0
- package/components/profile/backgrounds/18.jpg +0 -0
- package/components/profile/backgrounds/19.jpg +0 -0
- package/components/profile/backgrounds/2.jpg +0 -0
- package/components/profile/backgrounds/20.jpg +0 -0
- package/components/profile/backgrounds/21.jpg +0 -0
- package/components/profile/backgrounds/3.jpg +0 -0
- package/components/profile/backgrounds/4.jpg +0 -0
- package/components/profile/backgrounds/5.jpg +0 -0
- package/components/profile/backgrounds/6.jpg +0 -0
- package/components/profile/backgrounds/7.jpg +0 -0
- package/components/profile/backgrounds/8.jpg +0 -0
- package/components/profile/backgrounds/9.jpg +0 -0
- package/components/profile/backgrounds/gen_thumbnails.sh +7 -0
- package/components/profile/backgrounds/thumbnail/1.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/10.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/11.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/12.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/13.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/14.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/15.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/16.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/17.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/18.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/19.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/2.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/20.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/21.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/3.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/4.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/5.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/6.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/7.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/8.jpg +0 -0
- package/components/profile/backgrounds/thumbnail/9.jpg +0 -0
- package/components/profile/profile.page.styl +23 -0
- package/components/react/DomComponent.tsx +14 -0
- package/components/react/IconComponent.tsx +20 -0
- package/components/record/record.page.styl +26 -0
- package/components/rotator/index.js +75 -0
- package/components/rotator/rotator.page.styl +20 -0
- package/components/scratchpad/DataInput.page.styl +17 -0
- package/components/scratchpad/DataInputComponent.jsx +45 -0
- package/components/scratchpad/Editor.page.styl +13 -0
- package/components/scratchpad/Panel.page.styl +18 -0
- package/components/scratchpad/PanelButton.page.styl +15 -0
- package/components/scratchpad/PanelButtonComponent.jsx +19 -0
- package/components/scratchpad/PanelComponent.jsx +25 -0
- package/components/scratchpad/ScratchpadEditorContainer.tsx +137 -0
- package/components/scratchpad/ScratchpadPretestContainer.jsx +57 -0
- package/components/scratchpad/ScratchpadRecordsContainer.jsx +45 -0
- package/components/scratchpad/ScratchpadRecordsRowContainer.jsx +83 -0
- package/components/scratchpad/ScratchpadSettings.tsx +48 -0
- package/components/scratchpad/ScratchpadToolbarContainer.jsx +190 -0
- package/components/scratchpad/Tab.page.styl +24 -0
- package/components/scratchpad/Toolbar.page.styl +53 -0
- package/components/scratchpad/ToolbarComponent.jsx +85 -0
- package/components/scratchpad/index.tsx +132 -0
- package/components/scratchpad/reducers/editor.ts +24 -0
- package/components/scratchpad/reducers/index.ts +17 -0
- package/components/scratchpad/reducers/pretest.ts +34 -0
- package/components/scratchpad/reducers/records.ts +40 -0
- package/components/scratchpad/reducers/state.ts +10 -0
- package/components/scratchpad/reducers/ui.ts +152 -0
- package/components/scratchpad/scratchpad.page.styl +55 -0
- package/components/scratchpad/var.inc.styl +2 -0
- package/components/selectUser.tsx +16 -0
- package/components/signin/signInDialog.page.js +84 -0
- package/components/signin/signin_dialog.page.styl +57 -0
- package/components/smoothscroll/smoothscroll.page.js +44 -0
- package/components/socket/index.ts +68 -0
- package/components/star/star.page.styl +20 -0
- package/components/star/star.page.ts +58 -0
- package/components/sticky/sticky.page.js +66 -0
- package/components/tab/Tab.js +168 -0
- package/components/tab/tab.page.js +9 -0
- package/components/tab/tab.page.styl +105 -0
- package/components/tab/var.inc.styl +3 -0
- package/components/table/StyledTable.js +51 -0
- package/components/table/styledTable.page.js +8 -0
- package/components/table/table.page.styl +73 -0
- package/components/time/time.page.js +47 -0
- package/components/tooltip/Tooltip.js +49 -0
- package/components/tooltip/tooltip.page.js +29 -0
- package/components/tooltip/tooltip.page.styl +69 -0
- package/components/training/training.page.styl +25 -0
- package/components/upload.tsx +103 -0
- package/components/vote/vote.page.js +43 -0
- package/components/zipDownloader/index.ts +157 -0
- package/constant/domain.js +21 -0
- package/constant/message.js +5 -0
- package/constant/record.js +52 -0
- package/context.ts +11 -0
- package/entry.js +72 -0
- package/hydro.ts +112 -0
- package/index.ts +226 -0
- package/lazyload.ts +69 -0
- package/locales/en.yaml +71 -0
- package/locales/ko.yaml +823 -0
- package/locales/zh.yaml +1137 -0
- package/locales/zh_TW.yaml +1133 -0
- package/misc/Page.ts +49 -0
- package/misc/PageLoader.js +31 -0
- package/misc/float.styl +14 -0
- package/misc/grid.styl +1048 -0
- package/misc/immersive-background.jpg +0 -0
- package/misc/immersive-background@2x.jpg +0 -0
- package/misc/immersive.styl +23 -0
- package/misc/nothing.styl +13 -0
- package/misc/puzzled_twd2.svg +1 -0
- package/misc/section.styl +105 -0
- package/misc/slideout.styl +46 -0
- package/misc/structure.styl +158 -0
- package/misc/textalign.styl +11 -0
- package/misc/typography.styl +485 -0
- package/package.json +148 -0
- package/polyfill.ts +90 -0
- package/postcss.config.js +15 -0
- package/sentry.ts +26 -0
- package/service-worker.ts +265 -0
- package/setting.yaml +98 -0
- package/templates/about.html +14 -0
- package/templates/bsod.html +35 -0
- package/templates/components/comments_discussion.html +165 -0
- package/templates/components/comments_solution.html +171 -0
- package/templates/components/contest.html +12 -0
- package/templates/components/form.html +214 -0
- package/templates/components/home.html +20 -0
- package/templates/components/homework.html +8 -0
- package/templates/components/md_hint.html +39 -0
- package/templates/components/noscript_note.html +15 -0
- package/templates/components/nothing.html +6 -0
- package/templates/components/paginator.html +25 -0
- package/templates/components/problem.html +33 -0
- package/templates/components/record.html +21 -0
- package/templates/components/sidemenu.html +11 -0
- package/templates/components/user.html +49 -0
- package/templates/contest_balloon.html +48 -0
- package/templates/contest_clarification.html +103 -0
- package/templates/contest_detail.html +56 -0
- package/templates/contest_edit.html +259 -0
- package/templates/contest_main.html +146 -0
- package/templates/contest_manage.html +80 -0
- package/templates/contest_print.html +27 -0
- package/templates/contest_problemlist.html +231 -0
- package/templates/contest_scoreboard.html +46 -0
- package/templates/contest_scoreboard_download_html.html +71 -0
- package/templates/contest_user.html +47 -0
- package/templates/discussion_create.html +28 -0
- package/templates/discussion_detail.html +149 -0
- package/templates/discussion_edit.html +30 -0
- package/templates/discussion_main_or_node.html +47 -0
- package/templates/domain_base.html +26 -0
- package/templates/domain_create.html +55 -0
- package/templates/domain_dashboard.html +45 -0
- package/templates/domain_edit.html +6 -0
- package/templates/domain_group.html +51 -0
- package/templates/domain_join.html +47 -0
- package/templates/domain_join_applications.html +67 -0
- package/templates/domain_permission.html +66 -0
- package/templates/domain_role.html +71 -0
- package/templates/domain_user.html +86 -0
- package/templates/domain_user_raw.html +5 -0
- package/templates/error.html +25 -0
- package/templates/home_domain.html +64 -0
- package/templates/home_files.html +16 -0
- package/templates/home_messages.html +9 -0
- package/templates/home_security.html +224 -0
- package/templates/home_settings.html +21 -0
- package/templates/homework_detail.html +82 -0
- package/templates/homework_edit.html +138 -0
- package/templates/homework_files.html +24 -0
- package/templates/homework_main.html +76 -0
- package/templates/layout/basic.html +27 -0
- package/templates/layout/home_base.html +13 -0
- package/templates/layout/html5.html +74 -0
- package/templates/layout/immersive.html +22 -0
- package/templates/layout/mail.html +31 -0
- package/templates/layout/simple.html +4 -0
- package/templates/layout/wiki_base.html +16 -0
- package/templates/main.html +22 -0
- package/templates/manage_base.html +24 -0
- package/templates/manage_config.html +6 -0
- package/templates/manage_dashboard.html +27 -0
- package/templates/manage_script.html +56 -0
- package/templates/manage_setting.html +6 -0
- package/templates/manage_user_import.html +23 -0
- package/templates/manage_user_priv.html +76 -0
- package/templates/partials/category.html +19 -0
- package/templates/partials/contest.html +3 -0
- package/templates/partials/contest_balloon.html +37 -0
- package/templates/partials/contest_sidebar.html +150 -0
- package/templates/partials/contest_sidebar_management.html +56 -0
- package/templates/partials/contest_user.html +19 -0
- package/templates/partials/discussion_edit_form.html +45 -0
- package/templates/partials/discussion_list.html +50 -0
- package/templates/partials/discussion_nodes_widget.html +17 -0
- package/templates/partials/files.html +49 -0
- package/templates/partials/footer.html +108 -0
- package/templates/partials/hamburger.html +7 -0
- package/templates/partials/header_mobile.html +12 -0
- package/templates/partials/homepage/bulletin.html +7 -0
- package/templates/partials/homepage/contest.html +48 -0
- package/templates/partials/homepage/discussion.html +13 -0
- package/templates/partials/homepage/discussion_nodes.html +4 -0
- package/templates/partials/homepage/error.html +5 -0
- package/templates/partials/homepage/hitokoto.html +6 -0
- package/templates/partials/homepage/homework.html +45 -0
- package/templates/partials/homepage/problem_search.html +13 -0
- package/templates/partials/homepage/ranking.html +39 -0
- package/templates/partials/homepage/recent_problems.html +17 -0
- package/templates/partials/homepage/starred_problems.html +15 -0
- package/templates/partials/homepage/suggestion.html +34 -0
- package/templates/partials/homepage/training.html +50 -0
- package/templates/partials/homework.html +3 -0
- package/templates/partials/homework_default_penalty_rules.yaml +6 -0
- package/templates/partials/homework_sidebar.html +93 -0
- package/templates/partials/login_dialog.html +56 -0
- package/templates/partials/manage_user_priv.html +78 -0
- package/templates/partials/nav.html +138 -0
- package/templates/partials/problem-sidebar-information.html +25 -0
- package/templates/partials/problem.html +2 -0
- package/templates/partials/problem_category_dialog.html +43 -0
- package/templates/partials/problem_default.md +26 -0
- package/templates/partials/problem_description.html +33 -0
- package/templates/partials/problem_files.html +63 -0
- package/templates/partials/problem_list.html +68 -0
- package/templates/partials/problem_lucky.html +10 -0
- package/templates/partials/problem_sidebar.html +14 -0
- package/templates/partials/problem_sidebar_contest.html +43 -0
- package/templates/partials/problem_sidebar_homework.html +42 -0
- package/templates/partials/problem_sidebar_normal.html +152 -0
- package/templates/partials/problem_stat.html +3 -0
- package/templates/partials/scoreboard.html +79 -0
- package/templates/partials/setting.html +92 -0
- package/templates/partials/training_default.json +14 -0
- package/templates/partials/training_detail.html +153 -0
- package/templates/partials/user.html +2 -0
- package/templates/partials/user_detail/activity.html +18 -0
- package/templates/partials/user_detail/solution.html +29 -0
- package/templates/problem_config.html +39 -0
- package/templates/problem_detail.html +150 -0
- package/templates/problem_edit.html +111 -0
- package/templates/problem_files.html +91 -0
- package/templates/problem_hack.html +41 -0
- package/templates/problem_import.html +58 -0
- package/templates/problem_main.html +100 -0
- package/templates/problem_solution.html +55 -0
- package/templates/problem_statistics.html +96 -0
- package/templates/problem_submit.html +40 -0
- package/templates/ranking.html +81 -0
- package/templates/record_detail.html +134 -0
- package/templates/record_detail_status.html +93 -0
- package/templates/record_detail_summary.html +19 -0
- package/templates/record_main.html +142 -0
- package/templates/record_main_tr.html +35 -0
- package/templates/status.html +75 -0
- package/templates/training_detail.html +120 -0
- package/templates/training_edit.html +68 -0
- package/templates/training_files.html +64 -0
- package/templates/training_main.html +107 -0
- package/templates/user_changemail_mail.html +6 -0
- package/templates/user_changemail_mail_sent.html +9 -0
- package/templates/user_delete_pending.html +10 -0
- package/templates/user_detail.html +181 -0
- package/templates/user_login.html +46 -0
- package/templates/user_logout.html +13 -0
- package/templates/user_lostpass.html +27 -0
- package/templates/user_lostpass_mail.html +6 -0
- package/templates/user_lostpass_mail_sent.html +9 -0
- package/templates/user_lostpass_with_code.html +29 -0
- package/templates/user_register.html +22 -0
- package/templates/user_register_mail.html +6 -0
- package/templates/user_register_mail_sent.html +9 -0
- package/templates/user_register_with_code.html +35 -0
- package/templates/user_sudo.html +54 -0
- package/templates/user_sudo_redirect.html +18 -0
- package/templates/wiki_help.html +189 -0
- package/theme/bp6-compat.css +48 -0
- package/theme/dark.styl +397 -0
- package/theme/default.js +33 -0
- package/typed.d.ts +20 -0
- package/utils/base.ts +209 -0
- package/utils/base64.js +104 -0
- package/utils/db.ts +32 -0
- package/utils/index.ts +73 -0
- package/utils/loadReactRedux.ts +32 -0
- package/utils/mediaQuery.ts +13 -0
- package/utils/pjax.js +148 -0
- package/utils/slide.ts +57 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{% extends "domain_base.html" %}
|
|
2
|
+
{% block domain_content %}
|
|
3
|
+
<div style="display: none" class="dialog__body--create-role">
|
|
4
|
+
<div>
|
|
5
|
+
<div class="row"><div class="columns">
|
|
6
|
+
<h1>{{ _('Create Role') }}</h1>
|
|
7
|
+
</div></div>
|
|
8
|
+
<div class="row"><div class="columns">
|
|
9
|
+
<blockquote class="note">
|
|
10
|
+
<p>{{ _('Role name can only contains numbers, letters and underscores.') }}</p>
|
|
11
|
+
</blockquote>
|
|
12
|
+
{{ form.form_text({
|
|
13
|
+
columns:None,
|
|
14
|
+
label:'Name',
|
|
15
|
+
name:'role',
|
|
16
|
+
autofocus:true
|
|
17
|
+
}) }}
|
|
18
|
+
</div></div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="section">
|
|
22
|
+
<div class="section__header">
|
|
23
|
+
<h1 class="section__title">{{ _('{0}: Roles').format(domain.name) }}</h1>
|
|
24
|
+
<div class="section__tools">
|
|
25
|
+
<button class="primary rounded button" name="create_role">{{ _('Create Role') }}</button>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
{{ noscript_note.render() }}
|
|
29
|
+
<div class="section__body no-padding domain-roles">
|
|
30
|
+
<table class="data-table">
|
|
31
|
+
<colgroup>
|
|
32
|
+
<col class="col--checkbox">
|
|
33
|
+
<col class="col--id">
|
|
34
|
+
<col class="col--users">
|
|
35
|
+
</colgroup>
|
|
36
|
+
<thead>
|
|
37
|
+
<tr>
|
|
38
|
+
<th class="col--checkbox">
|
|
39
|
+
<label class="compact checkbox">
|
|
40
|
+
<input type="checkbox" data-checkbox-toggle="role">
|
|
41
|
+
</label>
|
|
42
|
+
</th>
|
|
43
|
+
<th class="col--id">{{ _('Role') }}</th>
|
|
44
|
+
<th class="col--users">{{ _('Users') }}</th>
|
|
45
|
+
</tr>
|
|
46
|
+
</thead>
|
|
47
|
+
<tbody>
|
|
48
|
+
{%- for role in roles -%}
|
|
49
|
+
{% set isBuiltin = role._id in ['default', 'guest', 'root'] %}
|
|
50
|
+
<tr{% if not isBuiltin %} data-role="{{ role._id }}"{% endif %}>
|
|
51
|
+
<td class="col--checkbox">
|
|
52
|
+
<label class="compact checkbox">
|
|
53
|
+
<input type="checkbox" data-checkbox-group="role" {{ "disabled" if isBuiltin else "data-checkbox-range" }}>
|
|
54
|
+
</label>
|
|
55
|
+
</td>
|
|
56
|
+
<td class="col--id">
|
|
57
|
+
{{ _('Built-in') if isBuiltin else _('User-defined role') }}: {{ role._id }}
|
|
58
|
+
</td>
|
|
59
|
+
<td class="col--users">
|
|
60
|
+
{{ role.count|default('--') }}
|
|
61
|
+
</td>
|
|
62
|
+
</tr>
|
|
63
|
+
{%- endfor -%}
|
|
64
|
+
</tbody>
|
|
65
|
+
</table>
|
|
66
|
+
</div>
|
|
67
|
+
<div class="section__body">
|
|
68
|
+
<button class="rounded button" name="delete_selected">{{ _('Delete Selected Roles') }}</button>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
{% endblock %}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{% extends "domain_base.html" %}
|
|
2
|
+
{% block domain_content %}
|
|
3
|
+
{{ set(UiContext, 'roles', roles.map(eval('(i) => i._id'))) }}
|
|
4
|
+
{{ set(UiContext, 'canForceJoin', model.system.get('server.allowInvite') or handler.user.hasPriv(PRIV.PRIV_MANAGE_ALL_DOMAIN)) }}
|
|
5
|
+
{% set _rolesSelect = roles.filter(eval("(i) => i._id !== 'guest'")).map(eval('(role) => [role._id, role._id]')) %}
|
|
6
|
+
<div class="section">
|
|
7
|
+
<div class="section__header">
|
|
8
|
+
<h1 class="section__title">{{ _('{0}: Users').format(domain.name) }}</h1>
|
|
9
|
+
<div class="section__tools">
|
|
10
|
+
<button class="primary rounded button" name="add_user">{{ _('Add User') }}</button>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
{{ noscript_note.render() }}
|
|
14
|
+
<div class="section__body no-padding domain-users">
|
|
15
|
+
<table class="data-table">
|
|
16
|
+
<colgroup>
|
|
17
|
+
<col class="col--checkbox">
|
|
18
|
+
<col class="col--uid">
|
|
19
|
+
<col class="col--user">
|
|
20
|
+
<col class="col--role">
|
|
21
|
+
</colgroup>
|
|
22
|
+
<thead>
|
|
23
|
+
<tr>
|
|
24
|
+
<th class="col--checkbox">
|
|
25
|
+
<label class="compact checkbox">
|
|
26
|
+
<input type="checkbox" name="select_all" data-checkbox-toggle="user">
|
|
27
|
+
</label>
|
|
28
|
+
</th>
|
|
29
|
+
<th class="col--uid">{{ _('User ID') }}</th>
|
|
30
|
+
<th class="col--user">{{ _('Username') }}</th>
|
|
31
|
+
<th class="col--role">{{ _('Role') }}</th>
|
|
32
|
+
</tr>
|
|
33
|
+
</thead>
|
|
34
|
+
<tbody>
|
|
35
|
+
{%- for role, udocs in rudocs -%}
|
|
36
|
+
{%- if udocs|length > 50 -%}
|
|
37
|
+
<tr>
|
|
38
|
+
<td colspan="3" style="text-wrap: wrap;"><div style="max-height: 300px; overflow-y: auto">
|
|
39
|
+
{%- for udoc in udocs -%}
|
|
40
|
+
{% set is_disabled=(rudoc._id == handler.user._id) %}
|
|
41
|
+
<input type="checkbox" data-uid="{{udoc._id}}" data-checkbox-group="user" {% if is_disabled %}disabled{% else %}data-checkbox-range{% endif %}>
|
|
42
|
+
[{{udoc._id}}]{{ user.render_inline(udoc, avatar=false, badge=false) }}{% if not udoc.join %}
|
|
43
|
+
<span class="not-joined">({{ _('Not joined yet') }})</span>
|
|
44
|
+
{% endif %}
|
|
45
|
+
{%- endfor -%}
|
|
46
|
+
</div></td>
|
|
47
|
+
<td>{{ role }}</td>
|
|
48
|
+
</tr>
|
|
49
|
+
{%- else -%}
|
|
50
|
+
{%- for rudoc in udocs -%}
|
|
51
|
+
{% set is_disabled=(rudoc._id == handler.user._id) %}
|
|
52
|
+
<tr data-uid="{{ rudoc._id }}">
|
|
53
|
+
<td class="col--checkbox">
|
|
54
|
+
<label class="compact checkbox">
|
|
55
|
+
<input type="checkbox" data-checkbox-group="user" {% if is_disabled %}disabled{% else %}data-checkbox-range{% endif %}>
|
|
56
|
+
</label>
|
|
57
|
+
</td>
|
|
58
|
+
<td class="col--uid">
|
|
59
|
+
{{ rudoc._id }}
|
|
60
|
+
</td>
|
|
61
|
+
<td class="col--user">
|
|
62
|
+
{{ user.render_inline(rudoc, badge=false) }}
|
|
63
|
+
{% if not rudoc.join %}<span class="text-orange">({{ _('Not joined yet') }})</span>{% endif %}
|
|
64
|
+
</td>
|
|
65
|
+
<td class="col--role">
|
|
66
|
+
{{ form.select({
|
|
67
|
+
options:_rolesSelect,
|
|
68
|
+
name:'role',
|
|
69
|
+
value:rudoc.role,
|
|
70
|
+
extra_class:'compact',
|
|
71
|
+
disabled:is_disabled
|
|
72
|
+
}) }}
|
|
73
|
+
</td>
|
|
74
|
+
</tr>
|
|
75
|
+
{%- endfor -%}
|
|
76
|
+
{%- endif -%}
|
|
77
|
+
{%- endfor -%}
|
|
78
|
+
</tbody>
|
|
79
|
+
</table>
|
|
80
|
+
</div>
|
|
81
|
+
<div class="section__body">
|
|
82
|
+
<button class="rounded button" name="remove_selected">{{ _('Remove Selected User') }}</button>
|
|
83
|
+
<button class="rounded button" name="set_roles">{{ _('Set Roles for Selected User') }}</button>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
{% endblock %}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{% extends "layout/basic.html" %}
|
|
2
|
+
{% block content %}
|
|
3
|
+
<div class="error__container clearfix">
|
|
4
|
+
<div class="error__icon-container">
|
|
5
|
+
<div class="error__twd2"></div>
|
|
6
|
+
</div>
|
|
7
|
+
<div class="error__text-container">
|
|
8
|
+
<h1>{{ _('Oops!') }}</h1>
|
|
9
|
+
<p>{{ _(error.message).formatFromArray(error.params) }}</p>
|
|
10
|
+
<p>{{ _('Technical Information') }}:</p>
|
|
11
|
+
<p>{{ _('Type') }}: {{ error.name }}</p>
|
|
12
|
+
<p>{{ _('Arguments') }}:
|
|
13
|
+
<ol>
|
|
14
|
+
{%- for param in error.params -%}
|
|
15
|
+
{% if instanceof(param, UserFacingError) %}
|
|
16
|
+
<li>{{ _(param.message).formatFromArray(param.params)}}</li>
|
|
17
|
+
{% else %}
|
|
18
|
+
<li>{{ param }}</li>
|
|
19
|
+
{% endif %}
|
|
20
|
+
{%- endfor -%}
|
|
21
|
+
</ol>
|
|
22
|
+
</p>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
{% endblock %}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{% extends "layout/home_base.html" %}
|
|
2
|
+
{% block home_content %}
|
|
3
|
+
<div class="section">
|
|
4
|
+
<div class="section__header">
|
|
5
|
+
<h1 class="section__title">{{ _('My Domains') }}</h1>
|
|
6
|
+
<div class="section__tools">
|
|
7
|
+
{% if handler.user.hasPriv(model.builtin.PRIV.PRIV_CREATE_DOMAIN) %}
|
|
8
|
+
<a class="primary rounded button" href="{{ url('home_domain_create') }}"><span class="icon icon-add"></span> {{ _('Create Domain') }}</a>
|
|
9
|
+
{% endif %}
|
|
10
|
+
{% if handler.user.hasPriv(model.builtin.PRIV.PRIV_USER_PROFILE) %}
|
|
11
|
+
<button class="primary rounded button nojs--hide" id="join-domain-button"><span class="icon icon-add"></span> {{ _('Join Domain') }}</button>
|
|
12
|
+
{% endif %}
|
|
13
|
+
<a class="tool-button" href="{{ url('wiki_help', anchor='domain') }}"><span class="icon icon-help"></span> {{ _("What's domain?") }}</a>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="section__body no-padding">
|
|
17
|
+
<table class="data-table">
|
|
18
|
+
<colgroup>
|
|
19
|
+
<col class="col--icon">
|
|
20
|
+
<col class="col--name">
|
|
21
|
+
<col class="col--role">
|
|
22
|
+
<col class="col--action">
|
|
23
|
+
</colgroup>
|
|
24
|
+
<thead>
|
|
25
|
+
<tr>
|
|
26
|
+
<th class="col--icon"> </th>
|
|
27
|
+
<th class="col--name">{{ _('Name') }} ({{ _('ID') }})</th>
|
|
28
|
+
<th class="col--role">{{ _('My Role') }}</th>
|
|
29
|
+
<th class="col--action">{{ _('Action') }}</th>
|
|
30
|
+
</tr>
|
|
31
|
+
</thead>
|
|
32
|
+
<tbody>
|
|
33
|
+
{%- for ddoc in ddocs -%}
|
|
34
|
+
<tr>
|
|
35
|
+
<td class="col--icon">
|
|
36
|
+
<img src="{{ avatarUrl(ddoc.avatar, 32) }}" width="32" height="32">
|
|
37
|
+
</td>
|
|
38
|
+
{% set _star = handler.user.pinnedDomains.includes(ddoc._id) %}
|
|
39
|
+
<td class="col--name" data-star-action="?id={{ ddoc['_id'] }}" data-star="{{ _star }}">
|
|
40
|
+
{{ ddoc['name'] }} ({{ ddoc['_id'] }})
|
|
41
|
+
</td>
|
|
42
|
+
<td class="col--role">
|
|
43
|
+
{{ role[ddoc._id]|default('default') }}
|
|
44
|
+
</td>
|
|
45
|
+
<td class="col--action">
|
|
46
|
+
<a class="typo-a" href="{{ url('homepage', domainId=ddoc['_id']) }}">{{ _('Visit') }}</a>
|
|
47
|
+
{% if canManage[ddoc['_id']] %}
|
|
48
|
+
· <a class="typo-a" href="{{ url('domain_dashboard', domainId=ddoc['_id']) }}">{{ _('Manage') }}</a>
|
|
49
|
+
{% endif %}
|
|
50
|
+
{% if ddoc['_id'] != 'system' and ddoc['owner'] != handler.user._id %}
|
|
51
|
+
· <form class="form--inline" method="post">
|
|
52
|
+
<input type="hidden" name="operation" value="leave">
|
|
53
|
+
<input type="hidden" name="id" value="{{ ddoc['_id'] }}">
|
|
54
|
+
<button class="typo-a" type="submit">{{ _('Leave') }}</button>
|
|
55
|
+
</form>
|
|
56
|
+
{% endif %}
|
|
57
|
+
</td>
|
|
58
|
+
</tr>
|
|
59
|
+
{%- endfor -%}
|
|
60
|
+
</tbody>
|
|
61
|
+
</table>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
{% endblock %}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{% extends "layout/home_base.html" %}
|
|
2
|
+
{% block home_content %}
|
|
3
|
+
<div class="section">
|
|
4
|
+
<div class="section__header">
|
|
5
|
+
<h1 class="section__title">{{ _('Files') }}</h1>
|
|
6
|
+
<div class="section__tools">
|
|
7
|
+
<button class="primary rounded button" name="upload_file">{{ _('Upload File') }}</button>
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
{{ noscript_note.render() }}
|
|
11
|
+
{% include "partials/files.html" %}
|
|
12
|
+
<div class="section__body">
|
|
13
|
+
<button class="rounded button" name="remove_selected">{{ _('Remove Selected') }}</button>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
{% endblock %}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
{% extends "layout/home_base.html" %}
|
|
2
|
+
{% block home_content %}
|
|
3
|
+
<div data-heading-extract-to="#menu-item-home_security">
|
|
4
|
+
<div class="row">
|
|
5
|
+
{% if handler.user.mail.endsWith('.local') %}
|
|
6
|
+
<div class="medium-12 columns">
|
|
7
|
+
<div class="section">
|
|
8
|
+
<div class="section__body">
|
|
9
|
+
<blockquote class="warn">{{ _("You haven't set an email.")}}</blockquote>
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
{% endif %}
|
|
14
|
+
<div class="medium-6 columns">
|
|
15
|
+
<div class="section">
|
|
16
|
+
<div class="section__header">
|
|
17
|
+
<h1 class="section__title" id="password" data-heading>{{ _('Change Password') }}</h1>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="section__body">
|
|
20
|
+
<form method="post">
|
|
21
|
+
{{ form.form_text({
|
|
22
|
+
type:'password',
|
|
23
|
+
label:"SuperUser's Password" if sudoUid else 'Current Password',
|
|
24
|
+
columns:10,
|
|
25
|
+
name:'current',
|
|
26
|
+
required:true
|
|
27
|
+
}) }}
|
|
28
|
+
{{ form.form_text({
|
|
29
|
+
type:'password',
|
|
30
|
+
label:'New Password',
|
|
31
|
+
columns:10,
|
|
32
|
+
name:'password',
|
|
33
|
+
required:true
|
|
34
|
+
}) }}
|
|
35
|
+
{{ form.form_text({
|
|
36
|
+
type:'password',
|
|
37
|
+
label:'Repeat Password',
|
|
38
|
+
columns:10,
|
|
39
|
+
name:'verifyPassword',
|
|
40
|
+
required:true
|
|
41
|
+
}) }}
|
|
42
|
+
<div class="row"><div class="columns">
|
|
43
|
+
<input type="hidden" name="operation" value="change_password">
|
|
44
|
+
<input type="submit" class="rounded primary button" value="{{ _('Change Password') }}">
|
|
45
|
+
</div></div>
|
|
46
|
+
</form>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
<div class="medium-6 columns">
|
|
51
|
+
<div class="section">
|
|
52
|
+
<div class="section__header">
|
|
53
|
+
<h1 class="section__title" id="linked-accounts" data-heading>{{ _('Linked Accounts') }}</h1>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="section__body">
|
|
56
|
+
<ul class="platform-list">
|
|
57
|
+
<li class="platform-list__item">
|
|
58
|
+
<div class="media">
|
|
59
|
+
<div class="media__left medium">
|
|
60
|
+
<span class="autherlist__icon icon icon-mail"></span>
|
|
61
|
+
</div>
|
|
62
|
+
<div class="media__body medium typo">
|
|
63
|
+
<p>{{ _('Email Account') }}: {{ handler.user.mail }}</p>
|
|
64
|
+
</div>
|
|
65
|
+
<div class="media__right medium">
|
|
66
|
+
<button type="button" class="rounded button" data-operation="change_mail">{{ _('Change') }}</button>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</li>
|
|
70
|
+
<form method="post">
|
|
71
|
+
<input type="hidden" name="operation" value="unlink_account">
|
|
72
|
+
{%- for relation in relations -%}{% if relation.platform != 'mail' %}
|
|
73
|
+
{% set platform = loginMethods.find(eval("r => r.id === '" + relation.platform + "'")) %}
|
|
74
|
+
<li class="platform-list__item">
|
|
75
|
+
<div class="media">
|
|
76
|
+
{% if platform.icon %}
|
|
77
|
+
<div class="media__left medium">{{ platform.icon|safe }}</div>
|
|
78
|
+
{% endif %}
|
|
79
|
+
<div class="media__body medium typo">
|
|
80
|
+
<p>{{ platform.name }}: {{ relation.id }}</p>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="media__right medium">
|
|
83
|
+
<button type="submit" name="platform" value="{{ relation.platform }}" class="rounded button">{{ _('Unlink') }}</button>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
</li>
|
|
87
|
+
{%- endif -%}{%- endfor -%}
|
|
88
|
+
</form>
|
|
89
|
+
<form method="post">
|
|
90
|
+
<input type="hidden" name="operation" value="link_account">
|
|
91
|
+
{%- for method in loginMethods -%}
|
|
92
|
+
{%- if not relations.some(eval("r => r.platform === '" + method.id + "'")) -%}
|
|
93
|
+
<li class="platform-list__item">
|
|
94
|
+
<div class="media">
|
|
95
|
+
{% if method.icon %}
|
|
96
|
+
<div class="media__left medium">{{ method.icon|safe }}</div>
|
|
97
|
+
{% endif %}
|
|
98
|
+
<div class="media__body">
|
|
99
|
+
<p>{{ method.name }}</p>
|
|
100
|
+
</div>
|
|
101
|
+
<div class="media__right">
|
|
102
|
+
<button type="submit" name="platform" value="{{ method.id }}" class="rounded button">{{ _('Link') }}</button>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</li>
|
|
106
|
+
{%- endif -%}
|
|
107
|
+
{%- endfor -%}
|
|
108
|
+
</form>
|
|
109
|
+
</ul>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
<div class="row nojs--hide">
|
|
115
|
+
<div class="columns">
|
|
116
|
+
<div class="section">
|
|
117
|
+
<div class="section__header">
|
|
118
|
+
<h1 class="section__title" id="authenticator" data-heading>{{ _('Authenticators') }}</h1>
|
|
119
|
+
<div class="section__tools">
|
|
120
|
+
<button class="primary rounded button" name="auth_enable"><span class="icon icon-wrench"></span> {{ _('Add Authenticator') }}</button>
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
<div class="section__body">
|
|
124
|
+
<ul class="autherlist">
|
|
125
|
+
{%- if handler.user.tfa -%}
|
|
126
|
+
<li class="autherlist__item">
|
|
127
|
+
<div class="media">
|
|
128
|
+
<div class="media__left medium">
|
|
129
|
+
<span class="autherlist__icon icon icon-platform--mobile }}"></span>
|
|
130
|
+
</div>
|
|
131
|
+
<div class="media__body medium typo">
|
|
132
|
+
<p>{{ _('Authenticator') }}: {{ _('Two Factor Authentication') }}</p>
|
|
133
|
+
</div>
|
|
134
|
+
<div class="media__right medium">
|
|
135
|
+
<form method="POST">
|
|
136
|
+
<input type="hidden" name="operation" value="disable_tfa">
|
|
137
|
+
<input type="submit" value="{{ _('Remove') }}" class="rounded button">
|
|
138
|
+
</form>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</li>
|
|
142
|
+
{%- endif -%}
|
|
143
|
+
{%- for authenticator in authenticators -%}
|
|
144
|
+
<li class="autherlist__item">
|
|
145
|
+
<div class="media">
|
|
146
|
+
<div class="media__left medium">
|
|
147
|
+
<span class="autherlist__icon icon icon-{{ 'fingerprint' if authenticator.authenticatorAttachment === 'platform' else 'usb' }}"></span>
|
|
148
|
+
</div>
|
|
149
|
+
<div class="media__body medium typo">
|
|
150
|
+
<p>{{ _('Authenticator') }}: {{ authenticator.name }} ({{ authenticator.credentialID.buffer.toString('base64')|truncate(6, end='') }})</p>
|
|
151
|
+
<p>{{ _('Type') }}: {{ authenticator.credentialDeviceType }}:{{ authenticator.fmt }}</p>
|
|
152
|
+
<p>{{ _('Registered at') }}: {{ datetimeSpan(authenticator.regat)|safe }}</p>
|
|
153
|
+
</div>
|
|
154
|
+
<div class="media__right medium">
|
|
155
|
+
<form method="POST">
|
|
156
|
+
<input type="hidden" name="id" value="{{ authenticator.credentialID.buffer.toString('base64') }}">
|
|
157
|
+
<input type="hidden" name="operation" value="disable_authn">
|
|
158
|
+
<input type="submit" value="{{ _('Remove') }}" class="rounded button">
|
|
159
|
+
</form>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
</li>
|
|
163
|
+
{%- endfor -%}
|
|
164
|
+
</ul>
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
<div class="row">
|
|
170
|
+
<div class="columns">
|
|
171
|
+
<div class="section">
|
|
172
|
+
<div class="section__header">
|
|
173
|
+
<h1 class="section__title" id="session" data-heading>{{ _('Active Sessions') }}</h1>
|
|
174
|
+
</div>
|
|
175
|
+
<div class="section__body">
|
|
176
|
+
<ul class="sessionlist">
|
|
177
|
+
{%- for session in sessions -%}
|
|
178
|
+
<li class="sessionlist__item">
|
|
179
|
+
<div class="media">
|
|
180
|
+
<div class="media__left medium">
|
|
181
|
+
<span class="sessionlist__icon icon icon-platform--{{ platformIcon(session.updateUaInfo.os.name) }}"></span>
|
|
182
|
+
</div>
|
|
183
|
+
<div class="media__body medium typo">
|
|
184
|
+
<p>{{ _('Last Update At') }}: {{ datetimeSpan(session.updateAt)|safe }}</p>
|
|
185
|
+
{% if session.createHost %}
|
|
186
|
+
<p>{{ _('Hostname') }}: {{ session.createHost }}</p>
|
|
187
|
+
{% endif %}
|
|
188
|
+
<p>{{ _('Location') }}: {{ _(session.updateGeoip.display) }} ({{ session.updateIp }})</p>
|
|
189
|
+
<p>{{ _('Operating System') }}: {{ session.updateUaInfo.os.name }} {{ session.updateUaInfo.os.version }}</p>
|
|
190
|
+
<p>{{ _('Browser') }}: {{ session.updateUaInfo.browser.name }} {{ session.updateUaInfo.browser.version }}</p>
|
|
191
|
+
{% if session.isCurrent %}
|
|
192
|
+
<p class="sessionlist__current-session"><span class="icon icon-check"></span> {{ _('This is the current session') }}</p>
|
|
193
|
+
{% endif %}
|
|
194
|
+
</div>
|
|
195
|
+
{% if not session.isCurrent %}
|
|
196
|
+
<div class="media__right medium">
|
|
197
|
+
<form method="post">
|
|
198
|
+
<input type="hidden" name="operation" value="delete_token">
|
|
199
|
+
<input type="hidden" name="tokenDigest" value="{{ session._id }}">
|
|
200
|
+
<input type="submit" value="{{ _('Logout This Session') }}" class="rounded button">
|
|
201
|
+
</form>
|
|
202
|
+
</div>
|
|
203
|
+
{% endif %}
|
|
204
|
+
</div>
|
|
205
|
+
</li>
|
|
206
|
+
{%- endfor -%}
|
|
207
|
+
</ul>
|
|
208
|
+
</div>
|
|
209
|
+
<div class="section__body">
|
|
210
|
+
<form method="post">
|
|
211
|
+
<input type="hidden" name="operation" value="delete_all_tokens">
|
|
212
|
+
<input type="submit" value="{{ _('Logout All Sessions') }}" class="primary rounded button">
|
|
213
|
+
</form>
|
|
214
|
+
{% if geoipProvider %}
|
|
215
|
+
<div class="typo">
|
|
216
|
+
<p><small>IP geo-location data is provided by {{ geoipProvider|safe }}.</small></p>
|
|
217
|
+
</div>
|
|
218
|
+
{% endif %}
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
{% endblock %}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{% extends "layout/home_base.html" %}
|
|
2
|
+
{% block home_content %}
|
|
3
|
+
{% if category == "account" %}
|
|
4
|
+
<div class="section" id="upload_avatar" data-heading-extract-to="#menu-item-home_account" style="nojs--hide">
|
|
5
|
+
<div class="section__header">
|
|
6
|
+
<h1 class="section__title" id="avatar" data-heading>{{ _('Avatar') }}</h1>
|
|
7
|
+
</div>
|
|
8
|
+
<div class="section__body typo">
|
|
9
|
+
<p>{{ _('You can also upload your avatar to Gravatar and it will be automatically updated here.')|safe }}</p>
|
|
10
|
+
</div>
|
|
11
|
+
<div class="section__body">
|
|
12
|
+
<img width="128px" height="128px" src="{{ avatarUrl(current.avatar, 128) }}" alt="{{ current.uname }}">
|
|
13
|
+
<div class="changeAvatar"></div>
|
|
14
|
+
<button class="change-avatar button rounded primary">{{ _('Change avatar') }}</button>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
{% endif %}
|
|
18
|
+
<div class="section" data-heading-extract-to="#menu-item-home_{{ category }}">
|
|
19
|
+
{% include "partials/setting.html" %}
|
|
20
|
+
</div>
|
|
21
|
+
{% endblock %}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{% extends "layout/basic.html" %}
|
|
2
|
+
{% import "components/record.html" as record with context %}
|
|
3
|
+
{% import "components/problem.html" as problem with context %}
|
|
4
|
+
{% block content %}
|
|
5
|
+
{{ set(UiContext, 'tdoc', tdoc) }}
|
|
6
|
+
{{ set(UiContext, 'tsdoc', tsdoc) }}
|
|
7
|
+
<div class="row">
|
|
8
|
+
<div class="medium-9 columns">
|
|
9
|
+
<div class="section">
|
|
10
|
+
<div class="section__header">
|
|
11
|
+
<h1 class="section__title">{{ _('Homework Introduction') }}</h1>
|
|
12
|
+
</div>
|
|
13
|
+
<div class="section__body typo richmedia">
|
|
14
|
+
{{ tdoc['content']|markdown|safe }}
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="section">
|
|
18
|
+
<div class="section__header">
|
|
19
|
+
<h1 class="section__title">{{ _('Problem') }}</h1>
|
|
20
|
+
</div>
|
|
21
|
+
{% if pdict %}
|
|
22
|
+
<div class="section__body no-padding">
|
|
23
|
+
<table class="data-table">
|
|
24
|
+
<colgroup>
|
|
25
|
+
{% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
|
|
26
|
+
<col class="col--status">
|
|
27
|
+
<col class="col--submit-at">
|
|
28
|
+
{% endif %}
|
|
29
|
+
<col class="col--problem">
|
|
30
|
+
</colgroup>
|
|
31
|
+
<thead>
|
|
32
|
+
<tr>
|
|
33
|
+
{% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
|
|
34
|
+
<th class="col--status record-status--border">{{ _('Status') }}</th>
|
|
35
|
+
<th class="col--submit-at">{{ _('Last Submit At') }}</th>
|
|
36
|
+
{% endif %}
|
|
37
|
+
<th class="col--problem">{{ _('Problem') }}</th>
|
|
38
|
+
</tr>
|
|
39
|
+
</thead>
|
|
40
|
+
<tbody>
|
|
41
|
+
{% set isAdmin = handler.user.own(tdoc) or handler.user.hasPerm(perm.PERM_VIEW_HOMEWORK_HIDDEN_SCOREBOARD) %}
|
|
42
|
+
{% set ntdoc = model.contest.isDone(tdoc) or (tsdoc.attend and not model.contest.isNotStarted(tdoc)) %}
|
|
43
|
+
{%- for pid in tdoc.pids -%}
|
|
44
|
+
<tr>
|
|
45
|
+
{% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
|
|
46
|
+
{% if psdict[pid] and psdict[pid].rid %}
|
|
47
|
+
{% set rdoc = rdict[psdict[pid].rid] %}
|
|
48
|
+
{% if model.contest.canShowSelfRecord.call(handler, tdoc) %}
|
|
49
|
+
{{ record.render_status_td(rdoc) }}
|
|
50
|
+
{% else %}
|
|
51
|
+
<td class="col--status record-status--border"><a href="{{ url('record_detail', rid=rdoc._id) }}">{{ _('Submitted') }}</a></td>
|
|
52
|
+
{% endif %}
|
|
53
|
+
<td class="col--submit-at">{{ datetimeSpan(rdoc._id)|safe }}</td>
|
|
54
|
+
{% else %}
|
|
55
|
+
<td class="col--status record-status--border">{{ _('No Submissions') }}</td>
|
|
56
|
+
<td class="col--submit-at">-</td>
|
|
57
|
+
{% endif %}
|
|
58
|
+
{% endif %}
|
|
59
|
+
<td class="col--problem col--problem-name">
|
|
60
|
+
{% if isAdmin and not ntdoc %}
|
|
61
|
+
{{ problem.render_problem_title(pdict[pid], show_invisible_flag=false, show_tags=false) }}
|
|
62
|
+
{% else %}
|
|
63
|
+
{{ problem.render_problem_title(pdict[pid], tdoc=tdoc, show_invisible_flag=false, show_tags=false) }}
|
|
64
|
+
{% endif %}
|
|
65
|
+
</td>
|
|
66
|
+
</tr>
|
|
67
|
+
{%- endfor -%}
|
|
68
|
+
</tbody>
|
|
69
|
+
</table>
|
|
70
|
+
</div>
|
|
71
|
+
{% elif tsdoc.attend %}
|
|
72
|
+
{{ nothing.render('This homework is not open and you cannot view problems.') }}
|
|
73
|
+
{% else %}
|
|
74
|
+
{{ nothing.render('Please claim the assignment to see the problems.') }}
|
|
75
|
+
{% endif %}
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
<div class="medium-3 columns">
|
|
79
|
+
{% include "partials/homework_sidebar.html" %}
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
{% endblock %}
|