@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,149 @@
|
|
|
1
|
+
{% extends "layout/basic.html" %}
|
|
2
|
+
{% import "components/comments_discussion.html" as comments with context %}
|
|
3
|
+
{% block content %}
|
|
4
|
+
<div class="row">
|
|
5
|
+
<div class="medium-9 columns">
|
|
6
|
+
<div class="section">
|
|
7
|
+
<div class="section__body">
|
|
8
|
+
<ul class="supplementary list">
|
|
9
|
+
<li>
|
|
10
|
+
<a class="discussion-node-tag" href="{{ url('discussion_node', type=model.discussion.typeDisplay[vnode.type], name=vnode.id) }}">
|
|
11
|
+
{% if ddoc.parentType == model.document.TYPE_DISCUSSION_NODE %}
|
|
12
|
+
<span class="v-center icon icon-tag"></span>
|
|
13
|
+
{% elif ddoc.parentType == model.document.TYPE_CONTEST %}
|
|
14
|
+
<span class="v-center icon icon-award"></span>
|
|
15
|
+
{% else %}
|
|
16
|
+
<span class="v-center icon icon-flag"></span>
|
|
17
|
+
{% endif %}
|
|
18
|
+
{{ vnode['title'] }}
|
|
19
|
+
</a>
|
|
20
|
+
</li>
|
|
21
|
+
<li><h2>{{ ddoc.title }}</h2></li>
|
|
22
|
+
<li>
|
|
23
|
+
{{ user.render_inline(udict[ddoc.owner]) }}
|
|
24
|
+
@
|
|
25
|
+
{{ datetimeSpan(ddoc._id)|safe }}
|
|
26
|
+
</li>
|
|
27
|
+
</ul>
|
|
28
|
+
<div class="typo topic__content richmedia" data-emoji-enabled data-raw-url="{{ url('discussion_raw', did=ddoc.docId) }}">
|
|
29
|
+
{{ ddoc['content']|markdown|safe }}
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
<ul class="section__footer supplementary dot list">
|
|
33
|
+
{% if handler.user.hasPerm(perm.PERM_EDIT_DISCUSSION) or (handler.user.own(ddoc) and handler.user.hasPerm(perm.PERM_EDIT_DISCUSSION_SELF)) %}
|
|
34
|
+
<li><a href="{{ url('discussion_edit', did=ddoc.docId) }}">
|
|
35
|
+
<span class="icon icon-edit"></span> {{ _('Edit') }}
|
|
36
|
+
</a></li>
|
|
37
|
+
{% endif %}
|
|
38
|
+
{% if ddoc.edited %}
|
|
39
|
+
<li data-discussion-history data-raw-url="{{ url('discussion_raw', did=ddoc.docId) }}">{{ _('Edited') }}</li>
|
|
40
|
+
{% endif %}
|
|
41
|
+
<li>{{ _('{0} views').format(ddoc.views) }}</li>
|
|
42
|
+
{% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
|
|
43
|
+
<li><form class="form--inline" method="post">
|
|
44
|
+
<input type="hidden" name="operation" value="{% if not dsdoc['star'] %}star{% else %}unstar{% endif %}">
|
|
45
|
+
<button class="star{% if dsdoc['star'] %} activated{% endif %}" type="submit">
|
|
46
|
+
<span class="starred--hide"><span class="icon icon-star--outline"></span> {{ _('Star Topic') }}</span>
|
|
47
|
+
<span class="starred--show"><span class="icon icon-star"></span> {{ _('Unstar Topic') }}</span>
|
|
48
|
+
</button>
|
|
49
|
+
</form></li>
|
|
50
|
+
{% endif %}
|
|
51
|
+
{% if handler.user.own(ddoc) or handler.user.hasPerm(perm.PERM_LOCK_DISCUSSION) %}
|
|
52
|
+
<li><form class="form--inline" method="post">
|
|
53
|
+
<input type="hidden" name="operation" value="set_lock">
|
|
54
|
+
{% if not ddoc.lock %}<input type="hidden" name="lock" value="1">{% endif %}
|
|
55
|
+
<button class="star{% if ddoc.lock %} activated{% endif %}" type="submit">
|
|
56
|
+
<span class="starred--hide">{{ _('Lock Topic') }}</span>
|
|
57
|
+
<span class="starred--show">{{ _('Unlock Topic') }}</span>
|
|
58
|
+
</button>
|
|
59
|
+
</form></li>
|
|
60
|
+
{% endif %}
|
|
61
|
+
<li><a href="{{ url('wiki_help', anchor='contact') }}">
|
|
62
|
+
<span class="icon icon-warning"></span> {{ _('Report') }}
|
|
63
|
+
</a></li>
|
|
64
|
+
{% if handler.user.hasPerm(perm.PERM_ADD_REACTION) %}
|
|
65
|
+
<li><a href="javascript:;" data-op="react" data-type="discuss" data-form="{{ {operation: 'reaction', nodeType:'did', id: ddoc._id }|json }}">
|
|
66
|
+
<span class="icon icon-emoji"></span>
|
|
67
|
+
</a></li>
|
|
68
|
+
{% endif %}
|
|
69
|
+
<div class="reactions list" data-type="did" data-did="{{ ddoc._id }}">
|
|
70
|
+
{% for e in Object.entries(ddoc.react or {})|sort(true, false, 1)|selectattr(1) %}
|
|
71
|
+
<div class="reaction{% if reactions[ddoc.docId][e[0]] %} active{% endif %}"><span class="emoji">{{ e[0] }}</span> {{ e[1] }}</div>
|
|
72
|
+
{% endfor %}
|
|
73
|
+
</div>
|
|
74
|
+
</ul>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="section">
|
|
77
|
+
<div class="section__header">
|
|
78
|
+
<h1 class="section__title">{{ _('{0} comments').format(drcount) }}</h1>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="section__body">
|
|
81
|
+
{{ comments.render(
|
|
82
|
+
view = 'discussion',
|
|
83
|
+
docs = drdocs,
|
|
84
|
+
udict = udict,
|
|
85
|
+
comment_ref = 'drid',
|
|
86
|
+
reply_ref = 'drrid',
|
|
87
|
+
comment_post_op = 'reply',
|
|
88
|
+
reply_post_op = 'tail_reply',
|
|
89
|
+
comment_edit_op = 'edit_reply',
|
|
90
|
+
comment_delete_op = 'delete_reply',
|
|
91
|
+
reply_edit_op = 'edit_tail_reply',
|
|
92
|
+
reply_delete_op = 'delete_tail_reply',
|
|
93
|
+
comment_post_perm = perm.PERM_REPLY_DISCUSSION,
|
|
94
|
+
comment_delete_perm = perm.PERM_DELETE_DISCUSSION_REPLY_SELF_DISCUSSION if handler.user.own(ddoc) else perm.PERM_DELETE_DISCUSSION_REPLY,
|
|
95
|
+
comment_edit_self_perm = perm.PERM_EDIT_DISCUSSION_REPLY_SELF,
|
|
96
|
+
comment_delete_self_perm = perm.PERM_DELETE_DISCUSSION_REPLY_SELF,
|
|
97
|
+
reply_post_perm = perm.PERM_REPLY_DISCUSSION,
|
|
98
|
+
reply_delete_perm = perm.PERM_DELETE_DISCUSSION_REPLY,
|
|
99
|
+
reply_edit_self_perm = perm.PERM_EDIT_DISCUSSION_REPLY_SELF,
|
|
100
|
+
reply_delete_self_perm = perm.PERM_DELETE_DISCUSSION_REPLY_SELF,
|
|
101
|
+
reactions = reactions,
|
|
102
|
+
ddoc = ddoc
|
|
103
|
+
) }}
|
|
104
|
+
{{ paginator.render(page, pcount) }}
|
|
105
|
+
{% if drcount == 0 %}
|
|
106
|
+
{{ nothing.render('No comments so far...') }}
|
|
107
|
+
{% endif %}
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
<div class="medium-3 columns">
|
|
112
|
+
{% set udoc = udict[ddoc.owner] %}
|
|
113
|
+
<div class="section side">
|
|
114
|
+
<div class="profile__bg user-profile-bg--1"></div>
|
|
115
|
+
<div class="section__body">
|
|
116
|
+
<div class="media sidebar-user-profile">
|
|
117
|
+
<div class="media__left">
|
|
118
|
+
<img src="{{ avatarUrl(udoc.avatar, 80) }}" width="80" height="80" class="medium user-profile-avatar">
|
|
119
|
+
</div>
|
|
120
|
+
<div class="media__body">
|
|
121
|
+
<p>{{ user.render_inline(udoc, avatar=false, modbadge=false) }}</p>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="section__body">
|
|
126
|
+
<div class="balancer sidebar-user-stat">
|
|
127
|
+
<div class="balancer__body">
|
|
128
|
+
<div class="numbox">
|
|
129
|
+
<div class="numbox__num medium">{{ udoc.nAccept|default(0) }}</div>
|
|
130
|
+
<div class="numbox__text">{{ _('Accepted') }}</div>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
<div class="balancer__body">
|
|
134
|
+
<div class="numbox">
|
|
135
|
+
<div class="numbox__num medium">{{ udoc.nLike|default(0) }}</div>
|
|
136
|
+
<div class="numbox__text">{{ _('Solutions Liked') }}</div>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
{% if vnode.type == model.document.TYPE_PROBLEM %}
|
|
143
|
+
{% set pdoc = vnode %}
|
|
144
|
+
{% set owner_udoc = udict[vnode.owner] %}
|
|
145
|
+
{% include "partials/problem_sidebar.html" %}
|
|
146
|
+
{% endif %}
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
{% endblock %}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
{% include "partials/discussion_edit_form.html" %}
|
|
9
|
+
<div class="row"><div class="columns">
|
|
10
|
+
<button name="operation" value="update" data-default-submit type="submit" class="rounded primary button">
|
|
11
|
+
{{ _('Update') }} (Ctrl+Enter)
|
|
12
|
+
</button>
|
|
13
|
+
{% if handler.user.own(ddoc) or handler.user.hasPerm(perm.PERM_DELETE_DISCUSSION) %}
|
|
14
|
+
<button name="operation" value="delete" type="submit" class="rounded button">
|
|
15
|
+
{{ _('Delete') }}
|
|
16
|
+
</button>
|
|
17
|
+
{% endif %}
|
|
18
|
+
<button type="button" class="rounded button" onclick="window.history.go(-1)">
|
|
19
|
+
{{ _('Cancel') }}
|
|
20
|
+
</button>
|
|
21
|
+
</div></div>
|
|
22
|
+
</form>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="medium-3 columns">
|
|
27
|
+
{% include 'components/md_hint.html' %}
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
{% endblock %}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{% extends "layout/basic.html" %}
|
|
2
|
+
{% block content %}
|
|
3
|
+
<div class="row">
|
|
4
|
+
<div class="medium-9 columns">
|
|
5
|
+
<div class="section">
|
|
6
|
+
{% include "partials/discussion_list.html" %}
|
|
7
|
+
</div>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="medium-3 columns">
|
|
10
|
+
{% if vnode.type == model.document.TYPE_PROBLEM %}
|
|
11
|
+
{% set pdoc = vnode %}
|
|
12
|
+
{% set owner_udoc = udict[vnode.owner] %}
|
|
13
|
+
{% include "partials/problem_sidebar.html" %}
|
|
14
|
+
{% elif vnode.type == model.document.TYPE_CONTEST %}
|
|
15
|
+
{% set tdoc = vnode %}
|
|
16
|
+
{%- if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) -%}
|
|
17
|
+
{% set tsdoc = { attend: tdoc.attend } %}
|
|
18
|
+
{%- endif -%}
|
|
19
|
+
{% set owner_udoc = udict[vnode.owner] %}
|
|
20
|
+
{% include "partials/contest_sidebar.html" %}
|
|
21
|
+
{% else %}
|
|
22
|
+
<div class="section side">
|
|
23
|
+
{% if vnode.pic %}<div class="discussion-node__bg {{ vnode.pic }}"></div>{% endif %}
|
|
24
|
+
<div class="section__header">
|
|
25
|
+
<h1 class="section__title">{{ vnode['title'] or _('Create Discussion') }}</h1>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="section__body">
|
|
28
|
+
{% if vnode._id %}
|
|
29
|
+
{% if handler.user.hasPerm(perm.PERM_CREATE_DISCUSSION) %}
|
|
30
|
+
<p><a href="{{ url('discussion_create', type=model.discussion.typeDisplay[vnode.type], name=vnode.id) }}" class="expanded primary button">{{ _('Create a Discussion') }}</a></p>
|
|
31
|
+
{% else %}
|
|
32
|
+
{% if not handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %}
|
|
33
|
+
<p><a href="javascript:showSignInDialog();" class="expanded primary button">{{ _('Login to Create a Discussion') }}</a></p>
|
|
34
|
+
{% else %}
|
|
35
|
+
<p><a href="javascript:;" class="disabled expanded primary button">{{ _('No Permission to Create a Discussion') }}</a></p>
|
|
36
|
+
{% endif %}
|
|
37
|
+
{% endif %}
|
|
38
|
+
{% else %}
|
|
39
|
+
<p>{{ _('Select a node to create discussion.') }}</p>
|
|
40
|
+
{% endif %}
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
{% endif %}
|
|
44
|
+
{% include 'partials/discussion_nodes_widget.html' %}
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
{% endblock %}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{% extends "layout/basic.html" %}
|
|
2
|
+
{% block content %}
|
|
3
|
+
<div class="row" data-sticky-parent>
|
|
4
|
+
<div class="medium-9 columns">
|
|
5
|
+
{% block domain_content %}{% endblock %}
|
|
6
|
+
</div>
|
|
7
|
+
<div class="medium-3 columns"><div data-sticky="large">
|
|
8
|
+
<div class="section side">
|
|
9
|
+
<ol class="menu">
|
|
10
|
+
{%- for family, items in ui.getNodes('DomainManage')|groupby('args.family') -%}
|
|
11
|
+
<li class="menu__item">
|
|
12
|
+
<div class="menu__link expandable">
|
|
13
|
+
<span class="icon icon-{{ items[0].args.icon }}"></span> {{ _(family) }}
|
|
14
|
+
</div>
|
|
15
|
+
<ol class="menu collapsed">
|
|
16
|
+
{%- for item in items -%}{% if item.checker(handler) %}
|
|
17
|
+
{{ sidemenu.render_item(null, item.name) }}
|
|
18
|
+
{% endif %}{%- endfor -%}
|
|
19
|
+
</ol>
|
|
20
|
+
</li>
|
|
21
|
+
{% endfor %}
|
|
22
|
+
</ol>
|
|
23
|
+
</div>
|
|
24
|
+
</div></div>
|
|
25
|
+
</div>
|
|
26
|
+
{% endblock %}
|
|
@@ -0,0 +1,55 @@
|
|
|
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__header">
|
|
7
|
+
<h1 class="section__title" id="create" data-heading>{{ _('Create Domain') }}</h1>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="section__body">
|
|
10
|
+
<blockquote class="note typo">
|
|
11
|
+
<p>{{ _('A domain ID cannot be changed after creation. It is supposed to be:') }}</p>
|
|
12
|
+
<ul>
|
|
13
|
+
<li>{{ _('Unique') }}</li>
|
|
14
|
+
<li>{{ _('At least 4 characters') }}</li>
|
|
15
|
+
<li>{{ _('Not wrapped with space') }}</li>
|
|
16
|
+
<li>{{ _('Not started with a number') }}</li>
|
|
17
|
+
<li>{{ _('Only A-Z, a-z, 0-9 and _ are accepted') }}</li>
|
|
18
|
+
</ul>
|
|
19
|
+
</blockquote>
|
|
20
|
+
<form method="post">
|
|
21
|
+
{{ form.form_text({
|
|
22
|
+
label:'ID',
|
|
23
|
+
name:'id',
|
|
24
|
+
autofocus:true,
|
|
25
|
+
required:true
|
|
26
|
+
}) }}
|
|
27
|
+
{{ form.form_text({
|
|
28
|
+
label:'Name',
|
|
29
|
+
name:'name',
|
|
30
|
+
required:true
|
|
31
|
+
}) }}
|
|
32
|
+
{{ form.form_textarea({
|
|
33
|
+
label:'Bulletin',
|
|
34
|
+
name:'bulletin',
|
|
35
|
+
markdown:true,
|
|
36
|
+
required:true
|
|
37
|
+
}) }}
|
|
38
|
+
{{ form.form_text({
|
|
39
|
+
label:'Avatar',
|
|
40
|
+
name:'avatar'
|
|
41
|
+
}) }}
|
|
42
|
+
<div class="row"><div class="columns">
|
|
43
|
+
<button type="submit" class="rounded primary button">
|
|
44
|
+
{{ _('Create') }}
|
|
45
|
+
</button>
|
|
46
|
+
<button type="button" class="rounded button" onclick="window.history.go(-1)">
|
|
47
|
+
{{ _('Cancel') }}
|
|
48
|
+
</button>
|
|
49
|
+
</div></div>
|
|
50
|
+
</form>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
{% endblock %}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{% import "components/user.html" as user %}
|
|
2
|
+
{% extends "domain_base.html" %}
|
|
3
|
+
{% block domain_content %}
|
|
4
|
+
{% if domain.bulletin %}
|
|
5
|
+
<div class="section">
|
|
6
|
+
<div class="section__body typo richmedia">
|
|
7
|
+
{{ domain.bulletin|markdown|safe }}
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
{% endif %}
|
|
11
|
+
<div class="section">
|
|
12
|
+
<div class="section__header">
|
|
13
|
+
<h1 class="section__title" data-heading>{{ _('Information') }}</h1>
|
|
14
|
+
<div class="section__tools">
|
|
15
|
+
<form method="post">
|
|
16
|
+
<input type="hidden" name="operation" value="init_discussion_node">
|
|
17
|
+
<button type="submit" class="primary rounded button"><span class="icon icon-wrench"></span> {{ _('Init Discussion Nodes') }}</button>
|
|
18
|
+
</form>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="section__body typo">
|
|
22
|
+
<dl class="large horizontal">
|
|
23
|
+
<dt>{{ _('Avatar') }}</dt><dd><img src="{{ avatarUrl(domain.avatar) }}" width="32" height="32"></dd>
|
|
24
|
+
<dt>{{ _('Name') }}</dt><dd>{{ domain.name }}</dd>
|
|
25
|
+
<dt>{{ _('Owner') }}</dt><dd>{{ user.render_inline(owner) }}</dd>
|
|
26
|
+
</dl>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
{% if handler.user._id == owner._id %}
|
|
30
|
+
<div class="section">
|
|
31
|
+
<div class="section__header">
|
|
32
|
+
<h1 class="section__title" data-heading>{{ _('Delete Domain') }}</h1>
|
|
33
|
+
<div class="section__tools">
|
|
34
|
+
<form method="POST" id="delete-domain-form">
|
|
35
|
+
<div>
|
|
36
|
+
<input type="hidden" name="operation" value="delete">
|
|
37
|
+
<input type="submit" value="{{ _('Delete Domain') }}" class="rounded primary button">
|
|
38
|
+
</div>
|
|
39
|
+
</form>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="section__body"></div>
|
|
43
|
+
</div>
|
|
44
|
+
{% endif %}
|
|
45
|
+
{% endblock %}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{% extends "domain_base.html" %}
|
|
2
|
+
{% block domain_content %}
|
|
3
|
+
<div class="section">
|
|
4
|
+
<div class="section__header">
|
|
5
|
+
<h1 class="section__title">{{ _('{0}: Groups').format(domain.name) }}</h1>
|
|
6
|
+
<div class="section__tools">
|
|
7
|
+
<button class="rounded button" name="import_groups">{{ _('Import Groups') }}</button>
|
|
8
|
+
<button class="rounded button" name="export_groups">{{ _('Export Groups') }}</button>
|
|
9
|
+
<button class="primary rounded button" name="create_group">{{ _('Create Group') }}</button>
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
{{ noscript_note.render() }}
|
|
13
|
+
<div class="section__body no-padding domain-group">
|
|
14
|
+
<table class="data-table">
|
|
15
|
+
<colgroup>
|
|
16
|
+
<col class="col--checkbox">
|
|
17
|
+
<col class="col--group">
|
|
18
|
+
<col class="col--user">
|
|
19
|
+
</colgroup>
|
|
20
|
+
<thead>
|
|
21
|
+
<tr>
|
|
22
|
+
<th class="col--checkbox">
|
|
23
|
+
<label class="compact checkbox">
|
|
24
|
+
<input type="checkbox" name="select_all" data-checkbox-toggle="group">
|
|
25
|
+
</label>
|
|
26
|
+
</th>
|
|
27
|
+
<th class="col--group">{{ _('Group Name') }}</th>
|
|
28
|
+
<th class="col--user">{{ _('Users') }}</th>
|
|
29
|
+
</tr>
|
|
30
|
+
</thead>
|
|
31
|
+
<tbody>
|
|
32
|
+
{%- for gdoc in groups -%}
|
|
33
|
+
<tr data-gid="{{ gdoc.name }}">
|
|
34
|
+
<td class="col--checkbox">
|
|
35
|
+
<label class="compact checkbox">
|
|
36
|
+
<input type="checkbox" data-checkbox-group="group" data-checkbox-range>
|
|
37
|
+
</label>
|
|
38
|
+
</td>
|
|
39
|
+
<td class="col--group">{{ gdoc.name }}<br><small class="supplementary group-member-count">{{ gdoc.uids.length }} {{ _('members') }}</small></td>
|
|
40
|
+
<td class="col--user"><input type="text" value="{{ gdoc.uids.join(',') }}" data-gid="{{ gdoc.name }}"></input></td>
|
|
41
|
+
</tr>
|
|
42
|
+
{%- endfor -%}
|
|
43
|
+
</tbody>
|
|
44
|
+
</table>
|
|
45
|
+
</div>
|
|
46
|
+
<div class="section__body">
|
|
47
|
+
<button class="rounded button" name="remove_selected">{{ _('Remove Selected Group') }}</button>
|
|
48
|
+
<button class="rounded button" name="save_all">{{ _('Save All Changes') }}</button>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
{% endblock %}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{% extends "layout/basic.html" %}
|
|
2
|
+
{% block content %}
|
|
3
|
+
<div class="domain_join__container">
|
|
4
|
+
<div class="row columns">
|
|
5
|
+
<div class="section">
|
|
6
|
+
<div class="section__header">
|
|
7
|
+
<h1 class="section__title">
|
|
8
|
+
{% if joinSettings %}
|
|
9
|
+
{{ _('Join {0}').format(domainInfo['name']) }}
|
|
10
|
+
{% else %}
|
|
11
|
+
{{ _('You are invited to join {0}').format(domainInfo['name']) }}
|
|
12
|
+
{% endif %}
|
|
13
|
+
</h1>
|
|
14
|
+
</div>
|
|
15
|
+
<div class="section__body typo">
|
|
16
|
+
<p>{{ _('By clicking the button, you will become a member of the domain {0}.').format(domainInfo['name']) }}</p>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="section__body typo">
|
|
19
|
+
<p>{{ _('The domain owner:') }} {{ user.render_inline(domainInfo['owner']) }}</p>
|
|
20
|
+
</div>
|
|
21
|
+
{% if domainInfo['bulletin'] %}
|
|
22
|
+
<div class="section__body typo">
|
|
23
|
+
{{ domainInfo['bulletin']|markdown }}
|
|
24
|
+
</div>
|
|
25
|
+
{% endif %}
|
|
26
|
+
<div class="section__body typo">
|
|
27
|
+
<form method="post">
|
|
28
|
+
{% if joinSettings['method'] == model.domain.JOIN_METHOD_CODE %}
|
|
29
|
+
{{ form.form_text({
|
|
30
|
+
columns:None,
|
|
31
|
+
label:'Invitation Code',
|
|
32
|
+
name:'code',
|
|
33
|
+
required:true,
|
|
34
|
+
help_text:'You need to enter the invitation code to join the domain.',
|
|
35
|
+
value:code,
|
|
36
|
+
autofocus:true
|
|
37
|
+
}) }}
|
|
38
|
+
{% endif %}
|
|
39
|
+
<input type="hidden" name="target" value="{{ target }}">
|
|
40
|
+
<input type="hidden" name="redirect" value="{{ redirect }}">
|
|
41
|
+
<button type="submit" class="primary rounded button">{{ _('Join') }}</button>
|
|
42
|
+
</form>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
{% endblock %}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{% extends "domain_base.html" %}
|
|
2
|
+
{% block domain_content %}
|
|
3
|
+
{% if joinSettings %}
|
|
4
|
+
<div class="section">
|
|
5
|
+
<div class="section__header">
|
|
6
|
+
<h1 class="section__title">{{ _('Information') }}</h1>
|
|
7
|
+
</div>
|
|
8
|
+
<div class="section__body typo">
|
|
9
|
+
<p>{{ _('User can join this domain by visiting the following URL') }}:</p>
|
|
10
|
+
<pre><code class="language-data">{{ url_prefix|safe }}d/{{ handler.args.domainId }}/domain/join</code></pre>
|
|
11
|
+
{% if joinSettings['method'] == model.domain.JOIN_METHOD_CODE %}
|
|
12
|
+
<p>{{ _('Or, with automatically filled invitation code') }}:</p>
|
|
13
|
+
<pre><code class="language-data">{{ url_prefix|safe }}d/{{ handler.args.domainId }}/domain/join?code={{ joinSettings.code|urlencode }}</code></pre>
|
|
14
|
+
{% endif %}
|
|
15
|
+
{% if joinSettings.expire %}
|
|
16
|
+
<br/>
|
|
17
|
+
<blockquote class="note">
|
|
18
|
+
{{ (_('The link will be expired at {0}').format(datetimeSpan(joinSettings.expire, relative=false)))|safe }}
|
|
19
|
+
</blockquote>
|
|
20
|
+
{% endif %}
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
{% endif %}
|
|
24
|
+
<div class="section">
|
|
25
|
+
<div class="section__header">
|
|
26
|
+
<h1 class="section__title">{{ _('Settings') }}</h1>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="section__body">
|
|
29
|
+
<form method="POST">
|
|
30
|
+
{{ form.form_select({
|
|
31
|
+
options:model.domain.JOIN_METHOD_RANGE,
|
|
32
|
+
label:'Method',
|
|
33
|
+
name:'method',
|
|
34
|
+
value:joinSettings['method']|default(model.domain.JOIN_METHOD_NONE)
|
|
35
|
+
}) }}
|
|
36
|
+
{{ form.form_select({
|
|
37
|
+
options:rolesWithText,
|
|
38
|
+
label:'Role Assignment',
|
|
39
|
+
name:'role',
|
|
40
|
+
help_text:'The role to assign when user joining the domain.',
|
|
41
|
+
value:joinSettings['role']|default('')
|
|
42
|
+
}) }}
|
|
43
|
+
{{ form.form_text({
|
|
44
|
+
label:'Group Assignment (Optional)',
|
|
45
|
+
name:'group',
|
|
46
|
+
help_text:'The group to join when user joining the domain.',
|
|
47
|
+
value:joinSettings['group']|default('')
|
|
48
|
+
}) }}
|
|
49
|
+
{{ form.form_select({
|
|
50
|
+
options:expirations,
|
|
51
|
+
label:'Expire',
|
|
52
|
+
name:'expire',
|
|
53
|
+
help_text:'User will no longer be allowed to join the domain after expiration.'
|
|
54
|
+
}) }}
|
|
55
|
+
{{ form.form_text({
|
|
56
|
+
label:'Invitation Code',
|
|
57
|
+
name:'invitationCode',
|
|
58
|
+
help_text:'The invitation code to enter to successfully join the domain. You can only use letters and numbers in the code and it should not be longer than 64 characters.',
|
|
59
|
+
value:joinSettings['code']|default('')
|
|
60
|
+
}) }}
|
|
61
|
+
<button class="rounded primary button" role="submit">
|
|
62
|
+
{{ _('Update Settings') }}
|
|
63
|
+
</button>
|
|
64
|
+
</form>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
{% endblock %}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{% extends "domain_base.html" %}
|
|
2
|
+
{% block domain_content %}
|
|
3
|
+
<form method="post">
|
|
4
|
+
<div class="section">
|
|
5
|
+
<div class="section__header">
|
|
6
|
+
<h1 class="section__title">{{ _('{0}: Permissions').format(domain.name) }}</h1>
|
|
7
|
+
</div>
|
|
8
|
+
<div class="section__body no-padding domain-users">
|
|
9
|
+
<table class="data-table">
|
|
10
|
+
<colgroup>
|
|
11
|
+
<col class="col--description">
|
|
12
|
+
{%- for role in roles -%}
|
|
13
|
+
<col class="col--p">
|
|
14
|
+
{%- endfor -%}
|
|
15
|
+
</colgroup>
|
|
16
|
+
<thead>
|
|
17
|
+
<tr>
|
|
18
|
+
<th class="col--description">{{ _('Permissions') }}</th>
|
|
19
|
+
{%- for role in roles -%}
|
|
20
|
+
<th class="col--p"><span data-tooltip="{{ role._id }}">{{ role._id }}</span></th>
|
|
21
|
+
{%- endfor -%}
|
|
22
|
+
</tr>
|
|
23
|
+
</thead>
|
|
24
|
+
{%- for family, perms in PERMS_BY_FAMILY -%}
|
|
25
|
+
<tbody>
|
|
26
|
+
<tr><td class="col--family" colspan="{{ (roles|length)+1 }}">{{ _(family) }}</td></tr>
|
|
27
|
+
{%- for perm in perms -%}
|
|
28
|
+
<tr>
|
|
29
|
+
<td class="col--description">{{ _(perm.desc) }}</td>
|
|
30
|
+
{%- for role in roles -%}
|
|
31
|
+
<td class="col--p">
|
|
32
|
+
<label class="compact checkbox">
|
|
33
|
+
<input name="{{ role._id }}" data-checkbox-group="{{ role._id }}" data-checkbox-range value="{{ log2(perm.key) }}" type="checkbox"{% if role.perm|bitand(perm.key) %} checked{% endif %}{% if role._id == 'root' %} disabled{% endif %}>
|
|
34
|
+
</label>
|
|
35
|
+
</td>
|
|
36
|
+
{%- endfor -%}
|
|
37
|
+
</tr>
|
|
38
|
+
{%- endfor -%}
|
|
39
|
+
</tbody>
|
|
40
|
+
{%- endfor -%}
|
|
41
|
+
<tbody style="display:none">
|
|
42
|
+
<tr><td class="col--family" colspan="{{ (roles|length)+1 }}">placeholder</td></tr>
|
|
43
|
+
<tr>
|
|
44
|
+
<td class="col--description">placeholder</td>
|
|
45
|
+
{%- for role in roles -%}
|
|
46
|
+
<td class="col--p">
|
|
47
|
+
<label class="compact checkbox">
|
|
48
|
+
<input name="{{ role._id }}" data-checkbox-group="{{ role._id }}" data-checkbox-range value="1000" type="checkbox" checked{% if role._id == 'root' %} disabled{% endif %}>
|
|
49
|
+
</label>
|
|
50
|
+
</td>
|
|
51
|
+
{%- endfor -%}
|
|
52
|
+
</tr>
|
|
53
|
+
</tbody>
|
|
54
|
+
</table>
|
|
55
|
+
</div>
|
|
56
|
+
<div class="section__body">
|
|
57
|
+
<button class="rounded primary button" role="submit">
|
|
58
|
+
{{ _('Update Permission') }}
|
|
59
|
+
</button>
|
|
60
|
+
<button type="button" class="rounded button" onclick="window.history.go(-1)">
|
|
61
|
+
{{ _('Cancel') }}
|
|
62
|
+
</button>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</form>
|
|
66
|
+
{% endblock %}
|