mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-19 17:38:19 +08:00
ui: frontend api (#470) [skip-cache]
This commit is contained in:
1 parent
6d69e88739
commit
96fa6cc7b9
116 files changed
+599
-629
No files matched your search
@@ -23,7 +23,7 @@ function monitorResource(resource) {
|
||||
}
|
||||
}
|
||||
|
||||
export default class DOMAttachedObject {
|
||||
class DOMAttachedObject {
|
||||
static uniqueIdCounter = 0;
|
||||
static DOMAttachKey: string;
|
||||
static DOMAttachSelector: string;
|
||||
@@ -127,3 +127,5 @@ export default class DOMAttachedObject {
|
||||
if (monitorDetach) monitorResource(this);
|
||||
}
|
||||
}
|
||||
|
||||
export default DOMAttachedObject as typeof DOMAttachedObject & DOMAttachedObject;
|
||||
@@ -1,7 +1,7 @@
|
||||
import type { DomainDoc } from 'hydrooj/src/interface';
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { forwardRef } from 'react';
|
||||
import request from 'vj/utils/request';
|
||||
import { request } from 'vj/utils';
|
||||
import AutoComplete, { AutoCompleteHandle, AutoCompleteProps } from './AutoComplete';
|
||||
|
||||
const DomainSelectAutoComplete = forwardRef<AutoCompleteHandle<DomainDoc>, AutoCompleteProps<DomainDoc>>((props, ref) => (
|
||||
|
||||
+1
-2
@@ -1,8 +1,7 @@
|
||||
import type { ProblemDoc } from 'hydrooj/src/interface';
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { forwardRef } from 'react';
|
||||
import api, { gql } from 'vj/utils/api';
|
||||
import request from 'vj/utils/request';
|
||||
import { api, gql, request } from 'vj/utils';
|
||||
import AutoComplete, { AutoCompleteHandle, AutoCompleteProps } from './AutoComplete';
|
||||
|
||||
const ProblemSelectAutoComplete = forwardRef<AutoCompleteHandle<ProblemDoc>, AutoCompleteProps<ProblemDoc>>((props, ref) => (
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import type { Udoc } from 'hydrooj/src/interface';
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { forwardRef } from 'react';
|
||||
import api, { gql } from 'vj/utils/api';
|
||||
import { api, gql } from 'vj/utils';
|
||||
import AutoComplete, { AutoCompleteHandle, AutoCompleteProps } from './AutoComplete';
|
||||
|
||||
// eslint-disable-next-line prefer-arrow-callback
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, tpl } from 'vj/utils';
|
||||
import { InfoDialog } from './dialog';
|
||||
|
||||
function isSupported() {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import $ from 'jquery';
|
||||
import _ from 'lodash';
|
||||
import moment from 'moment';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { tpl } from 'vj/utils';
|
||||
|
||||
export default class Calendar {
|
||||
constructor(events) {
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import Clipboard from 'clipboard';
|
||||
import Notification from 'vj/components/notification';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import base64 from 'vj/utils/base64';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import substitute from 'vj/utils/substitute';
|
||||
import { base64, i18n, substitute } from 'vj/utils';
|
||||
|
||||
export default new AutoloadPage('clipboard', () => {
|
||||
$('[data-copy]').get().forEach((el) => {
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import $ from 'jquery';
|
||||
import Notification from 'vj/components/notification';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import delay from 'vj/utils/delay';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import request from 'vj/utils/request';
|
||||
import { delay, i18n, request } from 'vj/utils';
|
||||
|
||||
const contestPage = new AutoloadPage('contestPage', () => {
|
||||
$('[data-contest-code]').on('click', (ev) => {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import $ from 'jquery';
|
||||
import _ from 'lodash';
|
||||
import DOMAttachedObject from 'vj/components/DOMAttachedObject';
|
||||
import zIndexManager from 'vj/utils/zIndexManager';
|
||||
import { zIndexManager } from 'vj/utils';
|
||||
|
||||
export interface DialogOptions {
|
||||
classes: string;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import $ from 'jquery';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, tpl } from 'vj/utils';
|
||||
import DomDialog, { DialogOptions } from './DomDialog';
|
||||
|
||||
export class Dialog {
|
||||
|
||||
@@ -3,7 +3,7 @@ import _ from 'lodash';
|
||||
import DOMAttachedObject from 'vj/components/DOMAttachedObject';
|
||||
import TextareaHandler from 'vj/components/editor/textareaHandler';
|
||||
import Notification from 'vj/components/notification';
|
||||
import request from 'vj/utils/request';
|
||||
import { request } from 'vj/utils';
|
||||
|
||||
let initialized = false;
|
||||
const $template = $('.dczcomments__box').eq(0).clone();
|
||||
|
||||
@@ -4,11 +4,9 @@ import $ from 'jquery';
|
||||
import { ConfirmDialog } from 'vj/components/dialog';
|
||||
import CommentBox from 'vj/components/discussion/CommentBox';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import delay from 'vj/utils/delay';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import request from 'vj/utils/request';
|
||||
import { slideDown, slideUp } from 'vj/utils/slide';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import {
|
||||
delay, i18n, request, slideDown, slideUp, tpl,
|
||||
} from 'vj/utils';
|
||||
|
||||
const $replyTemplate = $('.commentbox-container').eq(0).clone();
|
||||
|
||||
|
||||
@@ -5,9 +5,7 @@ import { QueryClient, QueryClientProvider, useQuery } from 'react-query';
|
||||
import TimeAgo from 'timeago-react';
|
||||
import { InfoDialog } from 'vj/components/dialog';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import request from 'vj/utils/request';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, request, tpl } from 'vj/utils';
|
||||
|
||||
async function historyDialog(payload, time, uid) {
|
||||
const ts = new Date(time).getTime();
|
||||
|
||||
@@ -6,7 +6,7 @@ import { chunk } from 'lodash';
|
||||
import * as React from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import request from 'vj/utils/request';
|
||||
import { request } from 'vj/utils';
|
||||
|
||||
function renderReactions(reactions, self, rootEle) {
|
||||
let html = '';
|
||||
|
||||
@@ -2,8 +2,7 @@ import _ from 'lodash';
|
||||
import Drop from 'tether-drop';
|
||||
import responsiveCutoff from 'vj/breakpoints.json';
|
||||
import DOMAttachedObject from 'vj/components/DOMAttachedObject';
|
||||
import { isBelow } from 'vj/utils/mediaQuery';
|
||||
import zIndexManager from 'vj/utils/zIndexManager';
|
||||
import { mediaQuery, zIndexManager } from 'vj/utils';
|
||||
|
||||
export default class Dropdown extends DOMAttachedObject {
|
||||
static DOMAttachKey = 'vjDropdownInstance';
|
||||
@@ -12,7 +11,7 @@ export default class Dropdown extends DOMAttachedObject {
|
||||
|
||||
constructor($dom, options = {}) {
|
||||
if ($dom.attr('data-dropdown-trigger-desktop-only') !== undefined) {
|
||||
if (isBelow(responsiveCutoff.mobile)) {
|
||||
if (mediaQuery.isBelow(responsiveCutoff.mobile)) {
|
||||
super(null);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import delay from 'vj/utils/delay';
|
||||
import { delay } from 'vj/utils';
|
||||
import CmEditor from '.';
|
||||
|
||||
function runSubstitute($container: JQuery<Document | HTMLElement>) {
|
||||
|
||||
@@ -3,8 +3,7 @@ import _ from 'lodash';
|
||||
import { nanoid } from 'nanoid';
|
||||
import DOMAttachedObject from 'vj/components/DOMAttachedObject';
|
||||
import Notification from 'vj/components/notification';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import request from 'vj/utils/request';
|
||||
import { i18n, request } from 'vj/utils';
|
||||
|
||||
export const config = {
|
||||
toolbar: [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import $ from 'jquery';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import delay from 'vj/utils/delay';
|
||||
import { delay } from 'vj/utils';
|
||||
|
||||
const formPage = new AutoloadPage('formPage', () => {
|
||||
$(document).on('vjFormDisableUpdate', 'input, select, textarea', (ev) => {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import $ from 'jquery';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, tpl } from 'vj/utils';
|
||||
|
||||
const highlighterPage = new AutoloadPage('highlighterPage', () => {
|
||||
import('./prismjs').then(({ default: prismjs }) => {
|
||||
|
||||
@@ -11,7 +11,7 @@ import $ from 'jquery';
|
||||
import components from 'prismjs/components';
|
||||
import getLoader from 'prismjs/dependencies';
|
||||
import Notification from 'vj/components/notification/index';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
import languageMeta from './meta';
|
||||
|
||||
const files = require.context('prismjs/components/', true, /prism-[a-z0-9-]+\.js/);
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import $ from 'jquery';
|
||||
import { InfoDialog } from 'vj/components/dialog';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, tpl } from 'vj/utils';
|
||||
|
||||
export default function createHint(message: string, element?: any) {
|
||||
if (i18n(message) === message || !element) return;
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
import $ from 'jquery';
|
||||
import { NamedPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import request from 'vj/utils/request';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, request, tpl } from 'vj/utils';
|
||||
|
||||
export default new NamedPage('homepage', () => {
|
||||
function getHitokoto($containers) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import $ from 'jquery';
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
|
||||
export default function LanguageSelect({
|
||||
fieldSelector, firstLoadMain, firstLoadSub, availableLangs, mainLangs,
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import $ from 'jquery';
|
||||
import _ from 'lodash';
|
||||
import Tooltip from 'vj/components/tooltip/Tooltip';
|
||||
import delay from 'vj/utils/delay';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { delay, i18n } from 'vj/utils';
|
||||
|
||||
const MARKER_ID = `marker_${Math.floor(Math.random() * 0xFFFFFF).toString(16)}`;
|
||||
const MARKER_OFFSET = 20;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import $ from 'jquery';
|
||||
import _ from 'lodash';
|
||||
import DOMAttachedObject from 'vj/components/DOMAttachedObject';
|
||||
import delay from 'vj/utils/delay';
|
||||
import { delay } from 'vj/utils';
|
||||
import Marker from './Marker';
|
||||
|
||||
export default class MarkerReactive extends DOMAttachedObject {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import $ from 'jquery';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import request from 'vj/utils/request';
|
||||
import { request } from 'vj/utils';
|
||||
|
||||
export default new AutoloadPage('media', async () => {
|
||||
async function parseMedia($dom = $(document.body)) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import $ from 'jquery';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { tpl } from 'vj/utils';
|
||||
|
||||
const menuHeadingPage = new AutoloadPage('menuHeadingPage', null, () => {
|
||||
$('[data-heading-extract-to]').get().forEach((container) => {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import $ from 'jquery';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import delay from 'vj/utils/delay';
|
||||
import { slideDown } from 'vj/utils/slide';
|
||||
import { delay, slideDown } from 'vj/utils';
|
||||
|
||||
function expandMenu($menu) {
|
||||
slideDown($menu, 500, { opacity: 0 }, { opacity: 1 });
|
||||
|
||||
@@ -4,8 +4,7 @@ import { InfoDialog } from 'vj/components/dialog';
|
||||
import VjNotification from 'vj/components/notification/index';
|
||||
import { FLAG_ALERT } from 'vj/constant/message';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, tpl } from 'vj/utils';
|
||||
|
||||
const onmessage = (msg) => {
|
||||
console.log('Received message', msg);
|
||||
|
||||
@@ -6,8 +6,7 @@ import moment from 'moment';
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import TimeAgo from 'timeago-react';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { parse as parseMongoId } from 'vj/utils/mongoId';
|
||||
import { i18n, mongoId } from 'vj/utils';
|
||||
import Message from './MessageComponent';
|
||||
|
||||
const mapStateToProps = (state) => ({
|
||||
@@ -70,7 +69,7 @@ export default connect(mapStateToProps)(class MessagePadDialogueContentContainer
|
||||
renderInner() {
|
||||
if (this.props.activeId === null) return [];
|
||||
const sorted = this.props.item.messages
|
||||
.sort((msg1, msg2) => parseMongoId(msg1._id).timestamp - parseMongoId(msg2._id).timestamp);
|
||||
.sort((msg1, msg2) => mongoId(msg1._id).timestamp - mongoId(msg2._id).timestamp);
|
||||
return sorted.map((msg) => (
|
||||
<Message
|
||||
key={msg._id}
|
||||
@@ -82,8 +81,8 @@ export default connect(mapStateToProps)(class MessagePadDialogueContentContainer
|
||||
}
|
||||
>
|
||||
<div>{this.renderContent(msg)}</div>
|
||||
<time data-tooltip={moment(parseMongoId(msg._id).timestamp * 1000).format('YYYY-MM-DD HH:mm:ss')}>
|
||||
<TimeAgo datetime={parseMongoId(msg._id).timestamp * 1000} locale={i18n('timeago_locale')} />
|
||||
<time data-tooltip={moment(mongoId(msg._id).timestamp * 1000).format('YYYY-MM-DD HH:mm:ss')}>
|
||||
<TimeAgo datetime={mongoId(msg._id).timestamp * 1000} locale={i18n('timeago_locale')} />
|
||||
</time>
|
||||
</Message>
|
||||
));
|
||||
|
||||
@@ -4,7 +4,7 @@ import $ from 'jquery';
|
||||
import _ from 'lodash';
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
import ListItem from './DialogueListItemComponent';
|
||||
|
||||
const mapStateToProps = (state) => ({
|
||||
|
||||
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import Icon from 'vj/components/react/IconComponent';
|
||||
import request from 'vj/utils/request';
|
||||
import { request } from 'vj/utils';
|
||||
|
||||
const mapStateToProps = (state) => ({
|
||||
activeId: state.activeId,
|
||||
|
||||
@@ -2,8 +2,7 @@ import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import Icon from 'vj/components/react/IconComponent';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import request from 'vj/utils/request';
|
||||
import { i18n, request } from 'vj/utils';
|
||||
import MessagePadDialogueContent from './MessagePadDialogueContentContainer';
|
||||
import MessagePadDialogueList from './MessagePadDialogueListContainer';
|
||||
import MessagePadInput from './MessagePadInputContainer';
|
||||
|
||||
@@ -6,8 +6,7 @@ import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
|
||||
import { IQuickInputService } from 'monaco-editor/esm/vs/platform/quickinput/common/quickInput';
|
||||
import list from 'monaco-themes/themes/themelist.json';
|
||||
import { nanoid } from 'nanoid';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import request from 'vj/utils/request';
|
||||
import { i18n, request } from 'vj/utils';
|
||||
|
||||
export default monaco;
|
||||
export const customOptions: monaco.editor.IStandaloneDiffEditorConstructionOptions = JSON.parse(localStorage.getItem('editor.config') || '{}');
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import keyword from 'emojis-keywords';
|
||||
import list from 'emojis-list';
|
||||
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
|
||||
import api, { gql } from 'vj/utils/api';
|
||||
import { api, gql } from 'vj/utils';
|
||||
|
||||
const qqEmojies = [
|
||||
'weixiao',
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import loadExternalModule from 'vj/utils/loadModule';
|
||||
import { loadExternalModule } from 'vj/utils';
|
||||
|
||||
let loaded;
|
||||
const loaders = {
|
||||
|
||||
@@ -3,9 +3,7 @@ import Slideout from 'slideout';
|
||||
import Notification from 'vj/components/notification';
|
||||
import selectUser from 'vj/components/selectUser';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import request from 'vj/utils/request';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, request, tpl } from 'vj/utils';
|
||||
|
||||
function handleNavLogoutClick(ev) {
|
||||
const $logoutLink = $(ev.currentTarget);
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { Intent, Position, Toaster } from '@blueprintjs/core';
|
||||
import $ from 'jquery';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import zIndexManager from 'vj/utils/zIndexManager';
|
||||
import { tpl, zIndexManager } from 'vj/utils/base';
|
||||
|
||||
const ToasterContainer = document.createElement('div');
|
||||
ToasterContainer.style.position = 'fixed';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import Notification from 'vj/components/notification/index';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
|
||||
export default new AutoloadPage('notificationPage', (pagename) => {
|
||||
const message = i18n(`Hint::Page::${pagename}`);
|
||||
|
||||
@@ -4,10 +4,9 @@ import { nanoid } from 'nanoid';
|
||||
import { ActionDialog, InfoDialog } from 'vj/components/dialog/index';
|
||||
import Notification from 'vj/components/notification';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import pjax from 'vj/utils/pjax';
|
||||
import request from 'vj/utils/request';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import {
|
||||
i18n, pjax, request, tpl,
|
||||
} from 'vj/utils';
|
||||
|
||||
async function startEdit(filename, value, fileCategory = 'file') {
|
||||
const { default: Editor } = await import('vj/components/editor/index');
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import $ from 'jquery';
|
||||
import { InfoDialog } from 'vj/components/dialog';
|
||||
import { NamedPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, tpl } from 'vj/utils';
|
||||
|
||||
export default new NamedPage(['problem_create', 'problem_edit'], () => {
|
||||
$('input[name="pid"]').on('blur', () => {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
import FileSelectAutoComplete from '../autocomplete/components/FileSelectAutoComplete';
|
||||
import type { RootState } from './reducer/index';
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
} from '@blueprintjs/core';
|
||||
import React from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
import CustomSelectAutoComplete from '../autocomplete/components/CustomSelectAutoComplete';
|
||||
import FileSelectAutoComplete from '../autocomplete/components/FileSelectAutoComplete';
|
||||
import { FormItem } from './BasicForm';
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
} from '@blueprintjs/core';
|
||||
import React from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
import { FormItem, ManagedSelect, SingleFileSelect } from './BasicForm';
|
||||
import type { RootState } from './reducer/index';
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import type { SubtaskConfig } from 'hydrooj/src/interface';
|
||||
import { isEqual, pick } from 'lodash';
|
||||
import React from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
import CustomSelectAutoComplete from '../autocomplete/components/CustomSelectAutoComplete';
|
||||
import { FormItem } from './BasicForm';
|
||||
import { RootState } from './reducer';
|
||||
|
||||
@@ -4,7 +4,7 @@ import type { SubtaskConfig } from 'hydrooj/src/interface';
|
||||
import { isEqual } from 'lodash';
|
||||
import React, { useEffect, useRef } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
import FileSelectAutoComplete from '../autocomplete/components/FileSelectAutoComplete';
|
||||
import type { RootState } from './reducer/index';
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import $ from 'jquery';
|
||||
import _ from 'lodash';
|
||||
import DOMAttachedObject from 'vj/components/DOMAttachedObject';
|
||||
import delay from 'vj/utils/delay';
|
||||
import { delay } from 'vj/utils';
|
||||
|
||||
const ANIMATION_DURATION = 4000;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import AnsiUp from 'ansi_up';
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import Icon from 'vj/components/react/IconComponent';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
import DataInput from './DataInputComponent';
|
||||
import Panel from './PanelComponent';
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import classNames from 'classnames';
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import Icon from 'vj/components/react/IconComponent';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
import Panel from './PanelComponent';
|
||||
import ScratchpadRecordsRow from './ScratchpadRecordsRowContainer';
|
||||
|
||||
|
||||
@@ -5,10 +5,9 @@ import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import TimeAgo from 'timeago-react';
|
||||
import * as recordEnum from 'vj/constant/record';
|
||||
import emulateAnchorClick from 'vj/utils/emulateAnchorClick';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { parse as parseMongoId } from 'vj/utils/mongoId';
|
||||
import substitute from 'vj/utils/substitute';
|
||||
import {
|
||||
emulateAnchorClick, i18n, mongoId, substitute,
|
||||
} from 'vj/utils';
|
||||
|
||||
const shouldShowDetail = (data) => recordEnum.STATUS_SCRATCHPAD_SHOW_DETAIL_FLAGS[data.status];
|
||||
|
||||
@@ -58,7 +57,7 @@ export default connect(mapStateToProps, null, mergeProps)(class ScratchpadRecord
|
||||
|
||||
render() {
|
||||
const { data } = this.props;
|
||||
const submitAt = parseMongoId(data._id).timestamp * 1000;
|
||||
const submitAt = mongoId(data._id).timestamp * 1000;
|
||||
// Is pretest
|
||||
return data.contest?.toString() === '000000000000000000000000' ? null : (
|
||||
<tr onClick={(ev) => this.handleRowClick(ev, data._id)}>
|
||||
|
||||
@@ -4,9 +4,7 @@ import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import Icon from 'vj/components/react/IconComponent';
|
||||
import getAvailableLangs from 'vj/utils/availableLangs';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import request from 'vj/utils/request';
|
||||
import { getAvailableLangs, i18n, request } from 'vj/utils';
|
||||
import Toolbar, {
|
||||
ToolbarButtonComponent as ToolbarButton,
|
||||
ToolbarItemComponent as ToolbarItem,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import Notification from 'vj/components/notification';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
|
||||
export default function reducer(state = {
|
||||
main: {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import UserSelectAutoComplete from 'vj/components/autocomplete/UserSelectAutoComplete';
|
||||
import { ActionDialog } from 'vj/components/dialog';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, tpl } from 'vj/utils';
|
||||
import createHint from './hint';
|
||||
|
||||
let hintInserted = false;
|
||||
|
||||
@@ -3,9 +3,7 @@ import responsiveCutoff from 'vj/breakpoints.json';
|
||||
import DomDialog from 'vj/components/dialog/DomDialog';
|
||||
import { InfoDialog } from 'vj/components/dialog/index';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { isBelow } from 'vj/utils/mediaQuery';
|
||||
import tpl from 'vj/utils/tpl';
|
||||
import { i18n, mediaQuery, tpl } from 'vj/utils';
|
||||
|
||||
const signinDialogPage = new AutoloadPage('signinDialogPage', null, () => {
|
||||
const signInDialog = DomDialog.getOrConstruct($('.dialog--signin'), {
|
||||
@@ -17,7 +15,7 @@ const signinDialogPage = new AutoloadPage('signinDialogPage', null, () => {
|
||||
if ($('[name="nav_login"]').length > 0) {
|
||||
// nav
|
||||
$('[name="nav_login"]').on('click', (ev) => {
|
||||
if (isBelow(responsiveCutoff.mobile)) return;
|
||||
if (mediaQuery.isBelow(responsiveCutoff.mobile)) return;
|
||||
if (ev.shiftKey || ev.metaKey || ev.ctrlKey) return;
|
||||
signInDialog.show();
|
||||
ev.preventDefault();
|
||||
@@ -32,7 +30,7 @@ const signinDialogPage = new AutoloadPage('signinDialogPage', null, () => {
|
||||
}
|
||||
|
||||
window.showSignInDialog = () => {
|
||||
if (isBelow(responsiveCutoff.mobile)) {
|
||||
if (mediaQuery.isBelow(responsiveCutoff.mobile)) {
|
||||
if ($('[name="nav_login"]').length > 0) {
|
||||
window.location.href = $('[name="nav_login"]').attr('href');
|
||||
return;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import $ from 'jquery';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import request from 'vj/utils/request';
|
||||
import { request } from 'vj/utils';
|
||||
|
||||
function setStarButtonState($starButton, star) {
|
||||
if (star) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import $ from 'jquery';
|
||||
import * as timeago from 'timeago.js';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import { i18n } from 'vj/utils';
|
||||
|
||||
try {
|
||||
const locales = require.context('timeago.js/lib/lang', false, /\.js$/);
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import { Dialog } from 'vj/components/dialog/index';
|
||||
import Notification from 'vj/components/notification';
|
||||
import delay from 'vj/utils/delay';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import pjax from 'vj/utils/pjax';
|
||||
import request from 'vj/utils/request';
|
||||
import {
|
||||
delay, i18n, pjax, request,
|
||||
} from 'vj/utils';
|
||||
|
||||
function onBeforeUnload(e) {
|
||||
e.returnValue = '';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import $ from 'jquery';
|
||||
import Rotator from 'vj/components/rotator';
|
||||
import { AutoloadPage } from 'vj/misc/Page';
|
||||
import request from 'vj/utils/request';
|
||||
import { request } from 'vj/utils';
|
||||
|
||||
function setVoteState($container, value, status) {
|
||||
const $num = $container.find('.vote-number');
|
||||
|
||||
+5
-7
@@ -2,11 +2,9 @@ import { dump } from 'js-yaml';
|
||||
import PQueue from 'p-queue';
|
||||
import streamsaver from 'streamsaver';
|
||||
import Notification from 'vj/components/notification';
|
||||
import api, { gql } from 'vj/utils/api';
|
||||
import i18n from 'vj/utils/i18n';
|
||||
import pipeStream from 'vj/utils/pipeStream';
|
||||
import request from 'vj/utils/request';
|
||||
import { createZipStream } from 'vj/utils/zip';
|
||||
import {
|
||||
api, createZipStream, gql, i18n, pipeStream, request,
|
||||
} from 'vj/utils';
|
||||
|
||||
let isBeforeUnloadTriggeredByLibrary = !window.isSecureContext;
|
||||
function onBeforeUnload(e) {
|
||||
@@ -29,8 +27,8 @@ export default async function download(filename, targets) {
|
||||
await waitForWritableStream;
|
||||
const fileStream = streamsaver.createWriteStream(filename);
|
||||
const queue = new PQueue({ concurrency: 5 });
|
||||
const abortCallbackReceiver = {};
|
||||
function stopDownload() { abortCallbackReceiver.abort(); }
|
||||
const abortCallbackReceiver: any = {};
|
||||
function stopDownload() { abortCallbackReceiver.abort?.(); }
|
||||
let i = 0;
|
||||
async function downloadFile(target) {
|
||||
try {
|
||||
Reference in new issue
Block a user