From 9c45527522b5eefb301ca1f7d9ab6a255749c622 Mon Sep 17 00:00:00 2001 From: masnn Date: Wed, 8 Apr 2020 21:10:24 +0800 Subject: [PATCH] add ui --- ui/.eslintrc.js | 94 ++ ui/Entry.js | 93 ++ ui/README.md | 415 +++++++ ui/breakpoints.json | 5 + ui/common/color.inc.styl | 17 + ui/common/common.inc.styl | 12 + ui/common/easing.inc.styl | 39 + ui/common/functions.inc.styl | 9 + ui/common/rem.inc.styl | 7 + ui/common/variables.inc.styl | 261 ++++ ui/components/DOMAttachedObject.js | 131 +++ .../autocomplete/DomainSelectAutoComplete.js | 43 + .../autocomplete/UserSelectAutoComplete.js | 43 + .../autocomplete/autocomplete.page.styl | 11 + .../domainselectautocomplete.page.styl | 6 + ui/components/autocomplete/index.js | 202 ++++ .../userselectautocomplete.page.styl | 6 + ui/components/calendar/calendar.page.styl | 129 ++ ui/components/calendar/index.js | 367 ++++++ ui/components/cmeditor/cmeditor.page.js | 23 + ui/components/cmeditor/cmeditor.styl | 91 ++ ui/components/cmeditor/index.js | 66 ++ ui/components/cmeditor/textareaHandler.js | 32 + ui/components/cmeditor/vjcmeditor.js | 129 ++ ui/components/contest/contest.page.styl | 34 + .../contest/contest_sidebar.page.styl | 21 + ui/components/contest/problem-contest-bg.png | Bin 0 -> 4170 bytes .../contest/problem-contest-bg@2x.png | Bin 0 -> 8618 bytes ui/components/datepicker/datepicker.page.js | 26 + ui/components/datepicker/datepicker.styl | 54 + ui/components/dialog/DomDialog.js | 145 +++ ui/components/dialog/dialog.page.styl | 38 + ui/components/dialog/index.js | 94 ++ ui/components/discussion/CommentBox.js | 113 ++ ui/components/discussion/comments.page.js | 206 ++++ ui/components/discussion/comments.page.styl | 125 ++ ui/components/discussion/discussion.page.styl | 17 + ui/components/drop/drop.page.styl | 40 + ui/components/dropdown/Dropdown.js | 55 + ui/components/dropdown/dropdown.page.js | 8 + ui/components/dropdown/dropdown.page.styl | 24 + ui/components/emoji/emoji.page.styl | 6 + ui/components/emoji/emojify.page.js | 21 + ui/components/footer/footer.page.js | 31 + ui/components/footer/footer.page.styl | 94 ++ ui/components/form/button.page.styl | 82 ++ ui/components/form/checkbox.page.styl | 90 ++ ui/components/form/form.page.js | 15 + ui/components/form/form.page.styl | 199 ++++ .../form/multiSelectCheckbox.page.js | 45 + ui/components/form/radiobox.page.styl | 62 + ui/components/form/select.page.styl | 29 + ui/components/form/textbox.page.js | 20 + ui/components/form/textbox.page.styl | 72 ++ ui/components/form/var.inc.styl | 14 + ui/components/header/header-background.png | Bin 0 -> 78873 bytes ui/components/header/header-background@2x.png | Bin 0 -> 158777 bytes ui/components/header/header-logo-summer.png | Bin 0 -> 9976 bytes .../header/header-logo-summer@2x.png | Bin 0 -> 22451 bytes ui/components/header/header-logo.png | Bin 0 -> 6583 bytes ui/components/header/header-logo@2x.png | Bin 0 -> 13580 bytes ui/components/header/header.page.styl | 171 +++ .../highlighter/codemirror.page.styl | 12 + ui/components/highlighter/highlighter.page.js | 14 + .../highlighter/highlighter.page.styl | 122 ++ ui/components/highlighter/meta.js | 15 + ui/components/highlighter/prismjs.js | 72 ++ ui/components/homework/homework.page.styl | 4 + ui/components/hotkey/hotkey.page.js | 80 ++ ui/components/katex/katex.page.js | 16 + ui/components/katex/katex.styl | 2 + ui/components/loader/loader.page.styl | 29 + ui/components/marker/Marker.js | 193 +++ ui/components/marker/MarkerReactive.js | 58 + ui/components/marker/marker.page.js | 8 + ui/components/marker/marker.page.styl | 54 + ui/components/menu/menu-heading.page.js | 30 + ui/components/menu/menu.page.js | 18 + ui/components/menu/menu.page.styl | 65 + .../messagepad/DialogueListItem.page.styl | 28 + .../messagepad/DialogueListItemComponent.js | 39 + ui/components/messagepad/Message.page.styl | 64 + ui/components/messagepad/MessageComponent.js | 33 + ui/components/messagepad/MessagePad.page.styl | 89 ++ .../MessagePadDialogueContentContainer.js | 81 ++ .../MessagePadDialogueListContainer.js | 63 + .../messagepad/MessagePadInputContainer.js | 135 +++ ui/components/messagepad/index.js | 52 + ui/components/messagepad/reducers/activeId.js | 34 + .../messagepad/reducers/dialogues.js | 83 ++ ui/components/messagepad/reducers/index.js | 14 + ui/components/messagepad/reducers/inputs.js | 51 + .../messagepad/reducers/isPosting.js | 75 ++ ui/components/navigation/hamburgers.page.styl | 87 ++ ui/components/navigation/index.js | 97 ++ .../navigation/nav-logo-small@2x_dark.png | Bin 0 -> 817 bytes .../navigation/nav-logo-small@2x_light.png | Bin 0 -> 817 bytes .../navigation/nav-logo-small_dark.png | Bin 0 -> 471 bytes .../navigation/nav-logo-small_light.png | Bin 0 -> 471 bytes ui/components/navigation/navigation.page.js | 69 ++ ui/components/navigation/navigation.page.styl | 232 ++++ ui/components/notification/index.js | 50 + .../notification/notification.page.styl | 46 + ui/components/nprogress/index.js | 3 + ui/components/nprogress/nprogress.page.styl | 69 ++ ui/components/pager/pager.page.styl | 46 + ui/components/problem/rp.page.styl | 4 + ui/components/problem/tag.page.styl | 37 + ui/components/profile/backgrounds/1.jpg | Bin 0 -> 77743 bytes ui/components/profile/backgrounds/10.jpg | Bin 0 -> 69249 bytes ui/components/profile/backgrounds/11.jpg | Bin 0 -> 86037 bytes ui/components/profile/backgrounds/12.jpg | Bin 0 -> 79606 bytes ui/components/profile/backgrounds/13.jpg | Bin 0 -> 75651 bytes ui/components/profile/backgrounds/14.jpg | Bin 0 -> 65552 bytes ui/components/profile/backgrounds/15.jpg | Bin 0 -> 79118 bytes ui/components/profile/backgrounds/16.jpg | Bin 0 -> 82904 bytes ui/components/profile/backgrounds/17.jpg | Bin 0 -> 61853 bytes ui/components/profile/backgrounds/18.jpg | Bin 0 -> 85164 bytes ui/components/profile/backgrounds/19.jpg | Bin 0 -> 86243 bytes ui/components/profile/backgrounds/2.jpg | Bin 0 -> 95312 bytes ui/components/profile/backgrounds/20.jpg | Bin 0 -> 83132 bytes ui/components/profile/backgrounds/21.jpg | Bin 0 -> 108968 bytes ui/components/profile/backgrounds/3.jpg | Bin 0 -> 101131 bytes ui/components/profile/backgrounds/4.jpg | Bin 0 -> 84126 bytes ui/components/profile/backgrounds/5.jpg | Bin 0 -> 85528 bytes ui/components/profile/backgrounds/6.jpg | Bin 0 -> 89936 bytes ui/components/profile/backgrounds/7.jpg | Bin 0 -> 58229 bytes ui/components/profile/backgrounds/8.jpg | Bin 0 -> 86657 bytes ui/components/profile/backgrounds/9.jpg | Bin 0 -> 81928 bytes .../profile/backgrounds/gen_thumbnails.sh | 5 + .../profile/backgrounds/thumbnail/1.jpg | Bin 0 -> 2360 bytes .../profile/backgrounds/thumbnail/10.jpg | Bin 0 -> 2514 bytes .../profile/backgrounds/thumbnail/11.jpg | Bin 0 -> 2866 bytes .../profile/backgrounds/thumbnail/12.jpg | Bin 0 -> 2452 bytes .../profile/backgrounds/thumbnail/13.jpg | Bin 0 -> 2523 bytes .../profile/backgrounds/thumbnail/14.jpg | Bin 0 -> 2426 bytes .../profile/backgrounds/thumbnail/15.jpg | Bin 0 -> 2809 bytes .../profile/backgrounds/thumbnail/16.jpg | Bin 0 -> 2419 bytes .../profile/backgrounds/thumbnail/17.jpg | Bin 0 -> 1947 bytes .../profile/backgrounds/thumbnail/18.jpg | Bin 0 -> 2569 bytes .../profile/backgrounds/thumbnail/19.jpg | Bin 0 -> 2741 bytes .../profile/backgrounds/thumbnail/2.jpg | Bin 0 -> 2746 bytes .../profile/backgrounds/thumbnail/20.jpg | Bin 0 -> 2608 bytes .../profile/backgrounds/thumbnail/21.jpg | Bin 0 -> 3429 bytes .../profile/backgrounds/thumbnail/3.jpg | Bin 0 -> 2887 bytes .../profile/backgrounds/thumbnail/4.jpg | Bin 0 -> 2734 bytes .../profile/backgrounds/thumbnail/5.jpg | Bin 0 -> 2880 bytes .../profile/backgrounds/thumbnail/6.jpg | Bin 0 -> 2835 bytes .../profile/backgrounds/thumbnail/7.jpg | Bin 0 -> 1955 bytes .../profile/backgrounds/thumbnail/8.jpg | Bin 0 -> 3066 bytes .../profile/backgrounds/thumbnail/9.jpg | Bin 0 -> 2325 bytes ui/components/profile/profile.page.styl | 23 + .../SplitPaneFillOverlay.page.styl | 9 + .../SplitPaneFillOverlayComponent.js | 19 + .../react-splitpane/splitpane.page.styl | 27 + ui/components/react-tabs/rc-tabs.page.js | 1 + ui/components/react/DomComponent.js | 26 + ui/components/react/IconComponent.js | 19 + ui/components/record/record.page.styl | 26 + ui/components/rotator/index.js | 77 ++ ui/components/rotator/rotator.page.styl | 20 + ui/components/scratchpad/DataInput.page.styl | 17 + .../scratchpad/DataInputComponent.js | 34 + ui/components/scratchpad/Editor.page.styl | 24 + ui/components/scratchpad/Panel.page.styl | 8 + .../scratchpad/PanelButton.page.styl | 15 + .../scratchpad/PanelButtonComponent.js | 19 + ui/components/scratchpad/PanelComponent.js | 26 + ui/components/scratchpad/PanelTab.page.styl | 63 + .../scratchpad/ScratchpadEditorContainer.js | 56 + .../scratchpad/ScratchpadPretestContainer.js | 101 ++ .../ScratchpadPretestTabPaneContainer.js | 49 + .../scratchpad/ScratchpadRecordsContainer.js | 85 ++ .../ScratchpadRecordsRowContainer.js | 92 ++ .../ScratchpadRecordsTableContainer.js | 33 + .../scratchpad/ScratchpadToolbarContainer.js | 148 +++ ui/components/scratchpad/Toolbar.page.styl | 53 + ui/components/scratchpad/ToolbarComponent.js | 90 ++ ui/components/scratchpad/index.js | 98 ++ ui/components/scratchpad/reducers/editor.js | 21 + ui/components/scratchpad/reducers/index.js | 14 + ui/components/scratchpad/reducers/pretest.js | 103 ++ ui/components/scratchpad/reducers/records.js | 36 + ui/components/scratchpad/reducers/ui.js | 102 ++ ui/components/scratchpad/scratchpad.page.styl | 68 ++ ui/components/scratchpad/var.inc.styl | 2 + ui/components/signin/signInDialog.page.js | 45 + ui/components/signin/signin_dialog.page.styl | 54 + .../smoothscroll/smoothscroll.page.js | 51 + ui/components/star/star.page.js | 32 + ui/components/star/star.page.styl | 20 + ui/components/sticky/sticky.page.js | 62 + ui/components/tab/Tab.js | 151 +++ ui/components/tab/tab.page.js | 9 + ui/components/tab/tab.page.styl | 89 ++ ui/components/tab/var.inc.styl | 3 + ui/components/table/StyledTable.js | 47 + ui/components/table/styledTable.page.js | 8 + ui/components/table/table.page.styl | 72 ++ ui/components/time/time.page.js | 40 + ui/components/tooltip/Tooltip.js | 51 + ui/components/tooltip/tooltip.page.js | 30 + ui/components/tooltip/tooltip.page.styl | 69 ++ ui/components/training/training.page.styl | 25 + ui/components/vote/vote.page.js | 38 + ui/constant/contest.js | 42 + ui/constant/domain.js | 25 + ui/constant/language.js | 50 + ui/constant/model.js | 18 + ui/constant/record.js | 98 ++ ui/constant/setting.js | 42 + ui/constant/util/objectMeta.js | 8 + ui/jsconfig.json | 9 + ui/misc/PageLoader.js | 74 ++ ui/misc/float.styl | 14 + ui/misc/grid.styl | 1048 +++++++++++++++++ ui/misc/icons/account--circle.svg | 1 + ui/misc/icons/add.svg | 1 + ui/misc/icons/award.svg | 1 + ui/misc/icons/block.svg | 1 + ui/misc/icons/bold.svg | 1 + ui/misc/icons/calendar.svg | 1 + ui/misc/icons/check--circle.svg | 1 + ui/misc/icons/check.svg | 1 + ui/misc/icons/chevron_left.svg | 1 + ui/misc/icons/chevron_right.svg | 1 + ui/misc/icons/close--circle.svg | 1 + ui/misc/icons/close.svg | 1 + ui/misc/icons/code.svg | 1 + ui/misc/icons/comment--multiple.svg | 1 + ui/misc/icons/comment--text.svg | 1 + ui/misc/icons/copy.svg | 1 + ui/misc/icons/crown.svg | 1 + ui/misc/icons/debug.svg | 1 + ui/misc/icons/delete.svg | 1 + ui/misc/icons/download.svg | 1 + ui/misc/icons/edit.svg | 1 + ui/misc/icons/enlarge.svg | 1 + ui/misc/icons/erase.svg | 1 + ui/misc/icons/expand_less.svg | 1 + ui/misc/icons/expand_more.svg | 1 + ui/misc/icons/facebook.svg | 1 + ui/misc/icons/feeling-lucky.svg | 1 + ui/misc/icons/file.svg | 1 + ui/misc/icons/filter.svg | 1 + ui/misc/icons/flag.svg | 1 + ui/misc/icons/formula.svg | 1 + ui/misc/icons/github.svg | 1 + ui/misc/icons/global.svg | 1 + ui/misc/icons/google_plus.svg | 1 + ui/misc/icons/heart--outline.svg | 1 + ui/misc/icons/heart.svg | 1 + ui/misc/icons/help.svg | 1 + ui/misc/icons/help2.svg | 1 + ui/misc/icons/homework.svg | 1 + ui/misc/icons/hourglass.svg | 1 + ui/misc/icons/info--circle.svg | 1 + ui/misc/icons/info.svg | 1 + ui/misc/icons/insert--image.svg | 1 + ui/misc/icons/insert--link.svg | 1 + ui/misc/icons/italic.svg | 1 + ui/misc/icons/lab.svg | 1 + ui/misc/icons/link--external.svg | 1 + ui/misc/icons/link.svg | 1 + ui/misc/icons/linkedin.svg | 1 + ui/misc/icons/logout.svg | 1 + ui/misc/icons/mail.svg | 1 + ui/misc/icons/ordered_list.svg | 1 + ui/misc/icons/platform--android.svg | 1 + ui/misc/icons/platform--chromeos.svg | 1 + ui/misc/icons/platform--ios.svg | 1 + ui/misc/icons/platform--linux.svg | 1 + ui/misc/icons/platform--mac.svg | 1 + ui/misc/icons/platform--mobile.svg | 1 + ui/misc/icons/platform--unknown.svg | 1 + ui/misc/icons/platform--windows.svg | 1 + ui/misc/icons/play.svg | 1 + ui/misc/icons/preview.svg | 1 + ui/misc/icons/qq.svg | 1 + ui/misc/icons/quote.svg | 1 + ui/misc/icons/refresh.svg | 1 + ui/misc/icons/reply.svg | 1 + ui/misc/icons/schedule--fill.svg | 1 + ui/misc/icons/schedule.svg | 1 + ui/misc/icons/search.svg | 1 + ui/misc/icons/security.svg | 1 + ui/misc/icons/send.svg | 1 + ui/misc/icons/settings.svg | 1 + ui/misc/icons/shrink.svg | 1 + ui/misc/icons/sliders.svg | 1 + ui/misc/icons/stack.svg | 1 + ui/misc/icons/star--outline.svg | 1 + ui/misc/icons/star.svg | 1 + ui/misc/icons/statistics.svg | 1 + ui/misc/icons/tag.svg | 1 + ui/misc/icons/template/webicon.inc.styl | 6 + ui/misc/icons/template/webicon.styl | 25 + ui/misc/icons/twitter.svg | 1 + ui/misc/icons/unordered_list.svg | 1 + ui/misc/icons/upload.svg | 1 + ui/misc/icons/user--multiple.svg | 1 + ui/misc/icons/user.svg | 1 + ui/misc/icons/vote--down.svg | 1 + ui/misc/icons/vote--up.svg | 1 + ui/misc/icons/warning.svg | 1 + ui/misc/icons/web.svg | 1 + ui/misc/icons/wechat.svg | 1 + ui/misc/icons/wrench.svg | 1 + ui/misc/immersive-background.jpg | Bin 0 -> 82214 bytes ui/misc/immersive-background@2x.jpg | Bin 0 -> 182414 bytes ui/misc/immersive.styl | 23 + ui/misc/nothing.styl | 13 + ui/misc/puzzled_twd2.svg | 1 + ui/misc/section.styl | 101 ++ ui/misc/slideout.styl | 49 + ui/misc/structure.styl | 126 ++ ui/misc/textalign.styl | 11 + ui/misc/typography.styl | 439 +++++++ ui/pages/contest_detail.page.styl | 13 + ui/pages/contest_main.page.js | 10 + ui/pages/contest_main.page.styl | 99 ++ ui/pages/contest_scoreboard.page.styl | 22 + ui/pages/discussion_detail.page.js | 10 + ui/pages/discussion_detail.page.styl | 20 + ui/pages/discussion_main.page.styl | 37 + ui/pages/discussion_node.page.js | 10 + .../discussion_node_bg/nodes@2x_advice.png | Bin 0 -> 79401 bytes ui/pages/discussion_node_bg/nodes@2x_qa.png | Bin 0 -> 30290 bytes .../discussion_node_bg/nodes@2x_share.png | Bin 0 -> 29930 bytes .../discussion_node_bg/nodes@2x_solution.png | Bin 0 -> 27261 bytes .../discussion_node_bg/nodes@2x_vijos.png | Bin 0 -> 15758 bytes ui/pages/discussion_node_bg/nodes_advice.png | Bin 0 -> 28165 bytes ui/pages/discussion_node_bg/nodes_qa.png | Bin 0 -> 12889 bytes ui/pages/discussion_node_bg/nodes_share.png | Bin 0 -> 11492 bytes .../discussion_node_bg/nodes_solution.png | Bin 0 -> 11734 bytes ui/pages/discussion_node_bg/nodes_vijos.png | Bin 0 -> 8256 bytes ui/pages/domain_join.page.styl | 8 + .../domain_manage_join_applications.page.js | 19 + ui/pages/domain_manage_permission.page.styl | 14 + ui/pages/domain_manage_role.page.js | 90 ++ ui/pages/domain_manage_role.page.styl | 9 + ui/pages/domain_manage_user.page.js | 159 +++ ui/pages/domain_manage_user.page.styl | 9 + ui/pages/error.page.styl | 44 + ui/pages/error/twd2.svg | 21 + ui/pages/home_account.page.styl | 5 + ui/pages/home_domain.page.styl | 18 + ui/pages/home_messages.page.js | 106 ++ ui/pages/home_security.page.styl | 31 + ui/pages/homework_detail.page.styl | 13 + ui/pages/homework_main.page.js | 37 + ui/pages/homework_main.page.styl | 14 + ui/pages/homework_scoreboard.page.styl | 22 + ui/pages/judge_playground.page.js | 119 ++ ui/pages/problem_copy.page.js | 8 + ui/pages/problem_detail.page.js | 297 +++++ ui/pages/problem_edit.page.js | 10 + ui/pages/problem_main.page.js | 171 +++ ui/pages/problem_main.page.styl | 98 ++ ui/pages/problem_settings.page.js | 19 + ui/pages/problem_solution.page.js | 10 + ui/pages/problem_submit.page.js | 10 + ui/pages/problem_submit.page.styl | 12 + ui/pages/record_detail.page.js | 21 + ui/pages/record_detail.page.styl | 26 + ui/pages/record_main.page.js | 29 + ui/pages/record_main.page.styl | 55 + ui/pages/training_detail.page.js | 35 + ui/pages/training_detail.page.styl | 35 + ui/pages/training_main.page.styl | 48 + ui/pages/user_detail.page.js | 23 + ui/pages/user_detail.page.styl | 90 ++ ui/postcss.config.js | 5 + ui/static/android-chrome-192x192.png | Bin 0 -> 1909 bytes ui/static/apple-touch-icon-180x180.png | Bin 0 -> 3395 bytes ui/static/favicon-16x16.png | Bin 0 -> 388 bytes ui/static/favicon-32x32.png | Bin 0 -> 519 bytes ui/static/favicon-96x96.png | Bin 0 -> 853 bytes ui/static/favicon.ico | Bin 0 -> 15086 bytes ui/static/img/avatar.png | Bin 0 -> 1169 bytes ui/static/img/team_avatar.png | Bin 0 -> 15161 bytes ui/static/manifest.json | 11 + ui/static/mstile-144x144.png | Bin 0 -> 1383 bytes ui/utils/delay.js | 3 + ui/utils/emulateAnchorClick.js | 19 + ui/utils/i18n.js | 8 + ui/utils/loadReactRedux.js | 30 + ui/utils/mediaQuery.js | 13 + ui/utils/mongoId.js | 15 + ui/utils/parseQueryString.js | 11 + ui/utils/pjax.js | 150 +++ ui/utils/request.js | 79 ++ ui/utils/slide.js | 57 + ui/utils/substitute.js | 8 + ui/utils/tpl.js | 23 + ui/utils/zIndexManager.js | 12 + 396 files changed, 13772 insertions(+) create mode 100644 ui/.eslintrc.js create mode 100644 ui/Entry.js create mode 100644 ui/README.md create mode 100644 ui/breakpoints.json create mode 100644 ui/common/color.inc.styl create mode 100644 ui/common/common.inc.styl create mode 100644 ui/common/easing.inc.styl create mode 100644 ui/common/functions.inc.styl create mode 100644 ui/common/rem.inc.styl create mode 100644 ui/common/variables.inc.styl create mode 100644 ui/components/DOMAttachedObject.js create mode 100644 ui/components/autocomplete/DomainSelectAutoComplete.js create mode 100644 ui/components/autocomplete/UserSelectAutoComplete.js create mode 100644 ui/components/autocomplete/autocomplete.page.styl create mode 100644 ui/components/autocomplete/domainselectautocomplete.page.styl create mode 100644 ui/components/autocomplete/index.js create mode 100644 ui/components/autocomplete/userselectautocomplete.page.styl create mode 100644 ui/components/calendar/calendar.page.styl create mode 100644 ui/components/calendar/index.js create mode 100644 ui/components/cmeditor/cmeditor.page.js create mode 100644 ui/components/cmeditor/cmeditor.styl create mode 100644 ui/components/cmeditor/index.js create mode 100644 ui/components/cmeditor/textareaHandler.js create mode 100644 ui/components/cmeditor/vjcmeditor.js create mode 100644 ui/components/contest/contest.page.styl create mode 100644 ui/components/contest/contest_sidebar.page.styl create mode 100644 ui/components/contest/problem-contest-bg.png create mode 100644 ui/components/contest/problem-contest-bg@2x.png create mode 100644 ui/components/datepicker/datepicker.page.js create mode 100644 ui/components/datepicker/datepicker.styl create mode 100644 ui/components/dialog/DomDialog.js create mode 100644 ui/components/dialog/dialog.page.styl create mode 100644 ui/components/dialog/index.js create mode 100644 ui/components/discussion/CommentBox.js create mode 100644 ui/components/discussion/comments.page.js create mode 100644 ui/components/discussion/comments.page.styl create mode 100644 ui/components/discussion/discussion.page.styl create mode 100644 ui/components/drop/drop.page.styl create mode 100644 ui/components/dropdown/Dropdown.js create mode 100644 ui/components/dropdown/dropdown.page.js create mode 100644 ui/components/dropdown/dropdown.page.styl create mode 100644 ui/components/emoji/emoji.page.styl create mode 100644 ui/components/emoji/emojify.page.js create mode 100644 ui/components/footer/footer.page.js create mode 100644 ui/components/footer/footer.page.styl create mode 100644 ui/components/form/button.page.styl create mode 100644 ui/components/form/checkbox.page.styl create mode 100644 ui/components/form/form.page.js create mode 100644 ui/components/form/form.page.styl create mode 100644 ui/components/form/multiSelectCheckbox.page.js create mode 100644 ui/components/form/radiobox.page.styl create mode 100644 ui/components/form/select.page.styl create mode 100644 ui/components/form/textbox.page.js create mode 100644 ui/components/form/textbox.page.styl create mode 100644 ui/components/form/var.inc.styl create mode 100644 ui/components/header/header-background.png create mode 100644 ui/components/header/header-background@2x.png create mode 100644 ui/components/header/header-logo-summer.png create mode 100644 ui/components/header/header-logo-summer@2x.png create mode 100644 ui/components/header/header-logo.png create mode 100755 ui/components/header/header-logo@2x.png create mode 100644 ui/components/header/header.page.styl create mode 100644 ui/components/highlighter/codemirror.page.styl create mode 100644 ui/components/highlighter/highlighter.page.js create mode 100644 ui/components/highlighter/highlighter.page.styl create mode 100644 ui/components/highlighter/meta.js create mode 100644 ui/components/highlighter/prismjs.js create mode 100644 ui/components/homework/homework.page.styl create mode 100644 ui/components/hotkey/hotkey.page.js create mode 100644 ui/components/katex/katex.page.js create mode 100644 ui/components/katex/katex.styl create mode 100644 ui/components/loader/loader.page.styl create mode 100644 ui/components/marker/Marker.js create mode 100644 ui/components/marker/MarkerReactive.js create mode 100644 ui/components/marker/marker.page.js create mode 100644 ui/components/marker/marker.page.styl create mode 100644 ui/components/menu/menu-heading.page.js create mode 100644 ui/components/menu/menu.page.js create mode 100644 ui/components/menu/menu.page.styl create mode 100644 ui/components/messagepad/DialogueListItem.page.styl create mode 100644 ui/components/messagepad/DialogueListItemComponent.js create mode 100644 ui/components/messagepad/Message.page.styl create mode 100644 ui/components/messagepad/MessageComponent.js create mode 100644 ui/components/messagepad/MessagePad.page.styl create mode 100644 ui/components/messagepad/MessagePadDialogueContentContainer.js create mode 100644 ui/components/messagepad/MessagePadDialogueListContainer.js create mode 100644 ui/components/messagepad/MessagePadInputContainer.js create mode 100644 ui/components/messagepad/index.js create mode 100644 ui/components/messagepad/reducers/activeId.js create mode 100644 ui/components/messagepad/reducers/dialogues.js create mode 100644 ui/components/messagepad/reducers/index.js create mode 100644 ui/components/messagepad/reducers/inputs.js create mode 100644 ui/components/messagepad/reducers/isPosting.js create mode 100644 ui/components/navigation/hamburgers.page.styl create mode 100644 ui/components/navigation/index.js create mode 100644 ui/components/navigation/nav-logo-small@2x_dark.png create mode 100644 ui/components/navigation/nav-logo-small@2x_light.png create mode 100644 ui/components/navigation/nav-logo-small_dark.png create mode 100644 ui/components/navigation/nav-logo-small_light.png create mode 100644 ui/components/navigation/navigation.page.js create mode 100644 ui/components/navigation/navigation.page.styl create mode 100644 ui/components/notification/index.js create mode 100644 ui/components/notification/notification.page.styl create mode 100644 ui/components/nprogress/index.js create mode 100644 ui/components/nprogress/nprogress.page.styl create mode 100644 ui/components/pager/pager.page.styl create mode 100644 ui/components/problem/rp.page.styl create mode 100644 ui/components/problem/tag.page.styl create mode 100644 ui/components/profile/backgrounds/1.jpg create mode 100644 ui/components/profile/backgrounds/10.jpg create mode 100644 ui/components/profile/backgrounds/11.jpg create mode 100644 ui/components/profile/backgrounds/12.jpg create mode 100644 ui/components/profile/backgrounds/13.jpg create mode 100644 ui/components/profile/backgrounds/14.jpg create mode 100644 ui/components/profile/backgrounds/15.jpg create mode 100644 ui/components/profile/backgrounds/16.jpg create mode 100644 ui/components/profile/backgrounds/17.jpg create mode 100644 ui/components/profile/backgrounds/18.jpg create mode 100644 ui/components/profile/backgrounds/19.jpg create mode 100644 ui/components/profile/backgrounds/2.jpg create mode 100644 ui/components/profile/backgrounds/20.jpg create mode 100644 ui/components/profile/backgrounds/21.jpg create mode 100644 ui/components/profile/backgrounds/3.jpg create mode 100644 ui/components/profile/backgrounds/4.jpg create mode 100644 ui/components/profile/backgrounds/5.jpg create mode 100644 ui/components/profile/backgrounds/6.jpg create mode 100644 ui/components/profile/backgrounds/7.jpg create mode 100644 ui/components/profile/backgrounds/8.jpg create mode 100644 ui/components/profile/backgrounds/9.jpg create mode 100755 ui/components/profile/backgrounds/gen_thumbnails.sh create mode 100644 ui/components/profile/backgrounds/thumbnail/1.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/10.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/11.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/12.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/13.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/14.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/15.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/16.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/17.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/18.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/19.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/2.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/20.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/21.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/3.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/4.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/5.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/6.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/7.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/8.jpg create mode 100644 ui/components/profile/backgrounds/thumbnail/9.jpg create mode 100644 ui/components/profile/profile.page.styl create mode 100644 ui/components/react-splitpane/SplitPaneFillOverlay.page.styl create mode 100644 ui/components/react-splitpane/SplitPaneFillOverlayComponent.js create mode 100644 ui/components/react-splitpane/splitpane.page.styl create mode 100644 ui/components/react-tabs/rc-tabs.page.js create mode 100644 ui/components/react/DomComponent.js create mode 100644 ui/components/react/IconComponent.js create mode 100644 ui/components/record/record.page.styl create mode 100644 ui/components/rotator/index.js create mode 100644 ui/components/rotator/rotator.page.styl create mode 100644 ui/components/scratchpad/DataInput.page.styl create mode 100644 ui/components/scratchpad/DataInputComponent.js create mode 100644 ui/components/scratchpad/Editor.page.styl create mode 100644 ui/components/scratchpad/Panel.page.styl create mode 100644 ui/components/scratchpad/PanelButton.page.styl create mode 100644 ui/components/scratchpad/PanelButtonComponent.js create mode 100644 ui/components/scratchpad/PanelComponent.js create mode 100644 ui/components/scratchpad/PanelTab.page.styl create mode 100644 ui/components/scratchpad/ScratchpadEditorContainer.js create mode 100644 ui/components/scratchpad/ScratchpadPretestContainer.js create mode 100644 ui/components/scratchpad/ScratchpadPretestTabPaneContainer.js create mode 100644 ui/components/scratchpad/ScratchpadRecordsContainer.js create mode 100644 ui/components/scratchpad/ScratchpadRecordsRowContainer.js create mode 100644 ui/components/scratchpad/ScratchpadRecordsTableContainer.js create mode 100644 ui/components/scratchpad/ScratchpadToolbarContainer.js create mode 100644 ui/components/scratchpad/Toolbar.page.styl create mode 100644 ui/components/scratchpad/ToolbarComponent.js create mode 100644 ui/components/scratchpad/index.js create mode 100644 ui/components/scratchpad/reducers/editor.js create mode 100644 ui/components/scratchpad/reducers/index.js create mode 100644 ui/components/scratchpad/reducers/pretest.js create mode 100644 ui/components/scratchpad/reducers/records.js create mode 100644 ui/components/scratchpad/reducers/ui.js create mode 100644 ui/components/scratchpad/scratchpad.page.styl create mode 100644 ui/components/scratchpad/var.inc.styl create mode 100644 ui/components/signin/signInDialog.page.js create mode 100644 ui/components/signin/signin_dialog.page.styl create mode 100644 ui/components/smoothscroll/smoothscroll.page.js create mode 100644 ui/components/star/star.page.js create mode 100644 ui/components/star/star.page.styl create mode 100644 ui/components/sticky/sticky.page.js create mode 100644 ui/components/tab/Tab.js create mode 100644 ui/components/tab/tab.page.js create mode 100644 ui/components/tab/tab.page.styl create mode 100644 ui/components/tab/var.inc.styl create mode 100644 ui/components/table/StyledTable.js create mode 100644 ui/components/table/styledTable.page.js create mode 100644 ui/components/table/table.page.styl create mode 100644 ui/components/time/time.page.js create mode 100644 ui/components/tooltip/Tooltip.js create mode 100644 ui/components/tooltip/tooltip.page.js create mode 100644 ui/components/tooltip/tooltip.page.styl create mode 100644 ui/components/training/training.page.styl create mode 100644 ui/components/vote/vote.page.js create mode 100644 ui/constant/contest.js create mode 100644 ui/constant/domain.js create mode 100644 ui/constant/language.js create mode 100644 ui/constant/model.js create mode 100644 ui/constant/record.js create mode 100644 ui/constant/setting.js create mode 100644 ui/constant/util/objectMeta.js create mode 100644 ui/jsconfig.json create mode 100644 ui/misc/PageLoader.js create mode 100644 ui/misc/float.styl create mode 100644 ui/misc/grid.styl create mode 100644 ui/misc/icons/account--circle.svg create mode 100644 ui/misc/icons/add.svg create mode 100644 ui/misc/icons/award.svg create mode 100644 ui/misc/icons/block.svg create mode 100644 ui/misc/icons/bold.svg create mode 100644 ui/misc/icons/calendar.svg create mode 100644 ui/misc/icons/check--circle.svg create mode 100644 ui/misc/icons/check.svg create mode 100644 ui/misc/icons/chevron_left.svg create mode 100644 ui/misc/icons/chevron_right.svg create mode 100644 ui/misc/icons/close--circle.svg create mode 100644 ui/misc/icons/close.svg create mode 100644 ui/misc/icons/code.svg create mode 100644 ui/misc/icons/comment--multiple.svg create mode 100644 ui/misc/icons/comment--text.svg create mode 100644 ui/misc/icons/copy.svg create mode 100644 ui/misc/icons/crown.svg create mode 100644 ui/misc/icons/debug.svg create mode 100644 ui/misc/icons/delete.svg create mode 100644 ui/misc/icons/download.svg create mode 100644 ui/misc/icons/edit.svg create mode 100644 ui/misc/icons/enlarge.svg create mode 100644 ui/misc/icons/erase.svg create mode 100644 ui/misc/icons/expand_less.svg create mode 100644 ui/misc/icons/expand_more.svg create mode 100644 ui/misc/icons/facebook.svg create mode 100644 ui/misc/icons/feeling-lucky.svg create mode 100644 ui/misc/icons/file.svg create mode 100644 ui/misc/icons/filter.svg create mode 100644 ui/misc/icons/flag.svg create mode 100644 ui/misc/icons/formula.svg create mode 100644 ui/misc/icons/github.svg create mode 100644 ui/misc/icons/global.svg create mode 100644 ui/misc/icons/google_plus.svg create mode 100644 ui/misc/icons/heart--outline.svg create mode 100644 ui/misc/icons/heart.svg create mode 100644 ui/misc/icons/help.svg create mode 100644 ui/misc/icons/help2.svg create mode 100644 ui/misc/icons/homework.svg create mode 100644 ui/misc/icons/hourglass.svg create mode 100644 ui/misc/icons/info--circle.svg create mode 100644 ui/misc/icons/info.svg create mode 100644 ui/misc/icons/insert--image.svg create mode 100644 ui/misc/icons/insert--link.svg create mode 100644 ui/misc/icons/italic.svg create mode 100644 ui/misc/icons/lab.svg create mode 100644 ui/misc/icons/link--external.svg create mode 100644 ui/misc/icons/link.svg create mode 100644 ui/misc/icons/linkedin.svg create mode 100644 ui/misc/icons/logout.svg create mode 100644 ui/misc/icons/mail.svg create mode 100644 ui/misc/icons/ordered_list.svg create mode 100644 ui/misc/icons/platform--android.svg create mode 100644 ui/misc/icons/platform--chromeos.svg create mode 100644 ui/misc/icons/platform--ios.svg create mode 100644 ui/misc/icons/platform--linux.svg create mode 100644 ui/misc/icons/platform--mac.svg create mode 100644 ui/misc/icons/platform--mobile.svg create mode 100644 ui/misc/icons/platform--unknown.svg create mode 100644 ui/misc/icons/platform--windows.svg create mode 100644 ui/misc/icons/play.svg create mode 100644 ui/misc/icons/preview.svg create mode 100644 ui/misc/icons/qq.svg create mode 100644 ui/misc/icons/quote.svg create mode 100644 ui/misc/icons/refresh.svg create mode 100644 ui/misc/icons/reply.svg create mode 100644 ui/misc/icons/schedule--fill.svg create mode 100644 ui/misc/icons/schedule.svg create mode 100644 ui/misc/icons/search.svg create mode 100644 ui/misc/icons/security.svg create mode 100644 ui/misc/icons/send.svg create mode 100644 ui/misc/icons/settings.svg create mode 100644 ui/misc/icons/shrink.svg create mode 100644 ui/misc/icons/sliders.svg create mode 100644 ui/misc/icons/stack.svg create mode 100644 ui/misc/icons/star--outline.svg create mode 100644 ui/misc/icons/star.svg create mode 100644 ui/misc/icons/statistics.svg create mode 100644 ui/misc/icons/tag.svg create mode 100644 ui/misc/icons/template/webicon.inc.styl create mode 100644 ui/misc/icons/template/webicon.styl create mode 100644 ui/misc/icons/twitter.svg create mode 100644 ui/misc/icons/unordered_list.svg create mode 100644 ui/misc/icons/upload.svg create mode 100644 ui/misc/icons/user--multiple.svg create mode 100644 ui/misc/icons/user.svg create mode 100644 ui/misc/icons/vote--down.svg create mode 100644 ui/misc/icons/vote--up.svg create mode 100644 ui/misc/icons/warning.svg create mode 100644 ui/misc/icons/web.svg create mode 100644 ui/misc/icons/wechat.svg create mode 100644 ui/misc/icons/wrench.svg create mode 100644 ui/misc/immersive-background.jpg create mode 100644 ui/misc/immersive-background@2x.jpg create mode 100644 ui/misc/immersive.styl create mode 100644 ui/misc/nothing.styl create mode 100644 ui/misc/puzzled_twd2.svg create mode 100644 ui/misc/section.styl create mode 100644 ui/misc/slideout.styl create mode 100644 ui/misc/structure.styl create mode 100644 ui/misc/textalign.styl create mode 100644 ui/misc/typography.styl create mode 100644 ui/pages/contest_detail.page.styl create mode 100644 ui/pages/contest_main.page.js create mode 100644 ui/pages/contest_main.page.styl create mode 100644 ui/pages/contest_scoreboard.page.styl create mode 100644 ui/pages/discussion_detail.page.js create mode 100644 ui/pages/discussion_detail.page.styl create mode 100644 ui/pages/discussion_main.page.styl create mode 100644 ui/pages/discussion_node.page.js create mode 100644 ui/pages/discussion_node_bg/nodes@2x_advice.png create mode 100755 ui/pages/discussion_node_bg/nodes@2x_qa.png create mode 100755 ui/pages/discussion_node_bg/nodes@2x_share.png create mode 100755 ui/pages/discussion_node_bg/nodes@2x_solution.png create mode 100755 ui/pages/discussion_node_bg/nodes@2x_vijos.png create mode 100644 ui/pages/discussion_node_bg/nodes_advice.png create mode 100755 ui/pages/discussion_node_bg/nodes_qa.png create mode 100755 ui/pages/discussion_node_bg/nodes_share.png create mode 100755 ui/pages/discussion_node_bg/nodes_solution.png create mode 100755 ui/pages/discussion_node_bg/nodes_vijos.png create mode 100644 ui/pages/domain_join.page.styl create mode 100644 ui/pages/domain_manage_join_applications.page.js create mode 100644 ui/pages/domain_manage_permission.page.styl create mode 100644 ui/pages/domain_manage_role.page.js create mode 100644 ui/pages/domain_manage_role.page.styl create mode 100644 ui/pages/domain_manage_user.page.js create mode 100644 ui/pages/domain_manage_user.page.styl create mode 100644 ui/pages/error.page.styl create mode 100644 ui/pages/error/twd2.svg create mode 100644 ui/pages/home_account.page.styl create mode 100644 ui/pages/home_domain.page.styl create mode 100644 ui/pages/home_messages.page.js create mode 100644 ui/pages/home_security.page.styl create mode 100644 ui/pages/homework_detail.page.styl create mode 100644 ui/pages/homework_main.page.js create mode 100644 ui/pages/homework_main.page.styl create mode 100644 ui/pages/homework_scoreboard.page.styl create mode 100644 ui/pages/judge_playground.page.js create mode 100644 ui/pages/problem_copy.page.js create mode 100644 ui/pages/problem_detail.page.js create mode 100644 ui/pages/problem_edit.page.js create mode 100644 ui/pages/problem_main.page.js create mode 100644 ui/pages/problem_main.page.styl create mode 100644 ui/pages/problem_settings.page.js create mode 100644 ui/pages/problem_solution.page.js create mode 100644 ui/pages/problem_submit.page.js create mode 100644 ui/pages/problem_submit.page.styl create mode 100644 ui/pages/record_detail.page.js create mode 100644 ui/pages/record_detail.page.styl create mode 100644 ui/pages/record_main.page.js create mode 100644 ui/pages/record_main.page.styl create mode 100644 ui/pages/training_detail.page.js create mode 100644 ui/pages/training_detail.page.styl create mode 100644 ui/pages/training_main.page.styl create mode 100644 ui/pages/user_detail.page.js create mode 100644 ui/pages/user_detail.page.styl create mode 100644 ui/postcss.config.js create mode 100644 ui/static/android-chrome-192x192.png create mode 100644 ui/static/apple-touch-icon-180x180.png create mode 100644 ui/static/favicon-16x16.png create mode 100644 ui/static/favicon-32x32.png create mode 100644 ui/static/favicon-96x96.png create mode 100644 ui/static/favicon.ico create mode 100644 ui/static/img/avatar.png create mode 100644 ui/static/img/team_avatar.png create mode 100644 ui/static/manifest.json create mode 100644 ui/static/mstile-144x144.png create mode 100644 ui/utils/delay.js create mode 100644 ui/utils/emulateAnchorClick.js create mode 100644 ui/utils/i18n.js create mode 100644 ui/utils/loadReactRedux.js create mode 100644 ui/utils/mediaQuery.js create mode 100644 ui/utils/mongoId.js create mode 100644 ui/utils/parseQueryString.js create mode 100644 ui/utils/pjax.js create mode 100644 ui/utils/request.js create mode 100644 ui/utils/slide.js create mode 100644 ui/utils/substitute.js create mode 100644 ui/utils/tpl.js create mode 100644 ui/utils/zIndexManager.js diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js new file mode 100644 index 000000000..90f69915f --- /dev/null +++ b/ui/.eslintrc.js @@ -0,0 +1,94 @@ +const path = require('path'); + +module.exports = { + "parser": "babel-eslint", + "plugins": [ + "babel", + "react" + ], + "env": { + "browser": true, + "es6": true, + "jquery": true, + "commonjs": true + }, + "extends": [ + "airbnb" + ], + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 7, + "ecmaFeatures": { + "impliedStrict": true, + "experimentalObjectRestSpread": true, + "jsx": true, + "legacyDecorators": true + } + }, + "settings": { + "import/resolver": { + "webpack": { + "config": { + "resolve": { + "alias": { + "vj": path.resolve(__dirname), + } + } + } + } + } + }, + "globals": { + "__webpack_public_path__": true, + "__webpack_require__": true, + "UiContext": true, + "UserContext": true, + "Context": true, + "LOCALES": true + }, + "rules": { + "comma-dangle": [ + "error", + "always-multiline" + ], + "indent": [ + "error", + 2, + { + "SwitchCase": 0 + } + ], + "max-len": [ + "error", + 150 + ], + "quotes": "warn", + "func-names": "off", + "class-methods-use-this": "off", + "consistent-return": "warn", + "no-restricted-syntax": "warn", + "no-unused-vars": "warn", + "no-console": "off", + "no-continue": "off", + "no-mixed-operators": "off", + "no-plusplus": "off", + "no-underscore-dangle": "off", + "no-await-in-loop": "off", + "no-lonely-if": "off", + "import/first": "off", + "react/prefer-stateless-function": "off", + "react/self-closing-comp": "off", + "react/prop-types": "off", + "react/jsx-filename-extension": "off", + "react/jsx-one-expression-per-line": "off", + "react/no-string-refs": "off", + "react/require-default-props": "off", + "react/react-in-jsx-scope": "off", + "react/destructuring-assignment": "off", + "react/button-has-type": "off", + "react/forbid-prop-types": "off", + "jsx-a11y/no-static-element-interactions": "off", + "jsx-a11y/anchor-is-valid": "off", + "jsx-a11y/click-events-have-key-events": "off" + } +}; diff --git a/ui/Entry.js b/ui/Entry.js new file mode 100644 index 000000000..8124d37cb --- /dev/null +++ b/ui/Entry.js @@ -0,0 +1,93 @@ +import 'jquery.transit'; + +import 'normalize.css/normalize.css'; +import 'codemirror/lib/codemirror.css'; + +import _ from 'lodash'; + +import 'vj/misc/float.styl'; +import 'vj/misc/typography.styl'; +import 'vj/misc/textalign.styl'; +import 'vj/misc/grid.styl'; +import 'vj/misc/slideout.styl'; + +import 'vj/misc/.iconfont/webicon.styl'; +import 'vj/misc/immersive.styl'; +import 'vj/misc/structure.styl'; +import 'vj/misc/section.styl'; +import 'vj/misc/nothing.styl'; + +import { PageLoader } from 'vj/misc/PageLoader'; +import delay from 'vj/utils/delay'; + +// eslint-disable-next-line camelcase +__webpack_public_path__ = UiContext.cdn_prefix; + +const pageLoader = new PageLoader(); + +const currentPage = pageLoader.getNamedPage(document.documentElement.getAttribute('data-page')); +const includedPages = pageLoader.getAutoloadPages(); + +function buildSequence(pages, type) { + if (process.env.NODE_ENV !== 'production') { + if (['before', 'after'].indexOf(type) === -1) { + // eslint-disable-next-line quotes + throw new Error(`'type' should be one of 'before' or 'after'`); + } + } + return pages + .filter(p => p && p[`${type}Loading`]) + .map(p => ({ + page: p, + func: p[`${type}Loading`], + type, + })); +} + +async function load() { + const loadSequence = [ + ...buildSequence(includedPages, 'before'), + ...buildSequence([currentPage], 'before'), + ...buildSequence(includedPages, 'after'), + ...buildSequence([currentPage], 'after'), + ]; + // eslint-disable-next-line no-restricted-syntax + for (const { page, func, type } of loadSequence) { + if (typeof func !== 'function') { + if (process.env.NODE_ENV !== 'production') { + throw new Error(`The '${type}Loading' function of '${page.name}' is not callable`); + } + continue; + } + if (process.env.NODE_ENV !== 'production') { + console.time(`${page.name}: ${type}Loading`); + } + try { + await func(); + } catch (e) { + console.error(`Failed to call '${type}Loading' of ${page.name}\n${e.stack}`); + } + if (process.env.NODE_ENV !== 'production') { + console.timeEnd(`${page.name}: ${type}Loading`); + } + } + const sections = _.map($('.section').get(), (section, idx) => ({ + shouldDelay: idx < 5, // only animate first 5 sections + $element: $(section), + })); + // eslint-disable-next-line no-restricted-syntax + for (const { $element, shouldDelay } of sections) { + $element.addClass('visible'); + if (shouldDelay) { + await delay(50); + } + } + await delay(500); + // eslint-disable-next-line no-restricted-syntax + for (const { $element } of sections) { + $element.trigger('vjLayout'); + } + $(document).trigger('vjPageFullyInitialized'); +} + +load(); diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 000000000..069c0a4cf --- /dev/null +++ b/ui/README.md @@ -0,0 +1,415 @@ +# Vijos UI Framework + +## Responsive Cutoffs + +Vijos use the following cutoffs to determine the size of a device. + +Small: `[0 - 450px)` (mobile) + +Medium: `[450px, 1000px)` (tablet) + +Large: `[1000px, -)` (desktop) + +## Layout + +### Grid + +See [Foundation Grid](http://foundation.zurb.com/sites/docs/grid.html) + +### Float + +See [Foundation Float](http://foundation.zurb.com/sites/docs/float-classes.html) + +> NOTE: `.float-center` is not implemented. + +## Typography + +HTML elements such as headings (`h1`, `h2`, ...), lists (`ol`, `ul`, `li`, ...) and tables does not have margins and paddings by default in order to easy the styling of semantic structures. However you may want suitable space between those elements when they are used to present content to users (for example, problem content). In this case, you need to enable the typography styling by wrapping them with `
`: + +```html +
+

Notice

+

The content will be well formatted.

+ +
+``` + +### Text Alignment + +```html + + + + +``` + +## Prototype Components + +### Media Object + +TODO + +### Number Box Object + +TODO + +### Balancer Object + +TODO + +## Basic Components + +### Section + +Section is served as an entry to more detailed contents. By default, each section has a white background and drop-shadow. + +A section should contain a section-header and one or more section bodies. + +```html +
+
+ +
+
+ +
+
+ +
+
+``` + +There will be vertical margins between section bodies. + +#### Side Section + +If the section is acted as a sidebar section, it should contain `side` class so that its default font size becomes smaller: + +```html +
+``` + +#### Title + +You can use `` to specify the title for a section (`X` is from `h1` to `h3`). The font size and the color of the section title is different from normal headings. + +```html +
+
+

Section title

+
+
+``` + +#### Table + +If the main content of the section is a data table (or additionally with a title and a paginator), it is suggested to apply `data-table` to the table. Table should be put inside a section-body with `no-padding` decoration. + +3 * 2 table sample: + +```html +
+ +
+ + + + + + + + + + + + + + + + +
1,11,2
2,12,2
3,13,2
+
+
+``` + +> If you want to specify the width of a column, you should add `col--xxx` to the class name list (as shown above) and specify its width in a CSS rule like: +> +> ```css +> .col--1 { width: 120px; } +> ``` + +#### Samples + +Section with content: + +```html +
+
+ Section content +
+
+``` + +Section with title and content: + +```html +
+
+

Section title

+
+
+ Section content +
+
+``` + +Section with title and table content: + +```html +
+
+

Section title

+
+
+ + +
+
+
+``` + +### Button + +```html + +``` + +Additional class names: + +`rounded`: The button would have round corners. + +`primary`: The button would have blue background. + +`expanded`: The button would occupy full width of the parent. + +`inverse`: TODO + +### Input + +```html + +``` + +`X` could be `input` or `textarea`. + +Additional class names: + +`material`: TODO + +`inverse`: TODO + +### Paginator + +TODO + +### Menu + +```html + +``` + +Optionally, a menu item can be `active` or `highlight` (notice that the decorator class name is added to `menu__link` instead of `menu__item`): + +```html + + +``` + +Menu can be put inside a section. It should be placed inside `section__body no-padding` or directly inside `section`: + +```html +
+
+ +
+
+``` + +#### Menu Item from Headings + +Menu items can be automatically generated from headings. To enable this feature, you need to specify the region to extract headings and the destination of extracted menu items by setting `data-heading-extract-to` attribute: + +```html +
+

Heading 1

+

Heading 2

+
+``` + +This attribute accepts a CSS selector and all elements that contain `data-heading` attribute in the element will be extracted. `id` is essential and it will be appended to the hash part so that the page will navigate when user clicks the newly generate menu item. + +The CSS selector should match a `menu__item` element. Headings will become the sub-menu of that element. + +### Sticky + +Sticky elements are always visible when the user scrolls. To enable sticky, add `data-sticky` attribute to the element. + +Optionally, the value of `data-sticky` can be `medium` or `large`. When `data-sticky` is `medium`, the element will be sticky only when window size is larger than mobile cutoff (can be tablet or desktop). When `data-sticky` is `large`, it will take effect only when window size is larger than desktop cutoff. See section Responsive Cutoffs for actual sizes. + +The sticky element is restricted to the boundary of its closest parent. You can change this behavior by assigning attribute `data-sticky-parent` to the desired parent. `data-sticky-parent` can not be used in nested sticky elements. + +A sample of sticky sidebar: + +```html +
+
+ +
+
+
+
Sticky!
+
+
+
+``` + +- Because the columns will be stacked when window size is smaller than `large` (tablet and mobile) and we don't want sidebars keep sticky in such cases, we have `data-sticky="large"` so that the element will be sticky ONLY when window size is `large`. + +- The height of the two columns are not equal so the sticky parent should be `.row` instead. + +### CommonMark Editor + +CommonMark editor can be automatically transformed from a normal textarea. Inputs in the CommonMark editor will be synced to the textarea in real-time. To enable this feature, add `data-markdown` to the `textarea` element. + +Sample: + +```html + +``` + +> To make it work with newly added textareas, you need to trigger `vjContentNew` event for the new element. Textarea with `data-markdown` should be a children of the trigger target. + + +### Emoji + +[Emoji code](http://www.webpagefx.com/tools/emoji-cheat-sheet/) can be automatically transformed into emoji images. To enable this feature, add `data-emoji-enabled` to the element. + +Sample: + +```html +
+``` + +> To make it work with newly added contents, you need to trigger `vjContentNew` event for the new element. + +### Dropdown + +TODO + +### Navigation + +TODO + +### Star + +TODO + +### Tab + +TODO + +### Hotkey + +#### Local Hotkey + +Local hotkeys are triggered when it is assigned to a parent of the active element in which user presses specific key. + +To enable local hotkey on an element, add `data-hotkey` attribute: + +```html + +``` + +You can specify multiple hotkeys in the attribute. + +#### Global hotkey + +Global hotkeys are triggered no matter where user presses specific key. + +To enable global hotkey on an element, add `data-global-hotkey` attribute: + +```html + +``` + +You can specify multiple hotkeys in the attribute. + +#### Hotkey Syntax + +`hotKeyDef[,hotKeyDef[,hotKeyDef...]]` + +`hotKeyDef`: `keySequence[:event]` + +`keySequence`: `key1[+key2[+key3...]]` + +When `keySequence` matches, the `event` will be triggered on the element that holds the attribute. If `event` is not given in `hotKeyDef`, it will be `click` by default. In addition, if `event` is `submit`, the event will be triggered on the closest `form` element, instead of the current element. + +Sample: + +`ctrl+f1`: Triggers click on this element when user presses `Ctrl`+`F1` or `Command`+`F1`. + +`ctrl+enter:submit`: Triggers submit on the closest `form` when user presses `Ctrl+Enter` or `Command+Enter`. + +`f1:submit,f2:client`: Triggers submit when user presses `f1` and triggers click when user presses `f2`. + +### Tooltip + +```html + +``` + +Optionally, you can specify a location by assigning `data-tooltip-pos` attribute. Available values are: + +- `"top left"` +- `"top middle"` (default) +- `"top right"` +- `"bottom left"` +- `"bottom middle"` +- `"bottom right"` + +## High-Level Components + +### Comment List + +TODO + +## Other + +### JavaScript-Responsive Visibility + +#### Hide if JavaScript is disabled + +```html + +``` + +#### Hide if JavaScript is enabled + +```html + +``` diff --git a/ui/breakpoints.json b/ui/breakpoints.json new file mode 100644 index 000000000..386c14cb0 --- /dev/null +++ b/ui/breakpoints.json @@ -0,0 +1,5 @@ +{ + "mobile": 450, + "desktop": 1000, + "hd": 1250 +} diff --git a/ui/common/color.inc.styl b/ui/common/color.inc.styl new file mode 100644 index 000000000..defc99594 --- /dev/null +++ b/ui/common/color.inc.styl @@ -0,0 +1,17 @@ +aqua = #7FDBFF +blue = #0074D9 +navy = #001F3F +teal = #39CCCC +green = #2ECC40 +olive = #3D9970 +lime = #01FF70 +yellow = #FFDC00 +orange = #FF851B +red = #FF4136 +fuchsia = #F012BE +purple = #B10DC9 +maroon = #85144B +white = #ffffff +silver = #dddddd +gray = #aaaaaa +black = #111111 diff --git a/ui/common/common.inc.styl b/ui/common/common.inc.styl new file mode 100644 index 000000000..ff72825e0 --- /dev/null +++ b/ui/common/common.inc.styl @@ -0,0 +1,12 @@ +// This file is imported in all stylus source code +breakpoints = json('../breakpoints.json', { hash: true }) +rupture.mobile-cutoff = unit(breakpoints.mobile, 'px') +rupture.desktop-cutoff = unit(breakpoints.desktop, 'px') +rupture.hd-cutoff = unit(breakpoints.hd, 'px') + +@import '~vj/misc/.iconfont/webicon.inc.styl' +@import 'color.inc.styl' +@import 'variables.inc.styl' +@import 'easing.inc.styl' +@import 'rem.inc.styl' +@import 'functions.inc.styl' diff --git a/ui/common/easing.inc.styl b/ui/common/easing.inc.styl new file mode 100644 index 000000000..50713e02c --- /dev/null +++ b/ui/common/easing.inc.styl @@ -0,0 +1,39 @@ +// Cubic +ease-in-cubic = cubic-bezier(0.550, 0.055, 0.675, 0.190); +ease-out-cubic = cubic-bezier(0.215, 0.610, 0.355, 1.000); +ease-in-out-cubic = cubic-bezier(0.645, 0.045, 0.355, 1.000); + +// Circ +ease-in-circ = cubic-bezier(0.600, 0.040, 0.980, 0.335); +ease-out-circ = cubic-bezier(0.075, 0.820, 0.165, 1.000); +ease-in-out-circ = cubic-bezier(0.785, 0.135, 0.150, 0.860); + +// Expo +ease-in-expo = cubic-bezier(0.950, 0.050, 0.795, 0.035); +ease-out-expo = cubic-bezier(0.190, 1.000, 0.220, 1.000); +ease-in-out-expo = cubic-bezier(1.000, 0.000, 0.000, 1.000); + +// Quad +ease-in-quad = cubic-bezier(0.550, 0.085, 0.680, 0.530); +ease-out-quad = cubic-bezier(0.250, 0.460, 0.450, 0.940); +ease-in-out-quad = cubic-bezier(0.455, 0.030, 0.515, 0.955); + +// Quart +ease-in-quart = cubic-bezier(0.895, 0.030, 0.685, 0.220); +ease-out-quart = cubic-bezier(0.165, 0.840, 0.440, 1.000); +ease-in-out-quart = cubic-bezier(0.770, 0.000, 0.175, 1.000); + +// Quint +ease-in-quint = cubic-bezier(0.755, 0.050, 0.855, 0.060); +ease-out-quint = cubic-bezier(0.230, 1.000, 0.320, 1.000); +ease-in-out-quint = cubic-bezier(0.860, 0.000, 0.070, 1.000); + +// Sine +ease-in-sine = cubic-bezier(0.470, 0.000, 0.745, 0.715); +ease-out-sine = cubic-bezier(0.390, 0.575, 0.565, 1.000); +ease-in-out-sine = cubic-bezier(0.445, 0.050, 0.550, 0.950); + +// Back +ease-in-back = cubic-bezier(0.600, -0.280, 0.735, 0.045); +ease-out-back = cubic-bezier(0.175, 0.885, 0.320, 1.275); +ease-in-out-back = cubic-bezier(0.680, -0.550, 0.265, 1.550); diff --git a/ui/common/functions.inc.styl b/ui/common/functions.inc.styl new file mode 100644 index 000000000..778ac974a --- /dev/null +++ b/ui/common/functions.inc.styl @@ -0,0 +1,9 @@ +word-wrap() + overflow-wrap: break-word + word-wrap: break-word + -ms-word-break: break-all + word-break: break-word + -ms-hyphens: auto + -moz-hyphens: auto + -webkit-hyphens: auto + hyphens: auto diff --git a/ui/common/rem.inc.styl b/ui/common/rem.inc.styl new file mode 100644 index 000000000..b80603429 --- /dev/null +++ b/ui/common/rem.inc.styl @@ -0,0 +1,7 @@ +rem() { + ret = (); + for arg in arguments { + push(ret, unit(arg / $font-size, 'rem')); + } + return ret; +} diff --git a/ui/common/variables.inc.styl b/ui/common/variables.inc.styl new file mode 100644 index 000000000..d2623cdb1 --- /dev/null +++ b/ui/common/variables.inc.styl @@ -0,0 +1,261 @@ +// layout +$grid-padding = 15px // half gutter + +// fonts +$primary-font-family = "Open Sans", "Seravek", "Segoe UI", "Verdana", "PingFang SC", "Hiragino Sans GB", "Lantinghei SC", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans" +$header-font-family = "Open Sans", "Seravek", "Segoe UI", "Verdana", "PingFang SC", "Lantinghei SC", "Microsoft Yahei", "Hiragino Sans GB", "Microsoft Sans Serif", "WenQuanYi Micro Hei", "sans-serif" +$code-font-family = "monaco", "Source Code Pro", "Consolas", "Lucida Console", "monospace" + +// primary palette +$default-color = #ddd +$primary-color = #5f9fd6 +$secondary-color = #ed5f82 +$highlight-color = #df6589 +$code-color = #c92a2a +$text-1-color = #555 +$text-2-color = lighten($text-1-color, 15%) +$text-3-color = lighten($text-1-color, 30%) +$header-1-color = #3d3d3d +$header-2-color = lighten($header-1-color, 20%) +$blockquote-color = #999 +$page-bg-color = #edf0f2 +$content-bg-color = #fff +$border-1-color = $default-color +$border-2-color = lighten($default-color, 20%) + +$immersive-primary-color = #ffef87 +$immersive-text-color = #f8f8f8 +$immersive-header-color = #ffffff + +$success-color = #25ad40 +$fail-color = #fb5555 +$progress-color = #f39800 +$invalid-color = #9fa0a0 + +// sizes +$font-size = 16px // main content +$font-size-secondary = 14px // secondary content +$font-size-small = 13px // additional informations, usually gray colored +$font-size-icon = 16px +$font-size-title = 20px + +// components +$section-gap-v = 25px +$section-gap-h = $grid-padding +$section-margin = 30px +$section-shadow = rem(0 6px 22px) rgba(#AFC2C9, 0.5) +$section-bg-color = $content-bg-color +$section-title-color = $header-2-color +$section-toolbtn-color = #AAA +$section-toolbtn-color-hover = #444 + +$autocomplete-empty-row-color = #AAA +$userselect-uid-color = #BBB + +$editor-border-color = $border-1-color + +$datepicker-shadow = rem(0 2px 7px) rgba(#000, 0.3) +$datapicker-list-item-bg-color-hover = #F0F0F0 + +$dialog-layer-bg-color = rgba(#F0F0F0, 0.6) +$dialog-bg-color = $content-bg-color +$dialog-border-color = $border-1-color +$dialog-shadow = rem(0 2px 10px) rgba(#000, 0.2) +$dialog-title-color = $header-2-color + +$comment-placeholder-color = #AAA +$comment-op-color = lighten($text-1-color, 30%) +$comment-op-link-color = lighten($text-1-color, 50%) + +$menu-item-bg-color-hover = #F4F4F4 +$menu-drop-shadow = rem(0 2px 7px) rgba(#000, 0.3) +$menu-drop-bg-color = $content-bg-color +$menu-drop-triangle-size = 4px +$menu-drop-triangle-shadow = rem(-2px -2px 2px) rgba(#000, 0.15) + +$nav-item-height = 45px +$nav-item-hover-color = $primary-color +$nav-item-active-color = $secondary-color +$nav-item-active-immersive-color = #9AE3F3 +$nav-item-round-height = 32px +$nav-item-round-color = $primary-color +$nav-item-round-border = 2px +$nav-logo-width = 45px +$nav-logo-height = 23px + +$header-layer-height = 100px +$header-bg-width = 1920px +$header-bg-height = 320px +$header-bg-height-mini = $header-bg-height - $header-layer-height +//$header-logo-width = 280px +//$header-logo-height = 150px +//$header-logo-width-real = 280px +//$header-logo-height-real = 150px +$header-logo-width = 252px +$header-logo-height = 150px +$header-logo-width-real = 381px +$header-logo-height-real = 201px +$header-logo-domain-lh = 60px +$header-logo-system-lh = 30px + +$footer-bg-color = $content-bg-color + +$input-focus-color = #C1E0FF +$form-control-height = 35px +$compact-control-height = 28px +$input-margin = 0 0 1rem +$input-multi-line-margin = 0 0.3rem 0.15rem 0 +$input-image-radio-margin = 0 0.3rem 0.3rem 0 +$input-background-color = $content-bg-color +$input-border = 1px solid $border-1-color +$input-outline = 2px solid transparent +$input-focus-border-color = $primary-color +$input-focus-outline = 2px solid $input-focus-color +$label-color = lighten($text-1-color, 10%) +$help-text-color = lighten($text-1-color, 30%) + +$table-border-color = $border-2-color +$table-alternate-bg-color = #F4F4F4 +$table-header-bg-color = rgba(#FFF, 0.95) +$table-header-shadow = rem(0 3px 2px) rgba(#000, 0.03) +$table-header-shadow-floating = rem(0 2px 5px) rgba(#000, 0.2) +$table-padding-h = 10px +$table-lh = 26px + +$toolbar-bg = #f2f6f7 +$toolbar-fore = #8395a1 +$toolbar-fore-hover = #5a6b75 +$toolbar-bg-hover = #e3e7e8 +$toolbar-fore-selected = #FFF +$toolbar-bg-selected = $secondary-color +$toolbar-disabled-opacity = 0.3 + +$supplementary-color = lighten($text-1-color, 50%) +$supplementary-border-color = lighten($supplementary-color, 62%) +$supplementary-link-color = lighten($text-1-color, 40%) + +$pager-border-color = $table-border-color + +$nprogress-color = #FFF +$nprogress-color-floating = $primary-color + +$syntax-hl-bg-color = #F8F8F8 + +// Calendar +$calendar-banner-color = { + '0': #FA6582, + '1': #EEA9C5, + '2': #FDB24D, + '3': #98CA86, + '4': #7DCBBF, + '5': #20BDE8, + '6': #6BCDDB, + '7': #6598FF, + '8': #8EB0F5, + '9': #928FE3, + '10': #676E7E, + '11': #A1A5AB, +} + +// Notification +$notification-color = { + 'success': #9BDB7B, + 'info': #78D6F4, + 'warn': #FCD279, + 'error': #FD848D, +} + +$notification-icon = { + 'success': $icon-check--circle, + 'info': $icon-info--circle, + 'warn': $icon-info--circle, + 'error': $icon-close--circle, +} + +// Badge +$badge-text-color = { + 'mod': #FFF, + 'lv0': #727171, + 'lv1': #FFF, + 'lv2': #FFF, + 'lv3': #FFF, + 'lv4': #FFF, + 'lv5': #FFF, + 'lv6': #FFF, + 'lv7': #FFF, + 'lv8': #FFF, + 'lv9': #FFF, + 'lv10': #FFF, +} +$badge-bg-color = { + 'mod': #cf70ab, + 'lv0': #efefef, + 'lv1': #9db4bd, + 'lv2': #9db4bd, + 'lv3': #73c3bc, + 'lv4': #73c3bc, + 'lv5': #81ba6c, + 'lv6': #81ba6c, + 'lv7': #f7b200, + 'lv8': #ff9251, + 'lv9': #eb6363, + 'lv10': #575757, +} + +// Record Status +$record-status-color = { + 'pass': $success-color, + 'fail': $fail-color, + 'progress': $progress-color, + 'ignored': $invalid-color, + 'pending': $invalid-color, +} + +$record-status-icon = { + 'pass': $icon-check, + 'fail': $icon-close, + 'progress': $icon-hourglass, + 'ignored': $icon-close, + 'pending': $icon-schedule, +} + +// Training Status +$training-status-color = { + 'outside': $supplementary-color, + 'progress': #e64c72, + 'done': #25ad40, +} + +$training-status-icon = { + 'outside': $icon-help2, + 'progress': $icon-schedule, + 'done': $icon-check, +} + +// Training Section Status +$training-section-status-color = { + 'done': #25ad40, + 'open': #e64c72, + 'progress': #e64c72, + 'invalid': $supplementary-color, +} + +$training-section-status-icon = { + 'done': $icon-check, + 'open': $icon-help2, + 'progress': $icon-schedule, + 'invalid': $icon-close, +} + +// Contest type +// #6EA2C7, #48AAB7, #6BB67A, #F5C735, #DC7D86 +$contest-color = { + 'acm': #6BB67A, + 'oi': #F5C735, +} + +// Homework Status +$homework-status-color = { + 'not_started': $text-2-color, + 'ongoing': $success-color, +} diff --git a/ui/components/DOMAttachedObject.js b/ui/components/DOMAttachedObject.js new file mode 100644 index 000000000..1341c6c57 --- /dev/null +++ b/ui/components/DOMAttachedObject.js @@ -0,0 +1,131 @@ +let removalChecker = null; +const res = []; + +function checkResources() { + for (let i = res.length - 1; i >= 0; --i) { + if (res[i].detached || !document.body.contains(res[i].$dom[0])) { + if (!res[i].detached) { + res[i].detach(); + } + res.splice(i, 1); + } + } + if (res.length === 0) { + clearInterval(removalChecker); + removalChecker = null; + } +} + +function monitorResource(resource) { + res.push(resource); + if (removalChecker === null) { + removalChecker = setInterval(checkResources, 500); + } +} + +export default class DOMAttachedObject { + static uniqueIdCounter = 0; + + static get($obj) { + const key = this.DOMAttachKey; + return $obj.data(key); + } + + static getOrConstruct($obj, ...args) { + const $singleObj = $obj.eq(0); + const key = this.DOMAttachKey; + const Protoclass = this; + const instance = this.get($singleObj); + if (instance !== undefined) { + return instance; + } + const newInstance = new Protoclass($singleObj, ...args); + // $dom may be updated in constructor so that we use $dom instead + // of $singleObj here. + if (!newInstance.$dom) { + return null; + } + newInstance.$dom.data(key, newInstance); + return newInstance; + } + + static attachAll(container = document.body, ...args) { + if (process.env.NODE_ENV !== 'production') { + if (!this.DOMAttachSelector) { + // eslint-disable-next-line quotes + throw new Error(`'DOMAttachSelector' should be specified`); + } + } + if (process.env.NODE_ENV !== 'production') { + console.time(`DOMAttachedObject[${this.DOMAttachKey}]: attachAll`); + } + $(container) + .find(this.DOMAttachSelector) + .addBack(this.DOMAttachSelector) + .get() + .forEach(element => this.getOrConstruct($(element), ...args)); + if (process.env.NODE_ENV !== 'production') { + console.timeEnd(`DOMAttachedObject[${this.DOMAttachKey}]: attachAll`); + } + } + + static detachAll(container = document.body) { + const selector = this.DOMDetachSelector || this.DOMAttachSelector; + if (process.env.NODE_ENV !== 'production') { + if (!selector) { + // eslint-disable-next-line quotes + throw new Error(`'DOMDetachSelector' or 'DOMAttachSelector' should be specified`); + } + } + if (process.env.NODE_ENV !== 'production') { + console.time(`DOMAttachedObject[${this.DOMAttachKey}]: detachAll`); + } + $(container) + .find(selector) + .addBack(selector) + .get() + .forEach((element) => { + const instance = this.get($(element)); + if (instance) { + instance.detach(); + } + }); + if (process.env.NODE_ENV !== 'production') { + console.timeEnd(`DOMAttachedObject[${this.DOMAttachKey}]: detachAll`); + } + } + + static registerLifeCycleHooks(attach = true) { + if (process.env.NODE_ENV !== 'production') { + if (!this.DOMAttachSelector) { + // eslint-disable-next-line quotes + throw new Error(`'DOMAttachSelector' should be specified`); + } + } + $(document).on('vjContentNew', e => this.attachAll(e.target)); + $(document).on('vjContentRemove', e => this.detachAll(e.target)); + if (attach) { + this.attachAll(); + } + } + + detach() { + if (this.constructor.DOMAttachKey) { + this.$dom.removeData(this.constructor.DOMAttachKey); + } + this.detached = true; + } + + constructor($dom, monitorDetach = false) { + if ($dom == null) { + return null; + } + this.$dom = $dom; + this.id = ++DOMAttachedObject.uniqueIdCounter; + this.eventNS = `vj4obj_${this.id}`; + this.detached = false; + if (monitorDetach) { + monitorResource(this); + } + } +} diff --git a/ui/components/autocomplete/DomainSelectAutoComplete.js b/ui/components/autocomplete/DomainSelectAutoComplete.js new file mode 100644 index 000000000..3894dd924 --- /dev/null +++ b/ui/components/autocomplete/DomainSelectAutoComplete.js @@ -0,0 +1,43 @@ +import _ from 'lodash'; +import tpl from 'vj/utils/tpl'; +import request from 'vj/utils/request'; +import DOMAttachedObject from 'vj/components/DOMAttachedObject'; +import AutoComplete from '.'; + +function getText(domain) { + return domain._id; +} + +function getItems(val) { + return request.get('/domain/search', { q: val }); +} + +function renderItem(domain) { + return tpl` +
+
+ +
+
+
${domain.name}
+
ID = ${domain._id}
+
+
+ `; +} + +export default class DomainSelectAutoComplete extends AutoComplete { + static DOMAttachKey = 'vjDomainSelectAutoCompleteInstance'; + + constructor($dom, options) { + super($dom, { + classes: 'domain-select', + items: getItems, + render: renderItem, + text: getText, + ...options, + }); + } +} + +_.assign(DomainSelectAutoComplete, DOMAttachedObject); diff --git a/ui/components/autocomplete/UserSelectAutoComplete.js b/ui/components/autocomplete/UserSelectAutoComplete.js new file mode 100644 index 000000000..080e1a731 --- /dev/null +++ b/ui/components/autocomplete/UserSelectAutoComplete.js @@ -0,0 +1,43 @@ +import _ from 'lodash'; +import tpl from 'vj/utils/tpl'; +import request from 'vj/utils/request'; +import DOMAttachedObject from 'vj/components/DOMAttachedObject'; +import AutoComplete from '.'; + +function getText(user) { + return user.uname; +} + +function getItems(val) { + return request.get('/user/search', { q: val }); +} + +function renderItem(user) { + return tpl` +
+
+ +
+
+
${user.uname}
+
UID = ${user._id}
+
+
+ `; +} + +export default class UserSelectAutoComplete extends AutoComplete { + static DOMAttachKey = 'vjUserSelectAutoCompleteInstance'; + + constructor($dom, options) { + super($dom, { + classes: 'user-select', + items: getItems, + render: renderItem, + text: getText, + ...options, + }); + } +} + +_.assign(UserSelectAutoComplete, DOMAttachedObject); diff --git a/ui/components/autocomplete/autocomplete.page.styl b/ui/components/autocomplete/autocomplete.page.styl new file mode 100644 index 000000000..cd631147f --- /dev/null +++ b/ui/components/autocomplete/autocomplete.page.styl @@ -0,0 +1,11 @@ +.drop-element.autocomplete + max-width: rem(250px) + + .empty-row + color: $autocomplete-empty-row-color + font-size: $(font-size-small) + padding: rem(10px) + + .menu + max-height: rem(250px) + overflow: auto diff --git a/ui/components/autocomplete/domainselectautocomplete.page.styl b/ui/components/autocomplete/domainselectautocomplete.page.styl new file mode 100644 index 000000000..bcd2a6f24 --- /dev/null +++ b/ui/components/autocomplete/domainselectautocomplete.page.styl @@ -0,0 +1,6 @@ +.menu.domain-select + width: rem(200px) + +.domain-select__id + font-size: rem($font-size-small) + color: $userselect-uid-color diff --git a/ui/components/autocomplete/index.js b/ui/components/autocomplete/index.js new file mode 100644 index 000000000..9fbb58c43 --- /dev/null +++ b/ui/components/autocomplete/index.js @@ -0,0 +1,202 @@ +import Drop from 'tether-drop'; +import _ from 'lodash'; +import 'jquery-scroll-lock'; + +import DOMAttachedObject from 'vj/components/DOMAttachedObject'; + +import i18n from 'vj/utils/i18n'; +import tpl from 'vj/utils/tpl'; +import zIndexManager from 'vj/utils/zIndexManager'; + +export default class AutoComplete extends DOMAttachedObject { + static DOMAttachKey = 'vjAutoCompleteInstance'; + + constructor($dom, options = {}) { + super($dom); + this.options = { + items: async () => [], + render: () => '', + text: () => null, + minChar: 1, + cache: true, + clearDefaultValue: true, + position: 'bottom left', + classes: '', + ...options, + }; + this.clear(this.options.clearDefaultValue); + this.menuShown = false; + this.cache = {}; + this.currentItems = []; + this.$menu = $(``); + this.$menu.scrollLock({ strict: false }); + this.$menu.on('mousedown', this.onMenuClick.bind(this)); + this.$menu.on('mousedown', '.menu__item', this.onItemClick.bind(this)); + this.dropInstance = new Drop({ + classes: 'autocomplete dropdown', + target: this.$dom[0], + content: this.$menu[0], + position: this.options.position, + constrainToWindow: false, + constrainToScrollParent: false, + openOn: false, + }); + this.dropInstance.on('open', this.onDropOpen.bind(this)); + this.attach(); + } + + clear(clearValue = true) { + if (clearValue) { + this.$dom.val(''); + } + this._value = null; + this.lastText = null; + } + + attach() { + this.$dom.on(`click.${this.eventNS}`, this.onClick.bind(this)); + this.$dom.on(`focus.${this.eventNS}`, this.onFocus.bind(this)); + this.$dom.on(`blur.${this.eventNS}`, this.onBlur.bind(this)); + this.$dom.on(`keydown.${this.eventNS}`, this.onKeyDown.bind(this)); + this.$dom.on(`keyup.${this.eventNS}`, this.onKeyUp.bind(this)); + } + + onClick() { + this.updateOpenState(); + } + + onFocus() { + this.isFocus = true; + this.updateOpenState(); + } + + onBlur() { + this.isFocus = false; + this.updateOpenState(); + } + + onKeyDown() { + // TODO: Implement keyboard navigation + } + + onKeyUp(ev) { + if (ev.which === 27) { + // ESC + this.close(); + return; + } + if (this.$dom.val() === this.lastText) { + return; + } + this.lastText = this.$dom.val(); + this.updateOpenState(); + if (this.isOpen) { + this.renderList(); + } + } + + onMenuClick(ev) { + ev.preventDefault(); // prevent from losing focus + } + + onItemClick(ev) { + const idx = $(ev.currentTarget).attr('data-idx'); + if (idx === undefined) { + return; + } + const item = this.currentItems[idx]; + const text = this.options.text(item); + this._value = item; + this.$dom.trigger('vjAutoCompleteSelect', item); + if (text != null) { + this.$dom.val(text); + } + this.close(); + } + + onDropOpen() { + $(this.dropInstance.drop).css('z-index', zIndexManager.getNext()); + } + + async getItems(val) { + if (this.cache[val] !== undefined) { + return this.cache[val]; + } + const data = await this.options.items(val); + if (this.options.cache) { + this.cache[val] = data; + } + return data; + } + + getHtml(items) { + if (items.length === 0) { + return tpl`
${i18n('Oops, there are no results.')}
`; + } + return items.map((item, idx) => ` + + `).join('\n'); + } + + async renderList() { + const val = this.$dom.val(); + const items = await this.getItems(val); + const html = this.getHtml(items); + this.currentItems = items; + this.$menu.html(html); + } + + open() { + if (this.isOpen) { + return; + } + this.dropInstance.open(); + this.isOpen = true; + } + + close() { + if (!this.isOpen) { + return; + } + this.dropInstance.close(); + this.isOpen = false; + } + + updateOpenState() { + if (this.isFocus && this.$dom.val().length >= this.options.minChar) { + if (!this.isOpen) { + this.open(); + this.renderList(); + } + } else { + if (this.isOpen) { + this.close(); + } + } + } + + detach() { + if (this.detached) { + return; + } + super.detach(); + this.$dom.off(`focus.${this.eventNS}`); + this.$dom.off(`blur.${this.eventNS}`); + this.$dom.off(`keydown.${this.eventNS}`); + this.$dom.off(`keyup.${this.eventNS}`); + this.dropInstance.destroy(); + this.$menu.remove(); + } + + value() { + return this._value; + } + + focus() { + this.$dom.focus(); + } +} + +_.assign(AutoComplete, DOMAttachedObject); diff --git a/ui/components/autocomplete/userselectautocomplete.page.styl b/ui/components/autocomplete/userselectautocomplete.page.styl new file mode 100644 index 000000000..2c0329d57 --- /dev/null +++ b/ui/components/autocomplete/userselectautocomplete.page.styl @@ -0,0 +1,6 @@ +.menu.user-select + width: rem(200px) + +.user-select__uid + font-size: rem($font-size-small) + color: $userselect-uid-color diff --git a/ui/components/calendar/calendar.page.styl b/ui/components/calendar/calendar.page.styl new file mode 100644 index 000000000..7606ad085 --- /dev/null +++ b/ui/components/calendar/calendar.page.styl @@ -0,0 +1,129 @@ +.calendar__header + line-height: rem(45px) + text-align: center + + h1 + display: inline-block + line-height: inherit + width: rem(280px) + + button + font-size: rem($font-size-title) + color: $text-3-color + padding: 0 rem(10px) + outline: 0 + + &:hover + color: $primary-color + +.calendar__week-title + table + width: 100% + + th + width: 14.28% + padding: rem(20px 10px) + color: $supplementary-color + +.calendar__row + position: relative + +.calendar__row__bg + position: absolute + left: 0 + top: 0 + width: 100% + height: 100% + + table + width: 100% + height: 100% + + td + width: 14.28% + border: 1px solid $table-border-color + + &.is-current-day + background: lighten($highlight-color, 85%) + +.calendar__row__content + min-height: rem(100px) + position: relative + z-index: 2 + padding-bottom: rem(10px) + + table + width: 100% + + th + width: 14.28% + padding: rem(10px) + color: $text-2-color + + &.is-inactive + opacity: 0.3 + + &.is-current-day + color: $highlight-color + + td + position: relative + height: rem(24px) + +.calendar__banner + position: absolute + display: block + top: rem(2px) + left: rem(5px) + right: rem(5px) + height: rem(20px) + line-height: rem(20px) + padding: rem(0 5px) + font-size: rem($font-size-small) + border-radius: rem(5px) + white-space: nowrap + overflow: hidden + text-overflow: ellipsis + + &, &:visited, &:hover, &:active + color: #FFF + text-decoration: none + + &.is-trunc-begin, &.is-snap-begin + border-top-left-radius: 0 + border-bottom-left-radius: 0 + + &.is-trunc-end, &.is-snap-end + border-top-right-radius: 0 + border-bottom-right-radius: 0 + + &.is-snap-begin + left: 0 + padding-left: rem(10px) + + &.is-snap-end + right: 0 + padding-right: rem(10px) + + &.is-masked + background-image: repeating-linear-gradient( + 45deg, + rgba(#000, 0.1), + rgba(#000, 0.1) 10px, + rgba(#000, 0) 10px, + rgba(#000, 0) 20px + ); + + for key, value in $calendar-banner-color + &.color-{key} + background-color: value + +.calendar__body-container + position: relative + +.calendar__body.exit + position: absolute + left: 0 + top: 0 + width: 100% + user-select: none diff --git a/ui/components/calendar/index.js b/ui/components/calendar/index.js new file mode 100644 index 000000000..3cd464d1f --- /dev/null +++ b/ui/components/calendar/index.js @@ -0,0 +1,367 @@ +import _ from 'lodash'; +import moment from 'moment'; +import tpl from 'vj/utils/tpl'; + +export default class Calendar { + constructor(events) { + this.$dom = $(tpl` +
+
+ +

+ +
+
+ + + + + + + + + + +
SUNMONTUEWEDTHUFRISAT
+
+
+
+ `); + this.events = events.map(ev => ({ + ...ev, + beginAt: moment(ev.beginAt), + endAt: moment(ev.endAt), + maskFrom: ev.maskFrom ? moment(ev.maskFrom) : null, + })); + this.$dom.find('[name="prev"]').click(() => this.navToPrev()); + this.$dom.find('[name="next"]').click(() => this.navToNext()); + this.$lastBody = null; + this.navToToday(); + } + + getDom() { + return this.$dom; + } + + navToToday() { + if (this.animating) { + return; + } + this.current = moment().date(1); + this.update(); + } + + navToNext() { + if (this.animating) { + return; + } + this.current.add('months', 1); + this.update(1); + } + + navToPrev() { + if (this.animating) { + return; + } + this.current.subtract('months', 1); + this.update(-1); + } + + update(direction = 0) { + this.updateHeader(); + this.updateBody(direction); + } + + updateHeader() { + this.$dom.find('.calendar__header__title').text(this.current.format('MMMM YYYY')); + } + + async updateBody(direction) { + this.animating = true; + const $newBody = this.buildBody(); + $newBody.appendTo(this.$dom.find('.calendar__body-container')); + if (this.$lastBody !== null) { + this.$lastBody + .addClass('exit') + .transition({ + y: direction * 100, + opacity: 0, + }, { + duration: 500, + easing: 'easeOutCubic', + }); + await $newBody + .css({ + y: -direction * 100, + opacity: 0, + }) + .transition({ + y: 0, + opacity: 1, + }, { + duration: 500, + easing: 'easeOutCubic', + }) + .promise(); + this.$lastBody.remove(); + } + this.$lastBody = $newBody; + this.animating = false; + } + + buildBody() { + const data = this.buildBodyData(); + const $body = $('
'); + data.forEach((week) => { + const $row = $(tpl`
+
+
+
`); + const $bgContainer = $row.find('.calendar__row__bg tr'); + const $numContainer = $row.find('.calendar__row__content thead tr'); + const $bannerContainer = $row.find('.calendar__row__content tbody'); + week.days.forEach((day) => { + const isInactive = day.active ? '' : 'is-inactive'; + const isCurrentDay = day.current ? 'is-current-day' : ''; + const today = day.current ? ' (TODAY)' : ''; + $bgContainer.append($('').addClass(isInactive).addClass(isCurrentDay)); + $numContainer.append($(tpl`${day.date.format('D')}${today}`).addClass(isInactive).addClass(isCurrentDay)); + }); + week.banners.forEach((banners) => { + const $tr = $(''); + banners.forEach((bannerSpan) => { + if (!bannerSpan.banner) { + $tr.append(tpl``); + return; + } + const $cell = $(tpl``); + const $banner = $(tpl` + ${bannerSpan.banner.mask ? bannerSpan.banner.event.maskTitle : bannerSpan.banner.event.title} + `); + if (bannerSpan.banner.mask) { + $banner.addClass('is-masked'); + } + if (bannerSpan.banner.beginTrunc) { + $banner.addClass('is-trunc-begin'); + } else if (bannerSpan.banner.beginSnap) { + $banner.addClass('is-snap-begin'); + } + if (bannerSpan.banner.endTrunc) { + $banner.addClass('is-trunc-end'); + } else if (bannerSpan.banner.endSnap) { + $banner.addClass('is-snap-end'); + } + $cell.append($banner); + $tr.append($cell); + }); + $bannerContainer.append($tr); + }); + $body.append($row); + }); + return $body; + } + + buildBodyData() { + const now = moment(); + const days = []; + { + // back fill + const base = this.current.clone(); + const dayOfWeek = base.day(); + if (dayOfWeek > 0) { + base.subtract(dayOfWeek + 1, 'days'); + for (let i = dayOfWeek; i > 0; --i) { + days.push({ + active: false, + date: base.add(1, 'days').clone(), + }); + } + } + } + { + // current month + const base = this.current.clone(); + while (base.month() === this.current.month()) { + days.push({ + active: true, + date: base.clone(), + }); + base.add(1, 'days'); + } + } + { + // forward fill + const base = this.current.clone().add(1, 'months').subtract(1, 'days'); + const dayOfWeek = base.day(); + if (dayOfWeek < 6) { + for (let i = dayOfWeek; i < 6; ++i) { + days.push({ + active: false, + date: base.add(1, 'days').clone(), + }); + } + } + } + + days.forEach((day) => { + day.current = day.date.isSame(now, 'day'); // eslint-disable-line no-param-reassign + }); + + const daysByWeek = _.chunk(days, 7); + + const numberOfWeeks = days.length / 7; + const bannersByWeek = _.fill(new Array(numberOfWeeks), 1).map(() => []); + const beginDate = days[0].date.clone(); + const endDate = _.last(days).date.clone(); + + // cut events by week to banners + this.events.forEach((ev) => { + if (ev.endAt.isBefore(ev.beginAt, 'day')) { + return; + } + if (ev.endAt.isBefore(beginDate, 'day') || ev.beginAt.isAfter(endDate, 'day')) { + return; + } + if (ev.beginAt.hour() >= 22) { + ev.beginAt.add(1, 'day').startOf('day'); + } + if (ev.endAt.hour() <= 2) { + ev.endAt.subtract(1, 'day').endOf('day'); + } + let [bannerBegin, bannerBeginTruncated] = [ev.beginAt.clone(), false]; + if (bannerBegin.isBefore(beginDate, 'day')) { + [bannerBegin, bannerBeginTruncated] = [beginDate.clone(), true]; + } + do { + const bannerEndMax = bannerBegin.clone().endOf('week'); + let [bannerEnd, bannerEndTruncated] = [ev.endAt.clone(), false]; + if (bannerEnd.isAfter(bannerEndMax, 'day')) { + [bannerEnd, bannerEndTruncated] = [bannerEndMax, true]; + } + const weekIndex = bannerBegin.clone().startOf('day').diff(beginDate.clone().startOf('day'), 'week'); + bannersByWeek[weekIndex].push({ + beginAt: bannerBegin.startOf('day'), + beginTrunc: bannerBeginTruncated, + endAt: bannerEnd.endOf('day'), + endTrunc: bannerEndTruncated, + event: ev, + }); + if (!bannerEndTruncated) { + break; + } + [bannerBegin, bannerBeginTruncated] = [bannerEnd.clone().add(1, 'day'), true]; + } while (!bannerBegin.isAfter(endDate, 'day')); + }); + + // layout banners + const layout = bannersByWeek + .map(banners => _ + .sortBy(banners, [ + banner => banner.beginAt.valueOf(), + banner => (banner.beginTrunc ? 0 : 1), // truncated events first + banner => -banner.endAt.valueOf(), // long events first + ])) + .map((banners) => { + const dayBitmap = _ + .fill(new Array(7), 1) + .map(() => []); + banners.forEach((banner) => { + const beginDay = banner.beginAt.day(); + const endDay = banner.endAt.day(); + // find available space + const vIndexMax = _.max(_ + .range(beginDay, endDay + 1) + .map(day => dayBitmap[day].length)); + let vIndex = 0; + for (; vIndex < vIndexMax; ++vIndex) { + if (_.every(_ + .range(beginDay, endDay + 1) + .map(day => !dayBitmap[day][vIndex]) // eslint-disable-line no-loop-func + )) { // eslint-disable-line function-paren-newline + break; + } + } + // fill space + for (let i = beginDay; i <= endDay; ++i) { + dayBitmap[i][vIndex] = banner; + } + }); + // merge adjacent cells and arrange banners by vertical index + const vMaxLength = _.max(_.range(0, 7).map(day => dayBitmap[day].length)); + const weekBanners = _ + .fill(new Array(vMaxLength), 1) + .map(() => []); + for (let vIndex = 0; vIndex < vMaxLength; ++vIndex) { + let last = { span: 1, banner: dayBitmap[0][vIndex] }; + weekBanners[vIndex].push(last); + for (let day = 1; day < 7; ++day) { + const banner = dayBitmap[day][vIndex]; + if (banner !== last.banner) { + last = { span: 1, banner }; + weekBanners[vIndex].push(last); + } else { + last.span++; + } + } + } + // cut banners by masked areas, scanning from left to right + weekBanners.forEach((bannerSpans) => { + for (let i = 0; i < bannerSpans.length; ++i) { + const { banner } = bannerSpans[i]; + if (!banner) { + continue; + } + if (banner.mask) { + continue; + } + if (!banner.event.maskFrom) { + continue; + } + if (banner.event.maskFrom.isSame(banner.event.endAt)) { + // do not show masks if maskFrom === endAt + continue; + } + if (banner.event.endAt.isSame(banner.event.beginAt, 'day')) { + // do not show masks if endAt - beginAt <= 1 day + continue; + } + if (banner.event.maskFrom.isAfter(banner.endAt, 'day')) { + // we are not in the time region for masking + continue; + } + if (banner.event.maskFrom.isSameOrBefore(banner.beginAt, 'day')) { + // mask begins before this banner: replace current banner with masked banner + banner.mask = true; + } else { + // mask begins during this banner: cut current banner into two pieces + const newBanner = { + ...banner, + beginAt: banner.event.maskFrom.clone(), + beginSnap: true, + beginTrunc: false, + mask: true, + }; + const newBannerSpan = { + span: newBanner.endAt.day() - newBanner.beginAt.day() + 1, + banner: newBanner, + }; + banner.endAt = banner.event.maskFrom.clone().subtract(1, 'day'); + banner.endSnap = true; + bannerSpans[i].span -= newBannerSpan.span; // eslint-disable-line no-param-reassign + bannerSpans.splice(i + 1, 0, newBannerSpan); + i++; + } + } + }); + return weekBanners; + }); + return daysByWeek + .map((daysInWeek, weekIndex) => ({ + days: daysInWeek, + banners: layout[weekIndex], + })); + } +} diff --git a/ui/components/cmeditor/cmeditor.page.js b/ui/components/cmeditor/cmeditor.page.js new file mode 100644 index 000000000..107411869 --- /dev/null +++ b/ui/components/cmeditor/cmeditor.page.js @@ -0,0 +1,23 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; +import delay from 'vj/utils/delay'; +import CmEditor from '.'; + +import 'vj-simplemde/src/css/simplemde.css'; +import './cmeditor.styl'; + +function runSubstitute($container) { + const selector = ['textarea[data-markdown]']; + $container.find(selector.join(', ')).get().forEach((element) => { + CmEditor.getOrConstruct($(element)); + }); +} + +const cmEditorPage = new AutoloadPage('cmEditorPage', () => { + runSubstitute($('body')); + $(document).on('vjContentNew', async (e) => { + await delay(0); + runSubstitute($(e.target)); + }); +}); + +export default cmEditorPage; diff --git a/ui/components/cmeditor/cmeditor.styl b/ui/components/cmeditor/cmeditor.styl new file mode 100644 index 000000000..6c00da3f4 --- /dev/null +++ b/ui/components/cmeditor/cmeditor.styl @@ -0,0 +1,91 @@ +.simplemde + border: 1px solid $editor-border-color + margin: 0 0 1rem + position: relative + height: rem(200px) + box-sizing: border-box + overflow: hidden + +.cm-s-simplemde + border: 0 + min-height: 0 + height: auto + padding: 0 + position: absolute + left: 0 + top: 40px + width: 100% + bottom: 0 + color: inherit + +.simplemde-toolbar + position: absolute + left: 0 + top: 0 + width: 100% + border-radius: 0 + border: 0 + opacity: 0 + background: $toolbar-bg + transform: translateY(-20px) + transition: opacity .5s, transform .5s + transition-timing-function: ease-out-cubic + + &:hover + opacity: 1 + +.toolbar--visible .simplemde-toolbar + opacity: 1 + transform: translateY(0) + +.cm-s-simplemde .CodeMirror-scroll + height: 100% + min-height: 0 + font-family: $code-font-family + color: $text-1-color + +.simplemde-toolbar:before, +.simplemde-toolbar:after + display: none + +.simplemde-toolbar + padding: rem(5px) + +.simplemde-toolbar i.separator + border-right: 0 + +.simplemde-toolbar a + color: $toolbar-fore !important + border: 0 + background: none + border-radius: 0 + font-size: rem($font-size-icon) + outline: 0 + + &:hover + background: $toolbar-bg-hover + color: $toolbar-fore-hover !important + border: 0 + + &.active + background: $toolbar-bg-selected + color: $toolbar-fore-selected !important + border: 0 + +.simplemde-toolbar.disabled-for-preview a:not(.no-disable) + background: none + opacity: $toolbar-disabled-opacity + +.cm-s-simplemde .CodeMirror-code .cm-comment + background: none + +.simplemde-statusbar + display: none + +.simplemde-preview + background: #FFF + +.no-heading .cm-s-simplemde .CodeMirror-code + .cm-header-1, .cm-header-2, .cm-header-3, .cm-header-4 + font-size: 1em + line-height: 1.5 diff --git a/ui/components/cmeditor/index.js b/ui/components/cmeditor/index.js new file mode 100644 index 000000000..bf6cea053 --- /dev/null +++ b/ui/components/cmeditor/index.js @@ -0,0 +1,66 @@ +import _ from 'lodash'; +import DOMAttachedObject from 'vj/components/DOMAttachedObject'; + +export default class CmEditor extends DOMAttachedObject { + static DOMAttachKey = 'vjCmEditorInstance'; + + constructor($dom, options = {}) { + super($dom); + this.editor = null; + this.options = options; + this.init(); + } + + async init() { + const { default: VjCmEditor } = await import('./vjcmeditor'); + + const hasFocus = this.$dom.is(':focus'); + const srcHeight = this.$dom.outerHeight(); + + this.editor = new VjCmEditor({ + ...this.options, + element: this.$dom.get(0), + }); + this.moveToEnd(); + + const $editor = $(this.editor.wrapper); + $editor.css('height', srcHeight); + $editor.addClass('toolbar--visible'); + + if (hasFocus) { + this.focus(); + } + } + + isValid() { + return (this.editor !== null); + } + + ensureValid() { + if (!this.isValid()) { + throw new Error('VjCmEditor is not loaded'); + } + } + + value(...argv) { + this.ensureValid(); + const ret = this.editor.value(...argv); + if (argv.length > 0) { + this.moveToEnd(); + } + return ret; + } + + focus() { + this.ensureValid(); + this.editor.codemirror.focus(); + } + + moveToEnd() { + this.ensureValid(); + const cm = this.editor.codemirror; + cm.setCursor(cm.lineCount(), 0); + } +} + +_.assign(CmEditor, DOMAttachedObject); diff --git a/ui/components/cmeditor/textareaHandler.js b/ui/components/cmeditor/textareaHandler.js new file mode 100644 index 000000000..c959c4d83 --- /dev/null +++ b/ui/components/cmeditor/textareaHandler.js @@ -0,0 +1,32 @@ +import _ from 'lodash'; +import DOMAttachedObject from 'vj/components/DOMAttachedObject'; +import CmEditor from '.'; + +export default class TextareaHandler extends DOMAttachedObject { + static DOMAttachKey = 'vjTextareaHandlerInstance'; + + getCmEditor() { + return CmEditor.get(this.$dom); + } + + isCmEditor() { + const editor = this.getCmEditor(); + return (editor !== undefined && editor.isValid()); + } + + val(...argv) { + if (this.isCmEditor()) { + return this.getCmEditor().value(...argv); + } + return this.$dom.val(...argv); + } + + focus() { + if (this.isCmEditor()) { + this.getCmEditor().focus(); + } + this.$dom.focus(); + } +} + +_.assign(TextareaHandler, DOMAttachedObject); diff --git a/ui/components/cmeditor/vjcmeditor.js b/ui/components/cmeditor/vjcmeditor.js new file mode 100644 index 000000000..67935e959 --- /dev/null +++ b/ui/components/cmeditor/vjcmeditor.js @@ -0,0 +1,129 @@ +import _ from 'lodash'; +import SimpleMDE from 'vj-simplemde'; + +import 'codemirror/mode/clike/clike'; +import 'codemirror/mode/pascal/pascal'; +import 'codemirror/mode/python/python'; +import 'codemirror/mode/php/php'; +import 'codemirror/mode/rust/rust'; +import 'codemirror/mode/haskell/haskell'; +import 'codemirror/mode/javascript/javascript'; +import 'codemirror/mode/go/go'; +import 'codemirror/mode/ruby/ruby'; + +import request from 'vj/utils/request'; +import i18n from 'vj/utils/i18n'; + +export default class VjCmEditor extends SimpleMDE { + constructor(options = {}) { + super({ + autoDownloadFontAwesome: false, + spellChecker: false, + forceSync: true, + toolbar: [ + { + name: 'bold', + action: SimpleMDE.toggleBold, + className: 'icon icon-bold', + title: i18n('Bold'), + }, + { + name: 'italic', + action: SimpleMDE.toggleItalic, + className: 'icon icon-italic', + title: i18n('Italic'), + }, + '|', + { + name: 'quote', + action: SimpleMDE.toggleBlockquote, + className: 'icon icon-quote', + title: i18n('Quote'), + }, + { + name: 'unordered-list', + action: SimpleMDE.toggleUnorderedList, + className: 'icon icon-unordered_list', + title: i18n('Unordered List'), + }, + { + name: 'ordered-list', + action: SimpleMDE.toggleOrderedList, + className: 'icon icon-ordered_list', + title: i18n('Ordered List'), + }, + '|', + { + name: 'code', + action: () => this.insertCodeBlock(), + className: 'icon icon-code', + title: i18n('Insert Code'), + default: true, + }, + { + name: 'link', + action: SimpleMDE.drawLink, + className: 'icon icon-link', + title: i18n('Create Link'), + default: true, + }, + { + name: 'image', + action: SimpleMDE.drawImage, + className: 'icon icon-insert--image', + title: i18n('Insert Image'), + default: true, + }, + '|', + { + name: 'preview', + action: SimpleMDE.togglePreview, + preAction: SimpleMDE.preRenderPreview, + className: 'icon icon-preview no-disable', + title: i18n('Toggle Preview'), + default: true, + }, + ], + commonmark: { + safe: true, + }, + ...options, + }); + } + + async markdown(text) { + const data = await request.ajax({ + url: '/preview', + method: 'post', + data: $.param({ text }, true), + dataType: 'text', + }); + _.defer(this.preparePreview.bind(this)); + return data; + } + + preparePreview() { + const $preview = $(this.wrapper).find('.simplemde-preview'); + $preview.addClass('typo'); + $preview.attr('data-emoji-enabled', 'true'); + $preview.trigger('vjContentNew'); + } + + insertCodeBlock() { + const text = this.codemirror.getSelection(); + const startPoint = this.codemirror.getCursor('start'); + const endPoint = this.codemirror.getCursor('end'); + const leadingLines = (startPoint.line === 0 && startPoint.ch === 0) ? 0 : 2; + // eslint-disable-next-line prefer-template + const startText = _.repeat('\n', leadingLines) + '```cpp\n'; + const endText = '\n```\n'; + this.codemirror.replaceSelection(`${startText}${text}${endText}`); + startPoint.line += leadingLines + 1; + startPoint.ch = 0; + if (startPoint !== endPoint) { + endPoint.line += leadingLines + 1; + } + this.codemirror.setSelection(startPoint, endPoint); + this.codemirror.focus(); + } +} diff --git a/ui/components/contest/contest.page.styl b/ui/components/contest/contest.page.styl new file mode 100644 index 000000000..7fd9ba71b --- /dev/null +++ b/ui/components/contest/contest.page.styl @@ -0,0 +1,34 @@ +.contest-type-tag +.contest-tag + font-size: rem($font-size-small) + display: inline-block + line-height: rem(22px) + padding: rem(0 10px) + vertical-align: middle + border-radius: rem(12px) + + &:hover + text-decoration: none + color: #FFF !important + +.contest-type-tag + &, &:visited + &, .supplementary & + color: #FFF + + .icon + margin-right: rem(5px) + +for key, value in $contest-color + .contest-type--{key} .contest-type-tag + background: value + + &:hover + background: lighten(value, 20%) + +.contest-tag + border: 1px solid $supplementary-border-color + + &:hover + background: $primary-color + border-color: $primary-color diff --git a/ui/components/contest/contest_sidebar.page.styl b/ui/components/contest/contest_sidebar.page.styl new file mode 100644 index 000000000..8e684f686 --- /dev/null +++ b/ui/components/contest/contest_sidebar.page.styl @@ -0,0 +1,21 @@ +.contest-sidebar__bg + display: block + background: #67AABB url(problem-contest-bg.png) right top no-repeat + color: #FFF !important + font-size: rem($font-size) + padding: rem(20px 0) + + +retina() + background-image: url(problem-contest-bg@2x.png) + background-size: 131px 150px + + h1 + font-size: rem($font-size-title) + color: #FFF + text-shadow: 0 1px 3px rgba(#000, 0.5) + + &:hover + text-decoration: none + + .contest-sidebar__status + margin-top: rem(20px) diff --git a/ui/components/contest/problem-contest-bg.png b/ui/components/contest/problem-contest-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..63ea08cad8de454b514defffe99a75dcf07ef6b5 GIT binary patch literal 4170 zcmV-Q5Vh}#P)CmUX48hb3Y8ejLRXV5IZaIp=rIy%yA0 z|M(tQV?3IPM+f@UzmF$Ze3#2>et0%unc;NU)xU|~VcX6ZI&pXwA~6^WsDG2I%VG(_ z9tq{c=W(ll6N;iB%XH`ntwX}4{!P3T*tjh8NT?d2fLHySl=G#|9idf7cvVNIj)o=+ zk?8Y#RK9~7b}%$qh=j+j+9yh-jvk>^Nci1OH9zjKQFNi$BcVQB`&7Pzg9V4Ba*u?1 z3F}n(4xJ87Rw2=+&L>

L6F>kNFwA{ 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 U>S)tK3;+NC07*qoM6N<$f`%!$ApigX literal 0 HcmV?d00001 diff --git a/ui/components/contest/problem-contest-bg@2x.png b/ui/components/contest/problem-contest-bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..16272e1af71a0bdd7f477d22ce2b4df4ed37b66d GIT binary patch literal 8618 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 V5DLss$oDKz6y??A>SfHr{~w+*HeCP! literal 0 HcmV?d00001 diff --git a/ui/components/datepicker/datepicker.page.js b/ui/components/datepicker/datepicker.page.js new file mode 100644 index 000000000..597b1f061 --- /dev/null +++ b/ui/components/datepicker/datepicker.page.js @@ -0,0 +1,26 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; + +import 'pickadate/lib/themes/classic.css'; +import 'pickadate/lib/themes/classic.date.css'; +import 'pickadate/lib/themes/classic.time.css'; +import './datepicker.styl'; + +const datepickerPage = new AutoloadPage('datepickerPage', async () => { + if ($('[data-pick-date]').length > 0) { + await import('pickadate/lib/picker.date'); + $('[data-pick-date]').pickadate({ + format: 'yyyy-m-d', + clear: false, + }); + } + if ($('[data-pick-time]').length > 0) { + await import('pickadate/lib/picker.time'); + $('[data-pick-time]').pickatime({ + format: 'H:i', + interval: 15, + clear: false, + }); + } +}); + +export default datepickerPage; diff --git a/ui/components/datepicker/datepicker.styl b/ui/components/datepicker/datepicker.styl new file mode 100644 index 000000000..16e60db05 --- /dev/null +++ b/ui/components/datepicker/datepicker.styl @@ -0,0 +1,54 @@ +.picker__holder + margin-top: -1rem + border-radius: 0 + transform: scale(0.9) translateZ(0) + transform-origin: 0 0 + outline: 0 + font-size: rem($font-size-secondary) + transition: transform .1s ease-in-out, + opacity .1s ease-in-out, + max-height 0s .1s, + border-width 0s .1s + +.picker--opened .picker__holder + transform: scale(1) translateZ(0) + transition: transform .1s ease-in-out, + opacity .1s ease-in-out, + max-height 0s, + border-width 0s + box-shadow: $data-picker-shadow + +.picker__list + padding: 0 + +.picker__list-item + border: 0 + +.picker__list-item:hover + background: $datapicker-list-item-bg-color-hover + +.picker__list-item--selected, .picker__list-item--selected:hover, .picker--focused .picker__list-item--selected + background: $primary-color + +.picker__day--infocus:hover, .picker__day--outfocus:hover + background: $datapicker-list-item-bg-color-hover + +.picker__day--highlighted + border-color: transparent + +.picker__day--highlighted:hover, .picker--focused .picker__day--highlighted + background: transparent + +.picker__day--selected, .picker__day--selected:hover, .picker--focused .picker__day--selected + background: $primary-color + +.picker__button--today:hover, .picker__button--clear:hover, .picker__button--close:hover + background: $datapicker-list-item-bg-color-hover + border-color: $datapicker-list-item-bg-color-hover + +.picker__button--today:focus, .picker__button--clear:focus, .picker__button--close:focus + background: $datapicker-list-item-bg-color-hover + border-color: $datapicker-list-item-bg-color-hover + +.picker__nav--prev:hover, .picker__nav--next:hover + background: $datapicker-list-item-bg-color-hover diff --git a/ui/components/dialog/DomDialog.js b/ui/components/dialog/DomDialog.js new file mode 100644 index 000000000..a401f143e --- /dev/null +++ b/ui/components/dialog/DomDialog.js @@ -0,0 +1,145 @@ +import _ from 'lodash'; +import DOMAttachedObject from 'vj/components/DOMAttachedObject'; + +import zIndexManager from 'vj/utils/zIndexManager'; + +export default class DomDialog extends DOMAttachedObject { + static DOMAttachKey = 'vjDomDialogInstance'; + + constructor($dom, options = {}) { + super($dom); + this.isShown = false; + this.isAnimating = false; + this.options = { + cancelByClickingBack: false, + cancelByEsc: false, + onDispatch: () => {}, + ...options, + }; + this._defer = null; + } + + async _show() { + this.$dom.css('z-index', zIndexManager.getNext()); + this.$dom.trigger('vjDomDialogShow'); + this.isAnimating = true; + + if (this.options.cancelByClickingBack) { + this.$dom.on(`click.${this.eventNS}`, this.handleClick.bind(this)); + } + if (this.options.cancelByEsc) { + $(document).on(`keyup.${this.eventNS}`, this.handleKeyUp.bind(this)); + } + + const $wrap = this.$dom; + $wrap.css({ + display: 'flex', + opacity: 0, + }); + $wrap.width(); + $wrap.transition({ + opacity: 1, + }, { + duration: 100, + easing: 'easeOutCubic', + }); + + const $dgContent = this.$dom.find('.dialog__content'); + $dgContent.css({ + scale: 0.8, + }); + await $dgContent + .transition({ + scale: 1, + }, { + duration: 200, + easing: 'easeOutCubic', + }) + .promise(); + + this.$dom.find('[data-autofocus]').focus(); + + this.isShown = true; + this.isAnimating = false; + this.$dom.trigger('vjDomDialogShown'); + } + + async _hide() { + this.$dom.trigger('vjDomDialogHide'); + this.isAnimating = true; + + $(document).off(`keyup.${this.eventNS}`); + this.$dom.off(`click.${this.eventNS}`); + + this.$dom.css({ + opacity: 1, + }); + this.$dom.transition({ + opacity: 0, + }, { + duration: 200, + }); + + const $dgContent = this.$dom.find('.dialog__content'); + $dgContent.css({ + scale: 1, + }); + await $dgContent + .transition({ + scale: 0.8, + }, { + duration: 200, + easing: 'easeOutCubic', + }) + .promise(); + + this.$dom.css('display', 'none'); + + this.isShown = false; + this.isAnimating = false; + this.$dom.trigger('vjDomDialogHidden'); + } + + show() { + if (this.isShown || this.isAnimating) { + return Promise.reject(); + } + this._defer = new $.Deferred(); + this._show(); + return this._defer.promise(); + } + + hide() { + if (!this.isShown || this.isAnimating) { + return false; + } + if (this._defer.state() === 'pending') { + this._defer.resolve('cancel'); + } + this._defer = null; + this._hide(); + return true; + } + + dispatchAction(data) { + if (this.options.onDispatch(data) === false) { + return; + } + this._defer.resolve(data); + this.hide(); + } + + handleClick(e) { + if (e.target === this.$dom.get(0)) { + this.dispatchAction('cancel'); + } + } + + handleKeyUp(e) { + if (e.keyCode === 27) { + this.dispatchAction('cancel'); + } + } +} + +_.assign(DomDialog, DOMAttachedObject); diff --git a/ui/components/dialog/dialog.page.styl b/ui/components/dialog/dialog.page.styl new file mode 100644 index 000000000..b4a5da94e --- /dev/null +++ b/ui/components/dialog/dialog.page.styl @@ -0,0 +1,38 @@ +.dialog + position: fixed + left: 0 + top: 0 + width: 100% + height: 100% + opacity: 0 + z-index: 1000 // managed + // display flex will be added after animation completes + flex-direction: column + align-items: center + justify-content: center + display: none + background: $dialog-layer-bg-color + +.dialog__content + position: relative + +.dialog.withBg .dialog__content + background: $dialog-bg-color + border: 1px solid $dialog-border-color + box-shadow: $dialog-shadow + min-width: rem(500px) + max-width: rem(900px) + padding: rem(40px) rem(30px) + +.dialog__body + margin-bottom: rem(20px) + min-height: rem(50px) + + h1 + font-size: 1.6rem + color: $dialog-title-color + margin-bottom: 1rem + +.dialog__action button + margin-left: rem(10px) + margin-bottom: 0 diff --git a/ui/components/dialog/index.js b/ui/components/dialog/index.js new file mode 100644 index 000000000..af635b938 --- /dev/null +++ b/ui/components/dialog/index.js @@ -0,0 +1,94 @@ +import tpl from 'vj/utils/tpl'; +import i18n from 'vj/utils/i18n'; +import DomDialog from './DomDialog'; + +export default class Dialog { + constructor(options = {}) { + this.options = { + classes: '', + $body: null, + $action: null, + ...options, + }; + this.$dom = $(tpl` +

+ `); + this.$dom.on('click', '[data-action]', this.handleActionButton.bind(this)); + this.$dom.on('vjDomDialogShow', this.beforeShow.bind(this)); + this.$dom.on('vjDomDialogHidden', this.afterHide.bind(this)); + this.$dom.find('.dialog__body').append(this.options.$body); + this.$dom.find('.dialog__action').append(this.options.$action); + this.domDialogInstance = new DomDialog(this.$dom, this.options); + } + + beforeShow() { + this.$dom.appendTo('body'); + } + + afterHide() { + this.$dom.detach(); + } + + open() { + return this.domDialogInstance.show(); + } + + close() { + return this.domDialogInstance.hide(); + } + + handleActionButton(ev) { + this.domDialogInstance.dispatchAction($(ev.currentTarget).attr('data-action')); + } +} + +const buttonOk = tpl``; +const buttonCancel = tpl``; +const buttonYes = tpl``; +const buttonNo = tpl``; + +export class InfoDialog extends Dialog { + constructor(options = {}) { + super({ + $action: buttonOk, + cancelByClickingBack: true, + cancelByEsc: true, + ...options, + }); + } +} + +export class ActionDialog extends Dialog { + constructor(options = {}) { + super({ + $action: [buttonCancel, buttonOk].join('\n'), + cancelByClickingBack: true, + cancelByEsc: true, + ...options, + }); + } +} + +export class ConfirmDialog extends Dialog { + constructor(options = {}) { + let buttons = []; + if (options.canCancel) { + buttons = [buttonCancel, buttonNo, buttonYes]; + } else { + buttons = [buttonNo, buttonYes]; + } + super({ + $action: buttons.join('\n'), + cancelByClickingBack: options.canCancel, + cancelByEsc: options.canCancel, + ...options, + }); + } +} diff --git a/ui/components/discussion/CommentBox.js b/ui/components/discussion/CommentBox.js new file mode 100644 index 000000000..84b588d68 --- /dev/null +++ b/ui/components/discussion/CommentBox.js @@ -0,0 +1,113 @@ +import _ from 'lodash'; +import DOMAttachedObject from 'vj/components/DOMAttachedObject'; +import request from 'vj/utils/request'; +import TextareaHandler from 'vj/components/cmeditor/textareaHandler'; +import Notification from 'vj/components/notification'; + +let initialized = false; +const $template = $('.dczcomments__box').eq(0).clone(); + +function getClosestInstance($dom) { + return $dom.closest('.dczcomments__box').data('instance'); +} + +function onBoxCancel(ev) { + const commentBox = getClosestInstance($(ev.currentTarget)); + if (commentBox) { + commentBox.onCancel(ev); + } +} + +function onBoxSubmit(ev) { + const commentBox = getClosestInstance($(ev.currentTarget)); + if (commentBox) { + commentBox.onSubmit(ev); + } + ev.preventDefault(); +} + +function init() { + if (initialized) { + return; + } + $(document).on('submit', '[name="dczcomments__box__form"]', onBoxSubmit); + $(document).on('vjCommentBoxCancel', '[name="dczcomments__box__form"]', onBoxCancel); + $(document).on('click', '[name="dczcomments__box__cancel"]', onBoxCancel); + initialized = true; +} + +export default class CommentBox extends DOMAttachedObject { + static DOMAttachKey = 'vjCommentBoxInstance'; + + constructor($dom, options = {}) { + super($dom); + init(); // delay initialize + this.$box = $template.clone(); + this.$box.data('instance', this); + this.options = { + initialText: null, + mode: null, + form: null, + onCancel: () => null, + ...options, + }; + if (this.options.initialText) { + this.setText(this.options.initialText); + } + if (this.options.mode) { + const submitButton = this.$box.find('.dczcomments__box__submit'); + submitButton.val(submitButton.attr(`data-value-${this.options.mode}`)); + } + } + + getTextareaHandler() { + const $textarea = this.$box.find('textarea'); + return TextareaHandler.getOrConstruct($textarea); + } + + focus() { + this.getTextareaHandler().focus(); + return this; + } + + setText(text) { + this.getTextareaHandler().val(text); + return this; + } + + getText() { + return this.getTextareaHandler().val(); + } + + insertText(text) { + const handler = this.getTextareaHandler(); + handler.val(handler.val() + text); + return this; + } + + appendTo($dom) { + this.$box.appendTo($dom); + this.$box.trigger('vjContentNew'); + return this; + } + + async onSubmit() { + try { + await request.post('', { + ...this.options.form, + content: this.getText(), + }); + window.location.reload(); + } catch (error) { + Notification.error(error.message); + } + } + + async onCancel(ev) { + await this.options.onCancel(ev); + this.$box.remove(); + this.detach(); + } +} + +_.assign(CommentBox, DOMAttachedObject); diff --git a/ui/components/discussion/comments.page.js b/ui/components/discussion/comments.page.js new file mode 100644 index 000000000..b17483ec3 --- /dev/null +++ b/ui/components/discussion/comments.page.js @@ -0,0 +1,206 @@ +import 'jquery.easing'; + +import { AutoloadPage } from 'vj/misc/PageLoader'; +import CommentBox from 'vj/components/discussion/CommentBox'; +import { ConfirmDialog } from 'vj/components/dialog'; + +import delay from 'vj/utils/delay'; +import { slideDown, slideUp } from 'vj/utils/slide'; +import request from 'vj/utils/request'; +import i18n from 'vj/utils/i18n'; +import tpl from 'vj/utils/tpl'; + +const $replyTemplate = $('.commentbox-container').eq(0).clone(); + +function createReplyContainer($parent) { + const $container = $replyTemplate + .clone() + .hide() + .prependTo($parent.find('.commentbox-reply-target').eq(0)) + .trigger('vjContentNew'); + return $container.find('.commentbox-placeholder'); +} + +async function showReplyContainer($parent) { + const $container = $parent.find('.commentbox-container'); + // TODO: fix ugly hack. cannot get $container rect because it is invisible + const rect = $container.parent()[0].getBoundingClientRect(); + const rectBody = document.body.getBoundingClientRect(); + if (rect.top < 100 || rect.top + 100 > window.innerHeight) { + const targetScrollTop = rect.top - rectBody.top - window.innerHeight * 0.382; + $('html, body').stop().animate({ scrollTop: targetScrollTop }, 400, 'easeOutCubic'); + await delay(300); + // delay duration is set smaller than animation duration intentionally + } + $container.css('opacity', 0); + await slideDown($container, 300); + await $container.transition({ opacity: 1 }, { duration: 200 }).promise(); + $container.removeAttr('style'); +} + +async function destroyReplyContainer($parent) { + const $container = $parent.find('.commentbox-container'); + $container.css('opacity', 1); + await $container.transition({ opacity: 0 }, { duration: 200 }).promise(); + await slideUp($container, 300); + $container.remove(); +} + +function onClickDummyBox(ev) { + const $evTarget = $(ev.currentTarget); + + if (CommentBox.get($evTarget)) { + CommentBox + .get($evTarget) + .focus(); + return; + } + + const $mediaBody = $evTarget.closest('.media__body'); + + const opt = { + form: JSON.parse($evTarget.attr('data-form')), + mode: 'comment', + onCancel: () => { + $mediaBody.removeClass('is-editing'); + }, + }; + + $mediaBody.addClass('is-editing'); + + CommentBox + .getOrConstruct($evTarget, opt) + .appendTo($mediaBody.find('.commentbox-placeholder').eq(0)) + .focus(); +} + +async function onCommentClickReplyComment(ev, options = {}) { + const $evTarget = $(ev.currentTarget); + + if (CommentBox.get($evTarget)) { + // If comment box is already expanded, + // we should insert "initialText" + CommentBox + .get($evTarget) + .insertText(options.initialText || '') + .focus(); + return; + } + + const $mediaBody = $evTarget.closest('.media__body'); + + const opt = { + initialText: '', + mode: 'reply', + ...options, + onCancel: async () => { + await destroyReplyContainer($mediaBody); + }, + }; + + const cbox = CommentBox + .getOrConstruct($evTarget, { + form: JSON.parse($evTarget.attr('data-form')), + ...opt, + }) + .appendTo(createReplyContainer($mediaBody)); + await showReplyContainer($mediaBody); + cbox.focus(); +} + +async function onCommentClickReplyReply(ev) { + const $evTarget = $(ev.currentTarget); + const $mediaBody = $evTarget.closest('.media__body'); + const username = $mediaBody + .find('.user-profile-name').eq(0) + .text(); + + $evTarget + .closest('.dczcomments__item') + .find('[name="dczcomments__op-reply-comment"]').eq(0) + .trigger('click', { initialText: `@${username}: ` }); +} + +async function onCommentClickEdit(mode, ev) { + const $evTarget = $(ev.currentTarget); + + if (CommentBox.get($evTarget)) { + CommentBox + .get($evTarget) + .focus(); + return; + } + + const $mediaBody = $evTarget.closest('.media__body'); + + const raw = await request.get( + $mediaBody.find('.typo').eq(0).attr('data-raw-url'), + {}, + { dataType: 'text' }, + ); + + const opt = { + initialText: raw, + form: JSON.parse($evTarget.attr('data-form')), + mode, + onCancel: () => { + $mediaBody.removeClass('is-editing'); + }, + }; + + $mediaBody.addClass('is-editing'); + + CommentBox + .getOrConstruct($evTarget, opt) + .appendTo($mediaBody.find('.commentbox-edit-target').eq(0)) + .focus(); +} + +function onCommentClickEditComment(ev) { + return onCommentClickEdit('comment-update', ev); +} + +function onCommentClickEditReply(ev) { + return onCommentClickEdit('reply-update', ev); +} + +async function onCommentClickDelete(type, ev) { + const message = (type === 'comment') + ? 'Confirm deleting this comment? Its replies will be deleted as well.' + : 'Confirm deleting this reply?'; + const action = await new ConfirmDialog({ + $body: tpl` +
+

${i18n(message)}

+
`, + }).open(); + if (action !== 'yes') { + return; + } + + const $evTarget = $(ev.currentTarget); + const form = JSON.parse($evTarget.attr('data-form')); + + await request.post('', form); + window.location.reload(); +} + +function onCommentClickDeleteComment(ev) { + onCommentClickDelete('comment', ev); +} + +function onCommentClickDeleteReply(ev) { + onCommentClickDelete('reply', ev); +} + +const commentsPage = new AutoloadPage('commentsPage', () => { + $(document).on('click', '[name="dczcomments__dummy-box"]', onClickDummyBox); + $(document).on('click', '[name="dczcomments__op-reply-comment"]', onCommentClickReplyComment); + $(document).on('click', '[name="dczcomments__op-reply-reply"]', onCommentClickReplyReply); + $(document).on('click', '[name="dczcomments__op-edit-comment"]', onCommentClickEditComment); + $(document).on('click', '[name="dczcomments__op-edit-reply"]', onCommentClickEditReply); + $(document).on('click', '[name="dczcomments__op-delete-comment"]', onCommentClickDeleteComment); + $(document).on('click', '[name="dczcomments__op-delete-reply"]', onCommentClickDeleteReply); +}); + +export default commentsPage; diff --git a/ui/components/discussion/comments.page.styl b/ui/components/discussion/comments.page.styl new file mode 100644 index 000000000..4cb8106bc --- /dev/null +++ b/ui/components/discussion/comments.page.styl @@ -0,0 +1,125 @@ +$upvote-color = green +$downvote-color = red + +.dczcomments__item .is-editing + [name="dczcomments__dummy-box"] + display: none + > .typo + display: none + +.dczcomments__box .textbox + height: rem(180px) + resize: vertical + +.textbox[name="dczcomments__dummy-box"] + height: rem(60px) + resize: none + font-size: rem($font-size-title) + color: $comment-placeholder-color + padding: rem(10px) + +.dczcomments__item, +.dczcomments__reply + border-top: 1px solid $table-border-color + + >.media + padding: rem(20px 0) + + &:first-child + border-top: 0 + +.dczcomments__reply + &:last-child + >.media + padding-bottom: 0 + +.dczcomments__supplementary + float: left + margin-bottom: rem(5px) + +.dczcomments__operations + font-size: rem($font-size) + float: right + vertical-align: top + color: $comment-op-color + + a, a:visited + color: $comment-op-link-color + margin-left: rem(3px) + a:hover + color: $primary-color + text-decoration: none + +.view--solution .dczcomments__replies + margin-left: rem(50px) + +.dczcomments__item + .vote-number + width: rem(82px) + text-align: center + font-size: rem(25px) + font-weight: 300 + margin-bottom: rem(10px) + + .vote-op + position: relative + border: 1px solid transparent + border-radius: rem(14px) + transition: border-color .2s linear, opacity .2s linear + opacity: 0.5 + + &>form + width: rem(40px) + float: left + position: relative + + &:hover .vote-op + opacity: 1 + border-color: $supplementary-border-color + + .vote-button + appearance: none + border: 0 + background: none + width: 100% + outline: 0 + font-size: rem($font-size-icon) + line-height: rem(26px) + color: #AAA + transition: color .2s linear, background-color .2s linear, box-shadow .2s linear + + &.upvote + border-radius: rem(13px 0 0 13px) + padding-left: rem(7px) + + &:hover + background: $upvote-color + color: #FFF + box-shadow: 0 2px 10px rgba($upvote-color, 0.4) + + &.active + color: $upvote-color + + + &.downvote + border-radius: rem(0 13px 13px 0) + padding-right: rem(7px) + + &:hover + background: $downvote-color + color: #FFF + box-shadow: 0 2px 10px rgba($downvote-color, 0.4) + + &.active + color: $downvote-color + + &.active + background: transparent !important + box-shadow: none !important + cursor: default + + ++mobile() + .dczcomments__item + .media__left + display: none diff --git a/ui/components/discussion/discussion.page.styl b/ui/components/discussion/discussion.page.styl new file mode 100644 index 000000000..387ea3a4d --- /dev/null +++ b/ui/components/discussion/discussion.page.styl @@ -0,0 +1,17 @@ +.discussion-node-tag + font-size: rem($font-size-small) + display: inline-block + line-height: rem(22px) + padding: rem(0 10px) + vertical-align: middle + border-radius: rem(12px) + border: 1px solid $supplementary-border-color + + &:hover + background: $primary-color + color: #FFF !important + text-decoration: none + border-color: $primary-color + + .icon + margin-right: rem(5px) diff --git a/ui/components/drop/drop.page.styl b/ui/components/drop/drop.page.styl new file mode 100644 index 000000000..a5b964884 --- /dev/null +++ b/ui/components/drop/drop.page.styl @@ -0,0 +1,40 @@ +.drop-element, +.drop-element:after, +.drop-element:before, +.drop-element *, +.drop-element *:after, +.drop-element *:before + box-sizing: border-box + +.drop-element + position: absolute + display: none + opacity: 0 + transition: opacity .1s ease-in-out + z-index: 1000 // managed + + &.drop-open + display: block + + &.drop-open-transitionend + display: block + + &.drop-after-open + opacity: 1 + +.drop-target-attached-top.drop-target-attached-left .drop-content + transform-origin: -10% 110% +.drop-target-attached-top.drop-target-attached-center .drop-content + transform-origin: 50% 110% +.drop-target-attached-top.drop-target-attached-right .drop-content + transform-origin: 110% 110% +.drop-target-attached-bottom.drop-target-attached-left .drop-content + transform-origin: -10% -10% +.drop-target-attached-bottom.drop-target-attached-center .drop-content + transform-origin: 50% -10% +.drop-target-attached-bottom.drop-target-attached-right .drop-content + transform-origin: 110% -10% +.drop-target-attached-center.drop-target-attached-right .drop-content + transform-origin: -10% 50% +.drop-target-attached-center.drop-target-attached-left .drop-content + transform-origin: 110% 50% diff --git a/ui/components/dropdown/Dropdown.js b/ui/components/dropdown/Dropdown.js new file mode 100644 index 000000000..9b48a8b1e --- /dev/null +++ b/ui/components/dropdown/Dropdown.js @@ -0,0 +1,55 @@ +import Drop from 'tether-drop'; +import _ from 'lodash'; +import DOMAttachedObject from 'vj/components/DOMAttachedObject'; +import responsiveCutoff from 'vj/breakpoints.json'; + +import zIndexManager from 'vj/utils/zIndexManager'; +import { isBelow } from 'vj/utils/mediaQuery'; + +export default class Dropdown extends DOMAttachedObject { + static DOMAttachKey = 'vjDropdownInstance'; + + static DOMAttachSelector = '[data-dropdown-target]'; + + constructor($dom, options = {}) { + if ($dom.attr('data-dropdown-trigger-desktop-only') !== undefined) { + if (isBelow(responsiveCutoff.mobile)) { + super(null); + return; + } + } + super($dom); + this.options = { + target: null, + position: $dom.attr('data-dropdown-pos') || 'bottom left', + ...options, + }; + this.dropInstance = new Drop({ + target: $dom[0], + classes: 'dropdown', + content: this.options.target || $.find($dom.attr('data-dropdown-target'))[0], + position: this.options.position, + openOn: 'hover', + constrainToWindow: true, + constrainToScrollParent: false, + }); + this.dropInstance.on('open', this.onDropOpen.bind(this)); + this.dropInstance.on('close', this.onDropClose.bind(this)); + } + + detach() { + super.detach(); + this.dropInstance.destroy(); + } + + onDropOpen() { + $(this.dropInstance.drop).css('z-index', zIndexManager.getNext()); + this.$dom.trigger('vjDropdownShow'); + } + + onDropClose() { + this.$dom.trigger('vjDropdownHide'); + } +} + +_.assign(Dropdown, DOMAttachedObject); diff --git a/ui/components/dropdown/dropdown.page.js b/ui/components/dropdown/dropdown.page.js new file mode 100644 index 000000000..a1d2587b1 --- /dev/null +++ b/ui/components/dropdown/dropdown.page.js @@ -0,0 +1,8 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; +import Dropdown from './Dropdown'; + +const dropdownPage = new AutoloadPage('dropdownPage', () => { + Dropdown.registerLifeCycleHooks(); +}); + +export default dropdownPage; diff --git a/ui/components/dropdown/dropdown.page.styl b/ui/components/dropdown/dropdown.page.styl new file mode 100644 index 000000000..6cac894cc --- /dev/null +++ b/ui/components/dropdown/dropdown.page.styl @@ -0,0 +1,24 @@ +.dropdown-target + display: none + +.drop .dropdown-target + display: block + +.dropdown + .menu + min-width: rem(150px) + box-shadow: $menu-drop-shadow + background: $menu-drop-bg-color + font-size: rem($font-size-small) + + .menu__link + padding: rem(8px 10px) + +.dropdown + .drop-content + transition: transform .1s ease-in-out + transform: scale(0.9) translateZ(0) + + &.drop-after-open + .drop-content + transform: scale(1) translateZ(0) diff --git a/ui/components/emoji/emoji.page.styl b/ui/components/emoji/emoji.page.styl new file mode 100644 index 000000000..7991fd566 --- /dev/null +++ b/ui/components/emoji/emoji.page.styl @@ -0,0 +1,6 @@ +.emoji + width: 1em + height: 1em + display: inline-block + background-size: contain + vertical-align: baseline diff --git a/ui/components/emoji/emojify.page.js b/ui/components/emoji/emojify.page.js new file mode 100644 index 000000000..b911fe28b --- /dev/null +++ b/ui/components/emoji/emojify.page.js @@ -0,0 +1,21 @@ +import emojify from 'emojify.js'; + +import { AutoloadPage } from 'vj/misc/PageLoader'; + +function runEmojify($container) { + if ($container.is('[data-emoji-enabled]')) { + emojify.run($container[0]); + return; + } + $container.find('[data-emoji-enabled]').get().forEach(element => emojify.run(element)); +} + +const emojifyPage = new AutoloadPage('emojifyPage', () => { + emojify.setConfig({ + img_dir: `${UiContext.cdn_prefix}img/emoji`, + }); + runEmojify($('body')); + $(document).on('vjContentNew', e => runEmojify($(e.target))); +}); + +export default emojifyPage; diff --git a/ui/components/footer/footer.page.js b/ui/components/footer/footer.page.js new file mode 100644 index 000000000..0019581d8 --- /dev/null +++ b/ui/components/footer/footer.page.js @@ -0,0 +1,31 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; +import { isBelow } from 'vj/utils/mediaQuery'; +import { slideUp, slideDown } from 'vj/utils/slide'; +import responsiveCutoff from 'vj/breakpoints.json'; + +const footerPage = new AutoloadPage('footerPage', () => { + if ($('.footer').length === 0) { + return; + } + $('.footer__category.expandable > h1').click(async (ev) => { + if (!isBelow(responsiveCutoff.mobile)) { + return; + } + const $category = $(ev.currentTarget).closest('.footer__category'); + const $list = $category.find('.footer__category__expander'); + if ($category.hasClass('animating')) { + return; + } + $category.addClass('animating'); + if ($category.hasClass('expanded')) { + $category.removeClass('expanded'); + await slideUp($list, 300, { opacity: 1 }, { opacity: 0 }); + } else { + $category.addClass('expanded'); + await slideDown($list, 300, { opacity: 0 }, { opacity: 1 }); + } + $category.removeClass('animating'); + }); +}); + +export default footerPage; diff --git a/ui/components/footer/footer.page.styl b/ui/components/footer/footer.page.styl new file mode 100644 index 000000000..517bf4b9b --- /dev/null +++ b/ui/components/footer/footer.page.styl @@ -0,0 +1,94 @@ +$footer-extra-link-gap = 20px + +.footer + background: $footer-bg-color + color: $text-1-color + + h1 + font-size: rem($font-size-title) + + +mobile() + padding: rem($grid-padding) + cursor: pointer + font-size: rem($font-size-secondary) + +.footer__category + padding-top: rem(30px) + padding-bottom: rem(50px) + + +mobile() + padding-top: rem($grid-padding) + padding-bottom: rem($grid-padding) + border-bottom: 1px solid darken($footer-bg-color, 5%) + + &.expandable + padding: 0 + + .expand-icon + display: none + + +mobile() + display: inline-block + + &.expanded .expand-icon + transform: rotate(180deg) + +.footer__category__list + margin-top: rem(10px) + margin-bottom: rem(10px) + font-size: rem($font-size-small) + line-height: 2 + + +mobile() + margin-top: 0 + padding-left: rem($grid-padding) + padding-right: rem($grid-padding) + +.footer__category__expander + +mobile() + display: none + + +above(rupture.mobile-cutoff) + display: block !important + +.footer__extra-left + float: left + +.footer__extra-right + float: right + +.footer__extra-link + padding: rem(20px 0) + font-size: rem($font-size-small) + +.footer__extra-link-item + float: left + line-height: 2 + +.footer__extra-left .footer__extra-link-item + margin-right: rem($footer-extra-link-gap) + +.footer__extra-right .footer__extra-link-item + margin-left: rem($footer-extra-link-gap) + +.layout--immersive + .footer + background: none + color: #FFF + + a, a:visited, a:active + color: #FFF + + a:hover + color: #FFF + ++mobile() + .footer__extra-left, .footer__extra-right + float: none + display: block + + .footer__extra-link-item + float: none + display: inline-block + margin-left: 0 + margin-right: $footer-extra-link-gap diff --git a/ui/components/form/button.page.styl b/ui/components/form/button.page.styl new file mode 100644 index 000000000..fc4064cd0 --- /dev/null +++ b/ui/components/form/button.page.styl @@ -0,0 +1,82 @@ +@import './var.inc.styl' + +.button + font-size: rem($font-size-secondary) + line-height: rem($form-control-height - 2) + background-color: lighten($default-color, 50%) + border: 1px solid $default-color + height: rem($form-control-height) + padding: rem(0 25px) + display: inline-block + outline: 0 + margin: 0 0 1rem + transition: background-color .2s, box-shadow .5s + transition-timing-function: ease-out-sine + cursor: pointer + user-select: none + + &, &:visited, &:hover + &, .typo & + color: $text-1-color + + &:hover, &:focus + text-decoration: none + + &:not(.disabled) + &:hover, &:focus + background-color: darken($default-color, 5%) + border-color: darken($default-color, 5%) + box-shadow: 0 4px 15px rgba(darken($default-color, 10%), 0.5) + + &:focus + border-color: $input-focus-color + + &.expanded + padding-left: 0 + padding-right: 0 + text-align: center + width: 100% + + &.rounded + border-radius: rem($form-control-height / 2) + + &.primary + border-color: $primary-color + background-color: $primary-color + + &, &:visited, &:hover + &, .typo & + color: #FFF + + &:not(.disabled) + &:hover + background-color: lighten(saturate($primary-color, 30%), 10%) + border-color: saturate($primary-color, 70%) + box-shadow: 0 4px 15px rgba(saturate($primary-color, 70%), 0.3) + + &.disabled + cursor: default + opacity: 0.5 + + &.compact + margin-bottom: 0 + height: rem($compact-control-height) + line-height: rem($compact-control-height - 2) + padding: rem(0 15px) + +.button.inverse + line-height: rem($form-control-height - 4) + border: 2px solid #FFF + background: none + + &, &:visited + &, .typo & + color: #FFF + + &:not(.disabled) + &:hover, &:focus + border-color: $immersive-primary-color + background: none + box-shadow: none + &, .typo & + color: $immersive-primary-color diff --git a/ui/components/form/checkbox.page.styl b/ui/components/form/checkbox.page.styl new file mode 100644 index 000000000..889e85591 --- /dev/null +++ b/ui/components/form/checkbox.page.styl @@ -0,0 +1,90 @@ +@import './var.inc.styl' + +$checkbox-size = 16px + +.checkbox + font-size: rem($font-size-secondary) + line-height: 1.4 + border: 0 + display: inline-block + vertical-align: middle + cursor: pointer + user-select: none + color: lighten($text-1-color, 30%) + margin: $input-margin + padding: ((rem($form-control-height) - (@line-height * @font-size)) / 2) 0 + + &:hover + color: $text-1-color + + input + appearance: none + border: 1px solid #D0D0D0 + display: inline-block + border-radius: 1px + vertical-align: top + width: rem($checkbox-size) + height: rem($checkbox-size) + margin: ((@line-height * @font-size - rem($checkbox-size)) / 2) 0 + margin-right: rem(5px) + position: relative + outline: 0 + transition: background .1s linear + background: none + cursor: pointer + + &:after + content: '' + width: rem(10px) + height: rem(6px) + position: absolute + top: rem(3px) + left: rem(2px) + border: 2px solid #FFF + border-top: none + border-right: none + background: transparent + transform: rotate(-65deg) scale(0.5) + opacity: 0 + + &:enabled:hover + border-color: rgba($secondary-color, 0.7) + + &:checked + background: $secondary-color + border-color: $secondary-color + + &:checked:after + opacity: 1 + transform: rotate(-45deg) + + &:disabled + opacity: 0.5 + + &.compact + margin-bottom: 0 + line-height: 1.2 + padding: ((rem($compact-control-height) - (@line-height * @font-size)) / 2) 0 + + input + margin: ((@line-height * @font-size - rem($checkbox-size)) / 2) 0 + margin-right: rem(5px) + +label.checkbox.inverse + color: rgba($immersive-text-color, 0.8) + + input + color: $immersive-text-color + border-color: rgba($immersive-text-color, 0.4) + + &:disabled, &:read-only + color: rgba($immersive-text-color, 0.6) + + &:enabled:read-write:hover + border-color: rgba($immersive-text-color, 0.8) + + &:enabled:read-write:focus + border-color: $immersive-primary-color + + &.focus + color: $immersive-primary-color diff --git a/ui/components/form/form.page.js b/ui/components/form/form.page.js new file mode 100644 index 000000000..1e78cf45b --- /dev/null +++ b/ui/components/form/form.page.js @@ -0,0 +1,15 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; + +const formPage = new AutoloadPage('formPage', () => { + $(document).on('vjFormDisableUpdate', 'input, select, textarea', (ev) => { + const $input = $(ev.currentTarget); + const $formItem = $input.closest('.form__item'); + if ($input.prop('disabled')) { + $formItem.addClass('is--disabled'); + } else { + $formItem.removeClass('is--disabled'); + } + }); +}); + +export default formPage; diff --git a/ui/components/form/form.page.styl b/ui/components/form/form.page.styl new file mode 100644 index 000000000..8ab99bd06 --- /dev/null +++ b/ui/components/form/form.page.styl @@ -0,0 +1,199 @@ +// Extracted from Foundation framework + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ +button, +input, +optgroup, +select, +textarea + color: inherit + /* 1 */ + font: inherit + /* 2 */ + margin: 0 + /* 3 */ + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ +button + overflow: visible + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ +button, +select + text-transform: none + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] + appearance: button + /* 2 */ + cursor: pointer + /* 3 */ + +/** + * Re-set default cursor for disabled elements. + */ +button[disabled], +html input[disabled] + cursor: not-allowed + +/** + * Remove inner padding and border in Firefox 4+. + */ +button::-moz-focus-inner, +input::-moz-focus-inner + border: 0 + padding: 0 + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ +input + line-height: normal + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ +input[type="checkbox"], +input[type="radio"] + box-sizing: border-box + /* 1 */ + padding: 0 + /* 2 */ + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button + height: auto + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. + */ +input[type="search"] + appearance: textfield + /* 1 */ + box-sizing: content-box + /* 2 */ + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration + -webkit-appearance: none + +/** + * Define consistent border, margin, and padding. + * [NOTE] We don't enable this ruleset in Foundation, because we want the
element to have plain styling. + */ +/* fieldset + border: 1px solid #c0c0c0 + margin: 0 2px + padding: 0.35em 0.625em 0.75em + */ +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ +legend + border: 0 + /* 1 */ + padding: 0 + /* 2 */ + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ +textarea + overflow: auto + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ +optgroup + font-weight: bold + +.form--inline + display: inline + +textarea + height: auto + border-radius: 0px + resize: vertical + +select + width: 100% + border-radius: 0px + +button + appearance: none + background: transparent + padding: 0 + border: 0 + border-radius: 0px + line-height: 1 + +[data-whatinput='mouse'] button + outline: 0 + +label + display: block + margin: 0 + font-size: rem($font-size-secondary) + line-height: 1.8 + color: $label-color + + input, textarea, select + display: block + +.help-text + margin-top: -0.5rem + margin-bottom: 1rem + font-size: rem($font-size-small) + color: $help-text-color + +.form__item + transition: opacity .1s linear + + &.is--disabled + opacity: 0.3 + + :disabled + opacity: 1 diff --git a/ui/components/form/multiSelectCheckbox.page.js b/ui/components/form/multiSelectCheckbox.page.js new file mode 100644 index 000000000..e1128370d --- /dev/null +++ b/ui/components/form/multiSelectCheckbox.page.js @@ -0,0 +1,45 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; + +const lastSelectionByGroup = {}; + +function isInGroup(group) { + return (idx, element) => element.getAttribute('data-checkbox-group') === group; +} + +function onRangeRoleCheckboxClick(ev) { + const $current = $(ev.currentTarget); + const targetGroup = $current.attr('data-checkbox-group'); + const $targets = $('[type="checkbox"]') + .filter(isInGroup(targetGroup)) + .filter(':visible') + .filter(':not(:disabled)'); + if (ev.shiftKey && lastSelectionByGroup[targetGroup]) { + const destCheck = lastSelectionByGroup[targetGroup].prop('checked'); + const from = $targets.index(lastSelectionByGroup[targetGroup]); + const to = $targets.index($current); + const start = Math.min(from, to); + const end = Math.max(from, to) + 1; + $targets + .slice(start, end) + .prop('checked', destCheck); + } + lastSelectionByGroup[targetGroup] = $current; +} + +function onToggleRoleCheckboxClick(ev) { + const $current = $(ev.currentTarget); + const targetGroup = $current.attr('data-checkbox-toggle'); + const $targets = $('[type="checkbox"]') + .filter(isInGroup(targetGroup)) + .filter(':visible') + .filter(':not(:disabled)'); + const destCheck = $current.prop('checked'); + $targets.prop('checked', destCheck); +} + +const multiSelectCheckboxPage = new AutoloadPage('multiSelectCheckboxPage', () => { + $(document).on('click', '[data-checkbox-range]', onRangeRoleCheckboxClick); + $(document).on('click', '[data-checkbox-toggle]', onToggleRoleCheckboxClick); +}); + +export default multiSelectCheckboxPage; diff --git a/ui/components/form/radiobox.page.styl b/ui/components/form/radiobox.page.styl new file mode 100644 index 000000000..e4a9ff6ff --- /dev/null +++ b/ui/components/form/radiobox.page.styl @@ -0,0 +1,62 @@ +@import './var.inc.styl' + +$radiobox-size = 16px + +.radiobox + display: block + font-size: rem($font-size-secondary) + line-height: 1.4 + border: 0 + cursor: pointer + user-select: none + color: lighten($text-1-color, 30%) + margin: $input-multi-line-margin + + &:hover + color: $text-1-color + + input + display: inline-block + +.radiobox-container + margin: $input-margin + +// Image Radio Box + +.radiobox.with-image + margin: $input-image-radio-margin + + .radiobox__image-container + cursor: pointer + border: 2px solid #DDD + transition: border-color .1s linear, opacity .1s linear + padding: 1px + overflow: hidden + position: relative + opacity: 0.7 + + &:hover + border: 2px solid $primary-color + opacity: 1 + + &:after + position: absolute + width: rem(20px) + height: rem(20px) + right: rem(-10px) + top: rem(-10px) + transform: translateX(10px) translateY(-10px) rotate(45deg) + background: $highlight-color + content: '' + transition: transform .1s ease-out-cubic + + input + visibility: hidden + position: absolute + + &:checked + .radiobox__image-container + border: 2px solid $highlight-color + opacity: 1 + + &:after + transform: rotate(45deg) diff --git a/ui/components/form/select.page.styl b/ui/components/form/select.page.styl new file mode 100644 index 000000000..125cdf03f --- /dev/null +++ b/ui/components/form/select.page.styl @@ -0,0 +1,29 @@ +@import './var.inc.styl' + +.select + form-styles() + padding-right: 1.1rem + background-color: $input-background-color + background-image: url('~vj/misc/icons/' + $icon-expand_more-file) + background-size: 16px 16px + background-position: right -1rem center + background-origin: content-box + background-repeat: no-repeat + outline: $input-outline + transition: outline-color .2s, border-color .2s + transition-timing-function: ease-out-cubic + + &:focus + border-color: $input-focus-border-color + outline: $input-focus-outline + outline-offset: 0 + + &:disabled + opacity: 0.5 + +.select-container.compact .select, .select.compact + margin-bottom: 0 + height: rem($compact-control-height) + line-height: rem($compact-control-height - 2) + padding-top: 0 + padding-bottom: 0 diff --git a/ui/components/form/textbox.page.js b/ui/components/form/textbox.page.js new file mode 100644 index 000000000..83207946a --- /dev/null +++ b/ui/components/form/textbox.page.js @@ -0,0 +1,20 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; + +const textboxPage = new AutoloadPage('textboxPage', () => { + $(document).on('focusin', '.textbox.material input', (ev) => { + $(ev.currentTarget).parent().addClass('focus'); + }); + + $(document).on('focusout', '.textbox.material input', (ev) => { + $(ev.currentTarget).parent().removeClass('focus'); + }); + + const $focusElement = $(document.activeElement); + if ($focusElement.prop('tagName') === 'INPUT' + && $focusElement.parent().is('.textbox.material') + ) { + $focusElement.focusin(); + } +}); + +export default textboxPage; diff --git a/ui/components/form/textbox.page.styl b/ui/components/form/textbox.page.styl new file mode 100644 index 000000000..feda6bc00 --- /dev/null +++ b/ui/components/form/textbox.page.styl @@ -0,0 +1,72 @@ +@import './var.inc.styl' + +// Normal Textbox +input.textbox, textarea.textbox + form-styles() + background-color: $input-background-color + outline: $input-outline + transition: outline-color .2s, border-color .2s + transition-timing-function: ease-out-cubic + + &:focus + border-color: $input-focus-border-color + outline: $input-focus-outline + outline-offset: 0 + + // Overwrite, for IE compatibility + &:read-only + outline: 0 + + &:disabled + opacity: 0.5 + +textarea.textbox + height: rem(200px) + +.data-table + input.textbox, textarea.textbox + margin-bottom: 0 + +// Material Textbox +label.textbox.material + input + form-styles() + border: 0 + background: none + outline: 0 + padding-left: 0 + padding-right: 0 + color: $text-1-color + border-bottom: 2px solid rgba($text-1-color, 0.4) + transition: border-color .2s ease-out-cubic + + &:disabled, &:read-only + color: rgba($text-1-color, 0.6) + + &:enabled:read-write:hover + border-color: rgba($text-1-color, 0.8) + + &:enabled:read-write:focus + border-color: $input-focus-border-color + + &.focus + color: $input-focus-border-color + +label.textbox.material.inverse + color: rgba($immersive-text-color, 0.8) + + input + color: $immersive-text-color + border-color: rgba($immersive-text-color, 0.4) + + &:disabled, &:read-only + color: rgba($immersive-text-color, 0.6) + + &:enabled:read-write:hover + border-color: rgba($immersive-text-color, 0.8) + + &:enabled:read-write:focus + border-color: $immersive-primary-color + + &.focus + color: $immersive-primary-color diff --git a/ui/components/form/var.inc.styl b/ui/components/form/var.inc.styl new file mode 100644 index 000000000..65117e174 --- /dev/null +++ b/ui/components/form/var.inc.styl @@ -0,0 +1,14 @@ +form-styles() + appearance: none + display: block + width: 100% + font-size: rem($font-size-secondary) + margin: $input-margin + height: rem($form-control-height) + line-height: 1.2 + padding: rem(5px) + border: $input-border + + &.inline + display: inline-block + width: auto diff --git a/ui/components/header/header-background.png b/ui/components/header/header-background.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4c578af67a6e7b81084ac19e70ba89b280b1a6 GIT binary patch literal 78873 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 z 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 E0DkOUX8-^I literal 0 HcmV?d00001 diff --git a/ui/components/header/header-logo-summer.png b/ui/components/header/header-logo-summer.png new file mode 100644 index 0000000000000000000000000000000000000000..eaf4fda4c4091f8accff9eaf1db53eac2b1e0cd2 GIT binary patch literal 9976 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 literal 0 HcmV?d00001 diff --git a/ui/components/header/header-logo-summer@2x.png b/ui/components/header/header-logo-summer@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ab84b54fade22a0bb35c1e7a7069dec8fca1dd GIT binary patch literal 22451 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

&hLpVDX*kJEe++S@WOJ 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 literal 0 HcmV?d00001 diff --git a/ui/components/header/header-logo@2x.png b/ui/components/header/header-logo@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..4ba9d36393d2d8d809c49746fee6a7924d4a29d3 GIT binary patch literal 13580 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 literal 0 HcmV?d00001 diff --git a/ui/components/header/header.page.styl b/ui/components/header/header.page.styl new file mode 100644 index 000000000..08290169e --- /dev/null +++ b/ui/components/header/header.page.styl @@ -0,0 +1,171 @@ +$header-gap-mini = ($header-bg-height-mini - $nav-item-height - $header-logo-height) / 2 +$header-gap-mini-domain = ($header-bg-height-mini - $nav-item-height - $header-logo-domain-lh - $header-logo-system-lh) / 2 + +.global-notification + padding: rem(20px 0) + background: #FFF + + &.warning + background: #ffe1a6 + +.header + position: relative + height: rem($header-bg-height) + background: #5eafca url(./header-background.png) no-repeat center top + background-size: cover + transition: height .5s + transition-timing-function: ease-out-cubic + overflow: hidden + +retina() + background-image: url(./header-background.png) + background-size: rem($header-bg-width $header-bg-height) + + &.mini + height: rem($header-bg-height-mini) + + +mobile() + background: #FFF + height: auto !important + .header__content + display: none + +.header__logo + display: block + width: rem($header-logo-width-real) + height: rem($header-logo-height + $header-gap-mini + $nav-item-height) + background: url(header-logo-summer.png) no-repeat + background-size: rem($header-logo-width-real) rem($header-logo-height-real) + background-position: 0 rem($header-gap-mini + $nav-item-height - ($header-logo-height-real - $header-logo-height)) + transition: transform .5s, opacity .5s + transition-timing-function: ease-out-cubic + transform-origin: 0 0 + opacity: 1 + +retina() + background-image: url(./header-logo-summer@2x.png) + +mobile() + display: inline-block + +.header__logo--domain + font-size: rem(40px) + margin-top: rem($header-gap-mini-domain + $nav-item-height) + height: rem($header-logo-domain-lh) + line-height: rem($header-logo-domain-lh) + + a + text-shadow: 1px 1px 5px rgba(#000, 0.4) + + &, &:hover, &:visited, &:link + color: #FFF + text-decoration: none + +.header__logo--system + line-height: rem($header-logo-system-lh) + color: #FFF + font-size: rem($font-size-small) + + a + opacity: 0.8 + + &, &:hover, &:visited, &:link + text-decoration: none + color: #FFF + + &:hover + opacity: 1 + text-decoration: underline + +.header--collapsed + + #panel + padding-top: $header-bg-height + + .header + position: absolute + left: 0 + top: 0 + width: 100% + height: 0 + + .header__logo + transform: scale(0) + opacity: 0 + +.location + position: absolute + left: 0 + bottom: 0 + width: 100% + height: rem($header-layer-height) + background: rgba(#000, 0.5) + + +mobile() + position: relative + height: auto + + .header__hamburger + display: none + + +mobile() + display: block + +.header.mini .location + display: none + +.location-path + color: rgba(#FFF, 0.3) + line-height: rem(30px) + margin-top: rem(10px) + a, a:visited + color: rgba(#FFF, 0.6) + a:hover + color: rgba(#FFF, 0.9) + +.location-current + color: #9ad4f1 + line-height: rem(40px) + white-space: nowrap + overflow: hidden + text-overflow: ellipsis + + +mobile() + color: #91fcff + font-size: 1.7rem + white-space: normal + +.header--mobile + display: none + +.header--mobile, .location + +mobile() + display: block + background: #56758f + color: #FFF + line-height: rem($nav-item-height) + font-size: rem($font-size-title) + padding: rem(10px 0) + + a, a:visited, a:hover + color: #FFF + +.header--mobile__domain.is--system + display: block + width: $nav-logo-width // no rem + height: $nav-logo-height // no rem + margin-top: rem(10px) + background: url('../navigation/nav-logo-small_light.png') no-repeat + +retina() + background: url('../navigation/nav-logo-small@2x_light.png') no-repeat + background-size: $nav-logo-width $nav-logo-height // no rem + +.header--mobile__system + margin-left: rem(10px) + font-size: rem($font-size-secondary) + + &, &:hover, &:visited + color: $supplementary-color + +.header__hamburger + background: none + border: 0 + border-radius: 0 + outline: 0 diff --git a/ui/components/highlighter/codemirror.page.styl b/ui/components/highlighter/codemirror.page.styl new file mode 100644 index 000000000..c18494ba8 --- /dev/null +++ b/ui/components/highlighter/codemirror.page.styl @@ -0,0 +1,12 @@ +@css { +span.cm-comment { color: #008000; } +span.cm-keyword, span.cm-variable-3 { line-height: 1em; color: #00f; } +span.cm-string { color: #a31515; } +span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } +span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } +span.cm-variable { color: black; } +span.cm-meta { color: #2b91af; } +span.cm-link { color: #3a3; } +.CodeMirror-activeline-background { background: #e8f2ff; } +.CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } +} diff --git a/ui/components/highlighter/highlighter.page.js b/ui/components/highlighter/highlighter.page.js new file mode 100644 index 000000000..297003b64 --- /dev/null +++ b/ui/components/highlighter/highlighter.page.js @@ -0,0 +1,14 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; + +const highlighterPage = new AutoloadPage('highlighterPage', () => { + import('./prismjs').then((module) => { + const prismjs = module.default; + function runHighlight($container) { + prismjs.highlightBlocks($container); + } + runHighlight($('body')); + $(document).on('vjContentNew', e => runHighlight($(e.target))); + }); +}); + +export default highlighterPage; diff --git a/ui/components/highlighter/highlighter.page.styl b/ui/components/highlighter/highlighter.page.styl new file mode 100644 index 000000000..b083d40ba --- /dev/null +++ b/ui/components/highlighter/highlighter.page.styl @@ -0,0 +1,122 @@ +/* + +VS theme by Andrew Lock + +https://github.com/PrismJS/prism-themes/blob/master/themes/prism-vs.css + +*/ + +pre, code + background: $syntax-hl-bg-color + +pre > code + background: none + line-height: 1.5 + +pre + position: relative + padding: rem(5px) + +code + color: $code-color + font-size: rem($font-size-secondary) + +pre > code + color: black + text-align: left + white-space: pre-wrap + word-spacing: normal + word-break: normal + tab-size: 4 + hyphens: none + +[data-syntax-hl-show-line-number] pre.line-numbers > code + white-space: pre + +.syntax-hl + .token + &.comment, &.prolog, &.doctype, &.cdata + color: #008000 + font-style: italic + &.namespace + opacity: 0.7 + &.string + color: #a31515 + &.punctuation, &.operator + color: #393A34 + &.url, &.symbol, &.number, &.boolean, &.inserted + color: #36acaa + &.atrule, &.keyword, &.attr-value, .language-autohotkey&.selector, .language-json&.boolean, .language-json&.number + color: #0000ff + &.function + color: #393A34 + &.deleted, .language-autohotkey&.tag + color: #9a050f + &.selector, .language-autohotkey&.keyword + color: #00009f + &.important, &.bold + font-weight: bold + &.italic + font-style: italic + &.class-name, .language-json&.property + color: #2B91AF + &.tag, &.selector + color: #800000 + &.attr-name, &.property, &.regex, &.entity + color: #ff0000 + &.directive.tag .tag + background: #ffff00 + color: #393A34 + &.macro + &, .token + color: #2b91af + &.builtin + color: #077 + + .toolbar + position: absolute + white-space: no-wrap + right: 0 + top: 0 + padding: rem(5px) + background: rgba($syntax-hl-bg-color, 0.8) + font-family: $primary-font-family + font-size: rem($font-size-small) + opacity: 0 + pointer-events: none + transition: opacity .1s linear + user-select: none + + &:hover .toolbar + opacity: 1 + pointer-events: all + +[data-syntax-hl-show-line-number] + pre + padding-left: 3.8em + counter-reset: linenumber + + pre > code + position: relative + + .line-numbers-rows + position: absolute + pointer-events: none + top: 0 + font-size: 100% + left: -3.8em + width: 3em + letter-spacing: -1px + user-select: none + + span + pointer-events: none + display: block + counter-increment: linenumber + + &:before + content: counter(linenumber) + color: #ddd + display: block + padding-right: 0.8em + text-align: right diff --git a/ui/components/highlighter/meta.js b/ui/components/highlighter/meta.js new file mode 100644 index 000000000..3939c94a8 --- /dev/null +++ b/ui/components/highlighter/meta.js @@ -0,0 +1,15 @@ +// The following content is extracted from: +// https://github.com/codemirror/CodeMirror/blob/master/mode/meta.js + +export default [ + { name: 'C', ext: ['c', 'h'] }, + { name: 'C++', ext: ['cpp', 'c++', 'cc', 'cxx', 'hpp', 'h++', 'hh', 'hxx'] }, + { name: 'Go', ext: ['go'] }, + { name: 'Haskell', ext: ['hs'] }, + { name: 'Java', ext: ['java'] }, + { name: 'JavaScript', ext: ['js'] }, + { name: 'Pascal', ext: ['p', 'pas'] }, + { name: 'PHP', ext: ['php', 'php3', 'php4', 'php5', 'php7', 'phtml'] }, + { name: 'Python', ext: ['BUILD', 'bzl', 'py', 'pyw'] }, + { name: 'Rust', ext: ['rs'] }, +]; diff --git a/ui/components/highlighter/prismjs.js b/ui/components/highlighter/prismjs.js new file mode 100644 index 000000000..da1d0e3a3 --- /dev/null +++ b/ui/components/highlighter/prismjs.js @@ -0,0 +1,72 @@ +/* + +To add a new language to highlight: +1. Add language in babel in package.json +2. Add new import statement in `components/cmeditor/vjcmeditor.js` +3. Add new import statement in `components/scratchpad/ScratchpadEditorContainer.js` +4. Add new meta data in `components/highlighter/meta.js` + + */ + +import Prism from 'prismjs'; + +import Clipboard from 'clipboard'; +import Notification from 'vj/components/notification'; +import i18n from 'vj/utils/i18n'; + +import languageMeta from './meta'; + +const languageExtMap = {}; + +// Map possible language names to Prism language name +languageMeta.forEach((meta) => { + for (let i = 0; i < meta.ext.length; ++i) { + if (Prism.languages[meta.ext[i]] !== undefined) { + // eslint-disable-next-line no-param-reassign + meta.target = meta.ext[i]; + break; + } + } + meta.ext.forEach((ext) => { + languageExtMap[ext] = meta.target; + }); +}); + +// Copy to Clipboard +Prism.plugins.toolbar.registerButton('copy-to-clipboard', (env) => { + const linkCopy = document.createElement('a'); + linkCopy.href = 'javascript:;'; // eslint-disable-line no-script-url + linkCopy.textContent = 'Copy'; + const clip = new Clipboard(linkCopy, { text: () => env.code }); + clip.on('success', () => { + Notification.success(i18n('Code copied to clipboard!'), 1000); + }); + clip.on('error', () => { + Notification.error(i18n('Copy failed :(')); + }); + return linkCopy; +}); + +const prismjsApiWrap = { + highlightBlocks: ($dom) => { + $dom.find('pre code').get().forEach((code) => { + const $pre = $(code).parent(); + $pre.addClass('syntax-hl'); + if ($pre.closest('[data-syntax-hl-show-line-number]')) { + $pre.addClass('line-numbers'); + } + // try to map the language name + const language = $(code).attr('class'); + const m = (language || '').trim().match(/^language-(.+)$/); + if (m && m[1]) { + const languageName = m[1].toLowerCase(); + if (languageExtMap[languageName]) { + $(code).attr('class', `language-${languageExtMap[languageName]}`); + } + } + Prism.highlightElement(code); + }); + }, +}; + +export default prismjsApiWrap; diff --git a/ui/components/homework/homework.page.styl b/ui/components/homework/homework.page.styl new file mode 100644 index 000000000..052463d17 --- /dev/null +++ b/ui/components/homework/homework.page.styl @@ -0,0 +1,4 @@ +.homework-status--text + for key, value in $homework-status-color + &.{key} + color: value diff --git a/ui/components/hotkey/hotkey.page.js b/ui/components/hotkey/hotkey.page.js new file mode 100644 index 000000000..a72341573 --- /dev/null +++ b/ui/components/hotkey/hotkey.page.js @@ -0,0 +1,80 @@ +import _ from 'lodash'; +import { AutoloadPage } from 'vj/misc/PageLoader'; + +const KEY_MAP = { + 10: 'enter', + 13: 'enter', + 27: 'esc', + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 112: 'f1', + 113: 'f2', + 114: 'f3', + 115: 'f4', + 116: 'f5', + 117: 'f6', + 118: 'f7', + 119: 'f8', + 120: 'f9', + 121: 'f10', + 122: 'f11', + 123: 'f12', +}; + +function isHotkeyMatch(sortedHotkeyArr, hotkeyStr) { + const hotkeyDefined = hotkeyStr.toLowerCase().split('+'); + return _.isEqual(sortedHotkeyArr, hotkeyDefined.sort()); +} + +function testElementHotkey(hotkey, $element, attr) { + if (!$element.is(':visible')) { + return; + } + String($element.attr(attr)) + .split(',') + .forEach((singleDef) => { + const [defStr, trigger] = singleDef.split(':'); + if (isHotkeyMatch(hotkey, defStr)) { + switch (trigger) { + case 'submit': + $element.closest('form').trigger('submit'); + break; + case undefined: + $element.trigger('click'); + break; + default: + $element.trigger(trigger); + break; + } + } + }); +} + +const hotkeyPage = new AutoloadPage('hotkeyPage', () => { + $(document).on('keydown', (ev) => { + const hotkey = ['alt', 'ctrl', 'shift'].filter(modifyKey => ev[`${modifyKey}Key`]); + if (ev.metaKey && !ev.ctrlKey) { + hotkey.push('ctrl'); + } + if (KEY_MAP[ev.which] !== undefined) { + hotkey.push(KEY_MAP[ev.which]); + } else { + hotkey.push(String.fromCharCode(ev.which).toLowerCase()); + } + hotkey.sort(); + + // Find all global hotkeys + $('[data-global-hotkey]').get().forEach((element) => { + testElementHotkey(hotkey, $(element), 'data-global-hotkey'); + }); + + // Find all local hotkeys + $(ev.target).parents('[data-hotkey]').get().forEach((element) => { + testElementHotkey(hotkey, $(element), 'data-hotkey'); + }); + }); +}); + +export default hotkeyPage; diff --git a/ui/components/katex/katex.page.js b/ui/components/katex/katex.page.js new file mode 100644 index 000000000..e7dd9a86a --- /dev/null +++ b/ui/components/katex/katex.page.js @@ -0,0 +1,16 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; + +import 'katex/dist/katex.min.css'; +import './katex.styl'; + +const katexPage = new AutoloadPage('katexPage', () => { + import('katex/dist/contrib/auto-render.min.js').then((renderKatex) => { + function runKatex($containers) { + $containers.get().forEach(container => renderKatex(container)); + } + runKatex($('.typo')); + $(document).on('vjContentNew', e => runKatex($(e.target).find('.typo'))); + }); +}); + +export default katexPage; diff --git a/ui/components/katex/katex.styl b/ui/components/katex/katex.styl new file mode 100644 index 000000000..bcc2a6009 --- /dev/null +++ b/ui/components/katex/katex.styl @@ -0,0 +1,2 @@ +.katex + font-size: 1em diff --git a/ui/components/loader/loader.page.styl b/ui/components/loader/loader.page.styl new file mode 100644 index 000000000..a243a9239 --- /dev/null +++ b/ui/components/loader/loader.page.styl @@ -0,0 +1,29 @@ +.loader-container + position: absolute + left: 0 + width: 100% + top: 0 + height: 100% + +.loader + text-indent: -9999em + border: rem(5px) solid rgba($primary-color, .2) + border-left: rem(5px) solid $primary-color + animation: load8 1.1s infinite linear + border-radius: 50% + width: rem(50px) + height: rem(50px) + margin-left: rem(-25px) + margin-top: rem(-25px) + left: 50% + top: 50% + position: absolute + +@keyframes load8 + 0% + transform: rotate(0deg) + + 100% + transform: rotate(360deg) + + diff --git a/ui/components/marker/Marker.js b/ui/components/marker/Marker.js new file mode 100644 index 000000000..c701edbaa --- /dev/null +++ b/ui/components/marker/Marker.js @@ -0,0 +1,193 @@ +import _ from 'lodash'; +import delay from 'vj/utils/delay'; +import Tooltip from 'vj/components/tooltip/Tooltip'; +import i18n from 'vj/utils/i18n'; + +const MARKER_ID = `marker_${Math.floor(Math.random() * 0xFFFFFF).toString(16)}`; +const MARKER_OFFSET = 20; +const MARKER_MAX_DISTANCE = 60; + +let markerInstance = null; + +function distanceToRect(px, py, rect) { + const cx = (rect.left + rect.right) / 2; + const cy = (rect.top + rect.bottom) / 2; + const dx = Math.max(Math.abs(px - cx) - (rect.right - rect.left) / 2, 0); + const dy = Math.max(Math.abs(py - cy) - (rect.bottom - rect.top) / 2, 0); + return Math.sqrt(dx * dx + dy * dy); +} + +class Marker { + static exists() { + return markerInstance && document.getElementById(MARKER_ID); + } + + constructor() { + if (Marker.exists()) { + return markerInstance; + } + if (markerInstance) { + markerInstance.destroy(); + } + this.$dom = $(` +

+
+
+
+
+ `) + .appendTo('body'); + this.$dom.find('.marker__toolbar').on('click', '.marker__action', this.onMarkerActionClick.bind(this)); + this.$dom.on('mousedown', this.onMarkerMouseDown.bind(this)); + this.isOpen = false; + this.bindedHandlers = false; + this._onKeyDown = this.onKeyDown.bind(this); + this._onScroll = _.throttle(this.onScroll.bind(this), 50); + this._onMouseDown = this.onMouseDown.bind(this); + this._onMouseMove = _.throttle(this.onMouseMove.bind(this), 50); + markerInstance = this; + } + + markSelection(color) { + const selection = window.getSelection(); + const range = selection.getRangeAt(0); + this.$container.attr('contentEditable', true); + if (range) { + // recover ranges + selection.removeAllRanges(); + selection.addRange(range); + } + if (!document.execCommand('HiliteColor', false, color)) { + document.execCommand('BackColor', false, color); + } + this.$container.removeAttr('contentEditable'); + if (range) { + // remove ranges after marking + selection.removeAllRanges(); + } + } + + showAtPosition($container, x, y) { + this.$container = $container; + this.$dom.css({ + display: 'block', + opacity: 0, + }); + const rect = this.$dom[0].getBoundingClientRect(); + this.$dom.css({ + left: x + MARKER_OFFSET, + top: y - (rect.bottom - rect.top) - MARKER_OFFSET, + }); + this.isOpen = true; + this.$dom.addClass('open'); + this.updateMarkerOpacity(x, y); + this.bindEventHandlersForClosing(); + } + + async close() { + if (!this.isOpen) { + return; + } + this.isOpen = false; + this.closeTooltipsImmediately(); + this.unbindEventHandlers(); + this.$dom + .css({ opacity: 0 }) + .removeClass('open'); + await delay(200); + if (!this.isOpen) { + this.$dom.hide(); + } + } + + closeTooltipsImmediately() { + const $elements = this.$dom.find('[data-tooltip]'); + $elements.get().forEach((element) => { + const $el = $(element); + const tooltipInstance = Tooltip.get($el); + if (tooltipInstance) { + tooltipInstance.detach(); + } + }); + } + + bindEventHandlersForClosing() { + if (this.bindedHandlers) { + return; + } + $(document).on('keydown', this._onKeyDown); + $(window).on('scroll', this._onScroll); + $(document).on('mousedown', this._onMouseDown); + $(document).on('mousemove', this._onMouseMove); + this.bindedHandlers = true; + } + + unbindEventHandlers() { + if (!this.bindedHandlers) { + return; + } + $(document).off('keydown', this._onKeyDown); + $(window).off('scroll', this._onScroll); + $(document).off('mousedown', this._onMouseDown); + $(document).off('mousemove', this._onMouseMove); + this.bindedHandlers = false; + } + + onMarkerActionClick(ev) { + const color = $(ev.currentTarget).attr('data-color'); + this.markSelection(color); + this.close(); + } + + onMarkerMouseDown(ev) { + ev.stopPropagation(); + ev.preventDefault(); + } + + onKeyDown() { + this.close(); + } + + onScroll() { + this.close(); + } + + onMouseMove(ev) { + this.updateMarkerOpacity(ev.clientX, ev.clientY); + } + + onMouseDown() { + this.close(); + } + + updateMarkerOpacity(x, y) { + const markerRect = this.$dom[0].getBoundingClientRect(); + const distance = distanceToRect(x, y, markerRect); + if (distance > MARKER_MAX_DISTANCE) { + this.close(); + return; + } + this.$dom.css('opacity', 1 - (distance / MARKER_MAX_DISTANCE)); + } + + destroy() { + this.close(); + this.$dom.remove(); + markerInstance = null; + } +} + +const MarkerInterface = { + close() { + if (!markerInstance) { + return; + } + markerInstance.close(); + }, + showAtPosition($container, x, y) { + const marker = new Marker(); + marker.showAtPosition($container, x, y); + }, +}; + +export default MarkerInterface; diff --git a/ui/components/marker/MarkerReactive.js b/ui/components/marker/MarkerReactive.js new file mode 100644 index 000000000..75968c98e --- /dev/null +++ b/ui/components/marker/MarkerReactive.js @@ -0,0 +1,58 @@ +import _ from 'lodash'; + +import delay from 'vj/utils/delay'; +import DOMAttachedObject from 'vj/components/DOMAttachedObject'; +import Marker from './Marker'; + +export default class MarkerReactive extends DOMAttachedObject { + static DOMAttachKey = 'vjMarkerReactiveInstance'; + + static initFromDOM($dom) { + return MarkerReactive.getOrConstruct($dom); + } + + static initAll() { + $('[data-marker-enabled]').get().forEach(dom => MarkerReactive.initFromDOM($(dom))); + } + + constructor($target) { + super($target); + this._onMouseUp = this.onMouseUp.bind(this); + this.bindEventHandlers(); + } + + bindEventHandlers() { + this.$dom.on('mouseup', this._onMouseUp); + } + + unbindEventHandlers() { + this.$dom.off('mouseup', this._onMouseUp); + } + + async onMouseUp(ev) { + await delay(1); + if (!window.getSelection) { + return; + } + const selection = window.getSelection(); + if (!selection || selection.rangeCount === 0) { + return; + } + const range = selection.getRangeAt(0); + if (range.collapsed) { + return; + } + Marker.showAtPosition(this.$dom, ev.clientX, ev.clientY); + } + + detach() { + if (this.detached) { + return; + } + this.unbindEventHandlers(); + Marker.close(); + super.detach(); + } +} + +_.assign(MarkerReactive, DOMAttachedObject); diff --git a/ui/components/marker/marker.page.js b/ui/components/marker/marker.page.js new file mode 100644 index 000000000..dab92ff96 --- /dev/null +++ b/ui/components/marker/marker.page.js @@ -0,0 +1,8 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; +import MarkerReactive from './MarkerReactive'; + +const markerPage = new AutoloadPage('markerPage', () => { + MarkerReactive.initAll(); +}); + +export default markerPage; diff --git a/ui/components/marker/marker.page.styl b/ui/components/marker/marker.page.styl new file mode 100644 index 000000000..33fc3c3c1 --- /dev/null +++ b/ui/components/marker/marker.page.styl @@ -0,0 +1,54 @@ +[data-marker-enabled] + outline: 0 + +.marker + position: fixed + z-index: 100 + display: none + box-shadow: 0 2px 7px rgba(#000, 0.3) + background: #FFF + font-size: rem($font-size-small) + transition: transform .1s ease-out, opacity .1s ease-out + transform: scale(0.8) + transform-origin: 0 100% + pointer-events: none + background: #FFF + padding: 1px + border: 1px solid #AAA + + &.open + transform: none + pointer-events: auto + + &__toolbar + padding: 1px + background: $toolbar-bg + white-space: nowrap + font-size: 0 + + &__action + display: inline-block + text-align: center + font-size: rem($font-size-icon) + vertical-align: top + cursor: pointer + padding: rem(8px) + color: $toolbar-fore + position: relative + + &:hover + background: $toolbar-bg-hover + color: $toolbar-fore-hover + + &__icon + display: block + margin: rem(2px) + width: rem(12px) + height: rem(12px) + border-radius: 50% + + &.icon-yellow + background: #ffc100 + + &.icon-green + background: #54d651 diff --git a/ui/components/menu/menu-heading.page.js b/ui/components/menu/menu-heading.page.js new file mode 100644 index 000000000..03384ca1f --- /dev/null +++ b/ui/components/menu/menu-heading.page.js @@ -0,0 +1,30 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; + +import tpl from 'vj/utils/tpl'; + +const menuHeadingPage = new AutoloadPage('menuHeadingPage', null, () => { + $('[data-heading-extract-to]').get().forEach((container) => { + const $container = $(container); + const $target = $('body').find($container.attr('data-heading-extract-to')); + if ($target.length === 0) { + return; + } + let $menu = $target.children('.menu'); + if ($menu.length === 0) { + $menu = $(tpl``).appendTo($target); + $target.children('.menu__link').addClass('expandable'); + } + $container.find('[data-heading]').get().forEach((heading) => { + const $heading = $(heading); + $(tpl` + + `).appendTo($menu); + }); + }); +}); + +export default menuHeadingPage; diff --git a/ui/components/menu/menu.page.js b/ui/components/menu/menu.page.js new file mode 100644 index 000000000..e8885a490 --- /dev/null +++ b/ui/components/menu/menu.page.js @@ -0,0 +1,18 @@ +import { AutoloadPage } from 'vj/misc/PageLoader'; +import { slideDown } from 'vj/utils/slide'; +import delay from 'vj/utils/delay'; + +function expandMenu($menu) { + slideDown($menu, 500, { opacity: 0 }, { opacity: 1 }); +} + +async function expandAllMenus() { + await delay(200); + $('.menu.collapsed').get().forEach(menu => expandMenu($(menu))); +} + +const menuPage = new AutoloadPage('menuPage', () => { + expandAllMenus(); +}); + +export default menuPage; diff --git a/ui/components/menu/menu.page.styl b/ui/components/menu/menu.page.styl new file mode 100644 index 000000000..4b301cc37 --- /dev/null +++ b/ui/components/menu/menu.page.styl @@ -0,0 +1,65 @@ +.menu + padding: rem(5px 0) + font-size: rem($font-size-secondary) + + .icon + font-size: rem($font-size-icon) + display: inline-block + margin-right: rem(5px) + line-height: rem(18px) + vertical-align: top + + .hasjs &.collapsed + display: none + +.menu__item .menu + padding: 0 + +.menu__link + outline: 0 + text-align: left + display: block + width: 100% + padding: rem(12px $section-gap-h) + line-height: rem(18px) + color: $text-1-color + border-left: 3px solid transparent + position: relative + + &.highlight + background: mix($highlight-color, #FFF, 10%) + + &.expandable:after + font-family: $icon-font-name + font-size: rem($font-size-icon) + content: $icon-expand_more + position: absolute + right: $section-gap-h + top: 50% + line-height: 1 + margin-top: rem($font-size-icon / -2) + transition: transform .2s ease-out-cubic + opacity: 0.85 + +a.menu__link, button.menu__link + &.disabled + cursor: default + opacity: 0.5 + &:hover + text-decoration: none + &:not(.disabled):hover + color: $text-1-color + background: $menu-item-bg-color-hover + border-color: darken($primary-color, 10%) + &.active, &.active:hover + border-color: darken($secondary-color, 30%) + background: $secondary-color + color: #FFF + +.menu__item .menu .menu__link + padding-left: rem($section-gap-h + 10px) + +.menu__seperator + height: 1px + border-top: 1px solid #EEE + margin: rem(5px 0) diff --git a/ui/components/messagepad/DialogueListItem.page.styl b/ui/components/messagepad/DialogueListItem.page.styl new file mode 100644 index 000000000..f8ef155ed --- /dev/null +++ b/ui/components/messagepad/DialogueListItem.page.styl @@ -0,0 +1,28 @@ +$stripe-width = 2px + +.messagepad__list-item + display: block + padding: rem(20px $section-gap-h 20px ($section-gap-h - $stripe-width)) + border-left: $stripe-width solid transparent + cursor: pointer + transition: border-color .1s linear, background-color .1s linear + overflow: hidden + text-overflow: ellipsis + + &:hover + border-color: #DDD + background: #F4F4F4 + text-decoration: none + + &.active + border-color: $secondary-color + background: rgba($secondary-color, 0.07) + +.messagepad__desc + font-size: rem($font-size-small) + color: #888 + max-height: 2em + margin-top: rem(5px) + overflow: hidden + text-overflow: ellipsis + word-wrap() diff --git a/ui/components/messagepad/DialogueListItemComponent.js b/ui/components/messagepad/DialogueListItemComponent.js new file mode 100644 index 000000000..b2777109c --- /dev/null +++ b/ui/components/messagepad/DialogueListItemComponent.js @@ -0,0 +1,39 @@ +import PropTypes from 'prop-types'; +import classNames from 'classnames'; + +export default function DialogueListItemComponent(props) { + const { + userName, + summary, + faceUrl, + active, + onClick, + className, + ...rest + } = props; + const cn = classNames(className, 'messagepad__list-item media', { + active, + }); + return ( +
  • + +
    + avatar +
    +
    +

    {userName}

    +
    {summary}
    +
    +
    +
  • + ); +} + +DialogueListItemComponent.propTypes = { + userName: PropTypes.string.isRequired, + summary: PropTypes.string.isRequired, + faceUrl: PropTypes.string.isRequired, + active: PropTypes.bool, + onClick: PropTypes.func, + className: PropTypes.string, +}; diff --git a/ui/components/messagepad/Message.page.styl b/ui/components/messagepad/Message.page.styl new file mode 100644 index 000000000..fc443afe9 --- /dev/null +++ b/ui/components/messagepad/Message.page.styl @@ -0,0 +1,64 @@ +$corner-size = 10px + +.messagepad__message + overflow: hidden + display: flex + margin-bottom: rem(30px) + + &:last-child + margin-bottom: 0 + + &.side--self + justify-content: flex-end + +.messagepad__message__body + font-size: rem($font-size-secondary) + line-height: 1.5 + padding: rem(15px) + margin-bottom: rem(8px) + position: relative + min-width: rem(100px) + white-space: pre-wrap + word-wrap() + + time + opacity: 0.6 + font-size: rem($font-size-small) + + &:after + position: absolute + width: 0 + height: 0 + content: '' + top: 0 + +.side--other + .messagepad__message__body + margin-left: rem($corner-size + 10px) + background: $primary-color + color: #FFF + order: 1 + + &:after + left: rem(-($corner-size)) + border-top: $corner-size solid $primary-color + border-right: 0 solid transparent + border-bottom: 0 solid transparent + border-left: $corner-size solid transparent + +.side--self + .messagepad__message__body + margin-right: rem($corner-size + 10px) + background: #F0F0F0 + color: #222 + order: -1 + + time + text-align: right + + &:after + right: rem(-($corner-size)) + border-top: $corner-size solid #F0F0F0 + border-right: $corner-size solid transparent + border-bottom: 0 solid transparent + border-left: 0 solid transparent diff --git a/ui/components/messagepad/MessageComponent.js b/ui/components/messagepad/MessageComponent.js new file mode 100644 index 000000000..de0c3ceb8 --- /dev/null +++ b/ui/components/messagepad/MessageComponent.js @@ -0,0 +1,33 @@ +import PropTypes from 'prop-types'; +import classNames from 'classnames'; + +export default function MessageComponent(props) { + const { + faceUrl, + isSelf, + className, + children, + ...rest + } = props; + const cn = classNames(className, 'messagepad__message', { + 'side--self': isSelf, + 'side--other': !isSelf, + }); + return ( +
  • +
    + avatar +
    +
    + {children} +
    +
  • + ); +} + +MessageComponent.propTypes = { + isSelf: PropTypes.bool, + faceUrl: PropTypes.string.isRequired, + className: PropTypes.string, + children: PropTypes.node, +}; diff --git a/ui/components/messagepad/MessagePad.page.styl b/ui/components/messagepad/MessagePad.page.styl new file mode 100644 index 000000000..f6b9e787d --- /dev/null +++ b/ui/components/messagepad/MessagePad.page.styl @@ -0,0 +1,89 @@ +$list-height = 500px +$sidebar-width = 250px +$input-height = 80px +$input-padding = 10px +$send-button-width = 50px + +#messagePad + min-height: rem($list-height) + position: relative + +.messagepad + position: relative + +.messagepad__sidebar + border-right: 1px solid #EEE + float: left + width: rem($sidebar-width) + +.messagepad__list + overflow: auto + height: rem($list-height) + +.messagepad__content + position: absolute + left: rem($sidebar-width) + right: 0 + top: 0 + bottom: rem($input-height) + overflow: auto + padding: rem(30px) + +.messagepad__input + display: none + position: absolute + left: rem($sidebar-width) + right: 0 + bottom: 0 + height: $input-height + border-top: 1px solid #EEE + + &.visible + display: block + + button + display: block + appearance: none + position: absolute + right: 0 + width: rem($send-button-width) + top: 0 + height: 100% + border: 0 + background: none + text-align: center + line-height: rem($input-height) + font-size: rem($font-size-icon) + transition: background-color .1s, color .1s, opacity .1s + transition-timing-function: linear + outline: 0 + + &:enabled + cursor: pointer + background-color: $primary-color + color: #FFF + + &:hover + background-color: lighten($primary-color, 10%) + + &:disabled + color: $text-1-color + opacity: 0.3 + +.messagepad__textarea-container + position: absolute + left: rem($input-padding) + right: rem($send-button-width + $input-padding) + top: rem($input-padding) + bottom: rem($input-padding) + + textarea + display: block + border: 0 + background: none + padding: 0 + width: 100% + height: 100% + font-size: rem($font-size-secondary) + resize: none + outline: 0 diff --git a/ui/components/messagepad/MessagePadDialogueContentContainer.js b/ui/components/messagepad/MessagePadDialogueContentContainer.js new file mode 100644 index 000000000..f8f14a1aa --- /dev/null +++ b/ui/components/messagepad/MessagePadDialogueContentContainer.js @@ -0,0 +1,81 @@ +import React from 'react'; +import _ from 'lodash'; +import { connect } from 'react-redux'; +import TimeAgo from 'timeago-react'; +import moment from 'moment'; +import 'jquery-scroll-lock'; +import 'jquery.easing'; + +import i18n from 'vj/utils/i18n'; +import Message from './MessageComponent'; + +const mapStateToProps = state => ({ + activeId: state.activeId, + item: state.activeId !== null + ? state.dialogues[state.activeId] + : null, +}); + +@connect(mapStateToProps, null) +export default class MessagePadDialogueContentContainer extends React.PureComponent { + componentDidMount() { + $(this.refs.list).scrollLock({ strict: true }); + } + + componentWillUpdate(nextProps) { + if (nextProps.activeId !== this.props.activeId) { + this.scrollToBottom = true; + this.scrollWithAnimation = false; + return; + } + const node = this.refs.list; + if (node.scrollTop + node.offsetHeight === node.scrollHeight) { + this.scrollToBottom = true; + this.scrollWithAnimation = true; + return; + } + this.scrollToBottom = false; + } + + componentDidUpdate() { + if (this.scrollToBottom) { + const node = this.refs.list; + const targetScrollTop = node.scrollHeight - node.offsetHeight; + if (this.scrollWithAnimation) { + $(node).stop().animate({ scrollTop: targetScrollTop }, 200, 'easeOutCubic'); + } else { + node.scrollTop = targetScrollTop; + } + } + } + + renderInner() { + if (this.props.activeId === null) { + return []; + } + return _.map(this.props.item.reply, (reply, idx) => ( + +
    {reply.content}
    + +
    + )); + } + + render() { + return ( +
      + {this.renderInner()} +
    + ); + } +} diff --git a/ui/components/messagepad/MessagePadDialogueListContainer.js b/ui/components/messagepad/MessagePadDialogueListContainer.js new file mode 100644 index 000000000..4e81af36f --- /dev/null +++ b/ui/components/messagepad/MessagePadDialogueListContainer.js @@ -0,0 +1,63 @@ +import React from 'react'; +import _ from 'lodash'; +import { connect } from 'react-redux'; +import 'jquery-scroll-lock'; + +import ListItem from './DialogueListItemComponent'; + +const mapStateToProps = state => ({ + activeId: state.activeId, + dialogues: state.dialogues, +}); + +const mapDispatchToProps = dispatch => ({ + handleClick(id) { + dispatch({ + type: 'DIALOGUES_SWITCH_TO', + payload: id, + }); + }, +}); + +@connect(mapStateToProps, mapDispatchToProps) +export default class MessagePadDialogueListContainer extends React.PureComponent { + componentDidMount() { + $(this.refs.list).scrollLock({ strict: true }); + } + + render() { + const orderedDialogues = _.orderBy( + _.values(this.props.dialogues), + dialogue => (dialogue.isPlaceholder + ? Number.POSITIVE_INFINITY + : _.maxBy(dialogue.reply, 'at').at), + 'desc', + ); + return ( +
      + {_.map(orderedDialogues, dialogue => ( + this.props.handleClick(dialogue._id)} + /> + ))} +
    + ); + } +} diff --git a/ui/components/messagepad/MessagePadInputContainer.js b/ui/components/messagepad/MessagePadInputContainer.js new file mode 100644 index 000000000..4a6ba82c5 --- /dev/null +++ b/ui/components/messagepad/MessagePadInputContainer.js @@ -0,0 +1,135 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import classNames from 'classnames'; +import Icon from 'vj/components/react/IconComponent'; + +import request from 'vj/utils/request'; + +const mapStateToProps = state => ({ + activeId: state.activeId, + isPosting: state.activeId !== null + ? state.isPosting[state.activeId] + : false, + inputValue: state.activeId !== null + ? state.inputs[state.activeId] + : '', +}); + +const mapDispatchToProps = dispatch => ({ + handleChange(id, value) { + if (id === null) { + return; + } + dispatch({ + type: 'DIALOGUES_INPUT_CHANGED', + payload: value, + meta: { + dialogueId: id, + }, + }); + }, + postSend(placeholderId, uid, value) { + if (placeholderId === null) { + return; + } + const req = request.post('', { + operation: 'send_message', + uid, + content: value, + }); + dispatch({ + type: 'DIALOGUES_POST_SEND', + payload: req, + meta: { + placeholderId, + }, + }); + }, + postReply(id, value) { + if (id === null) { + return; + } + const req = request.post('', { + operation: 'reply_message', + message_id: id, + content: value, + }); + dispatch({ + type: 'DIALOGUES_POST_REPLY', + payload: req, + meta: { + dialogueId: id, + }, + }); + }, +}); + +@connect(mapStateToProps, mapDispatchToProps) +export default class MessagePadInputContainer extends React.PureComponent { + static contextTypes = { + store: PropTypes.object, + }; + + componentWillUpdate(nextProps) { + this.focusInput = ( + nextProps.activeId !== this.props.activeId + || this.props.isPosting !== nextProps.isPosting && nextProps.isPosting === false + ); + } + + componentDidUpdate() { + if (this.focusInput) { + const { scrollX, scrollY } = window; + this.refs.input.focus(); + window.scrollTo(scrollX, scrollY); + } + } + + handleKeyDown(ev) { + if (ev.keyCode === 13 && (ev.ctrlKey || ev.metaKey)) { + this.submit(); + } + } + + submit() { + const state = this.context.store.getState(); + if (state.dialogues[this.props.activeId].isPlaceholder) { + this.props.postSend( + this.props.activeId, + state.dialogues[this.props.activeId].sendee_uid, + this.props.inputValue, + ); + } else { + this.props.postReply( + this.props.activeId, + this.props.inputValue, + ); + } + } + + render() { + const cn = classNames('messagepad__input', { + visible: this.props.activeId !== null, + }); + return ( +
    +
    +