diff --git a/components/Activity/ActivityEditor.tsx b/components/Activity/ActivityEditor.tsx index 3452ef45..397c462f 100644 --- a/components/Activity/ActivityEditor.tsx +++ b/components/Activity/ActivityEditor.tsx @@ -45,6 +45,10 @@ export class ActivityEditor extends PureComponent { this.detailHTML = detail || ''; } + componentWillUnmount() { + activityStore.clearCurrent(); + } + submitHandler = async (event: FormEvent) => { event.preventDefault(); event.stopPropagation(); @@ -56,7 +60,7 @@ export class ActivityEditor extends PureComponent { const { name } = this.props, data = formToJSON(form); - data.detail = data.detail + ''; + data.detail = (data.detail || '') + ''; data.banners = [data.bannerUrls ?? []].flat().map(bannerUrl => { const name = bannerUrl.split('/').slice(-1)[0]; @@ -271,13 +275,11 @@ export class ActivityEditor extends PureComponent { * - {detail && ( - (this.detailHTML = code)} - /> - )} + (this.detailHTML = code)} + /> , Pick { type?: ActivityListType; @@ -23,13 +23,13 @@ export interface ActivityListProps userId?: string; } -export const ActivityListLayout = ({ +export const ActivityListLayout: FC = ({ size, type = 'online', defaultData = [], userId, ...props -}: ActivityListProps) => ( +}) => ( ); -@observer -export default class ActivityList extends XScrollList { - store = new ActivityModel(); - - filter: ActivityFilter = { - userId: this.props.userId, - listType: this.props.type, - }; +export type ActivityListProps = ActivityListLayoutProps; - constructor(props: ActivityListProps) { - super(props); - - this.boot(); +export default class ActivityList extends PureComponent { + store = new ActivityModel(); - if (props.type === 'admin' && !platformAdmin.isPlatformAdmin) + componentDidMount() { + if (this.props.type === 'admin' && !platformAdmin.isPlatformAdmin) platformAdmin.checkAuthorization(); } @@ -86,15 +78,22 @@ export default class ActivityList extends XScrollList { this.props.onDelete?.(name); }; - renderList() { - const { allItems } = this.store; + render() { + const { userId, type } = this.props; return ( - ( + + )} /> ); } diff --git a/components/Activity/ActivityLogList.tsx b/components/Activity/ActivityLogList.tsx index 45e0b9f9..07da7255 100644 --- a/components/Activity/ActivityLogList.tsx +++ b/components/Activity/ActivityLogList.tsx @@ -1,10 +1,9 @@ -import { observer } from 'mobx-react'; +import { ScrollListProps } from 'mobx-restful-table'; import { Badge, ListGroup } from 'react-bootstrap'; import { Log, LogModel } from '../../models/Log'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; -export interface ActivityLogListProps extends XScrollListProps { +export interface ActivityLogListProps extends ScrollListProps { store: LogModel; } @@ -24,18 +23,3 @@ export const ActivityLogListLayout = ({ ))} ); - -@observer -export class ActivityLogList extends XScrollList { - store = this.props.store; - - constructor(props: ActivityLogListProps) { - super(props); - - this.boot(); - } - - renderList() { - return ; - } -} diff --git a/components/Activity/AwardList.tsx b/components/Activity/AwardList.tsx index 19790ee9..2d50b086 100644 --- a/components/Activity/AwardList.tsx +++ b/components/Activity/AwardList.tsx @@ -1,27 +1,27 @@ import { faTrash } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { observer } from 'mobx-react'; +import { ScrollList, ScrollListProps } from 'mobx-restful-table'; +import { FC, PureComponent } from 'react'; import { Button, Image, Table } from 'react-bootstrap'; -import { Award, AwardModel } from '../../models/Award'; +import { Award } from '../../models/Award'; import { i18n } from '../../models/Translation'; import styles from '../../styles/Table.module.less'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; const { t } = i18n; -export interface AwardListProps extends XScrollListProps { - store: AwardModel; +export interface AwardListLayoutProps extends XScrollListProps { onEdit?: (id: string) => any; onDelete?: (id: string) => any; } -export const AwardTargetName = { +export const AwardTargetName = () => ({ individual: t('personal'), team: t('team'), -}; +}); -const awardTableHead = [ +const AwardTableHead = () => [ t('quantity'), t('type'), t('photo'), @@ -30,15 +30,15 @@ const awardTableHead = [ t('operation'), ]; -export const AwardListLayout = ({ +export const AwardListLayout: FC = ({ defaultData = [], onEdit, onDelete, -}: Omit) => ( +}) => ( - {awardTableHead.map((data, idx) => ( + {AwardTableHead().map((data, idx) => ( ))} @@ -48,7 +48,7 @@ export const AwardListLayout = ({ ({ quantity, target, pictures, name, description, id }) => ( - + - - - ))} - - ); - } -} +export const GitListLayout: FC = ({ + defaultData, + renderController, +}) => ( + + {defaultData?.map(item => ( + + + + ))} + +); diff --git a/components/Git/TeamGitList.tsx b/components/Git/TeamGitList.tsx index 9461438f..5f652207 100644 --- a/components/Git/TeamGitList.tsx +++ b/components/Git/TeamGitList.tsx @@ -1,42 +1,29 @@ -import { observer } from 'mobx-react'; +import { ScrollListProps } from 'mobx-restful-table'; +import { FC } from 'react'; import { Col, Row } from 'react-bootstrap'; -import { GitModel, GitRepository } from '../../models/Git'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { GitRepository } from '../../models/Git'; import { GitTeamCard, GitTeamCardProps } from './GitTeamCard'; -export interface GitListProps - extends XScrollListProps, - Pick { - store: GitModel; -} +export type TeamGitListLayoutProps = Pick< + ScrollListProps, + 'defaultData' +> & + Pick; -@observer -export class TeamGitList extends XScrollList { - store = this.props.store; - - constructor(props: GitListProps) { - super(props); - - this.boot(); - } - - renderList() { - const { renderController } = this.props, - { allItems } = this.store; - - return ( - - {allItems.map(item => ( - - - - ))} - - ); - } -} +export const TeamGitListLayout: FC = ({ + defaultData, + renderController, +}) => ( + + {defaultData?.map(item => ( + + + + ))} + +); diff --git a/components/Git/index.tsx b/components/Git/index.tsx deleted file mode 100644 index 183842f7..00000000 --- a/components/Git/index.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { observer } from 'mobx-react'; - -import { GitTemplate, GitTemplateModal } from '../../models/TemplateRepo'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; -import { CardList } from './CardList'; - -export interface GitListProps extends XScrollListProps { - store: GitTemplateModal; -} - -@observer -export class GitList extends XScrollList { - store = this.props.store; - - constructor(props: GitListProps) { - super(props); - - this.boot(); - } - - renderList() { - return ( - - ); - } -} diff --git a/components/Message/MessageList.tsx b/components/Message/MessageList.tsx index c590e466..5473b6ef 100644 --- a/components/Message/MessageList.tsx +++ b/components/Message/MessageList.tsx @@ -1,35 +1,32 @@ import { faEdit, faTrash } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { observable } from 'mobx'; import { observer } from 'mobx-react'; +import { ScrollList, ScrollListProps } from 'mobx-restful-table'; +import { FC, PureComponent } from 'react'; import { Button, Form, Table } from 'react-bootstrap'; -import { - Message, - MessageModel, - MessageType, - MessageTypeName, -} from '../../models/Message'; +import { Message, MessageType, MessageTypeName } from '../../models/Message'; import { i18n } from '../../models/Translation'; import styles from '../../styles/participant.module.less'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; const { t } = i18n; -export interface MessageListProps extends XScrollListProps { - store: MessageModel; - hideControls: boolean; +export interface MessageListLayoutProps extends XScrollListProps { + hideControls?: boolean; onEdit?: (id: string) => any; onDelete?: (id: string) => any; } -export const MessageListLayout = ({ +export const MessageListLayout: FC = ({ defaultData = [], selectedIds = [], hideControls, onSelect, onEdit, onDelete, -}: Omit) => ( +}) => (
{data}
{quantity}{AwardTargetName[target]}{AwardTargetName()[target]} {pictures! && ( ); -@observer -export class AwardList extends XScrollList { - store = this.props.store; - - constructor(props: AwardListProps) { - super(props); - - this.boot(); - } +export type AwardListProps = Pick, 'store'> & + AwardListLayoutProps; +export class AwardList extends PureComponent { onEdit = (id: string) => { this.props.onEdit?.(id); - this.store.getOne(id); + this.props.store.getOne(id); }; onDelete = (id: string) => { - const { t } = i18n; - if (!confirm(t('sure_delete_this_work'))) return; this.props.onDelete?.(id); - this.store.deleteOne(id); + this.props.store.deleteOne(id); }; - renderList() { + render() { return ( - ( + + )} /> ); } diff --git a/components/Activity/EnrollmentList.tsx b/components/Activity/EnrollmentList.tsx index 67ee2779..e6e26ff0 100644 --- a/components/Activity/EnrollmentList.tsx +++ b/components/Activity/EnrollmentList.tsx @@ -1,25 +1,26 @@ -import { observer } from 'mobx-react'; +import { ScrollList, ScrollListProps } from 'mobx-restful-table'; +import { FC, PureComponent } from 'react'; import { Button, Form, Table } from 'react-bootstrap'; import activityStore from '../../models/Activity'; import { Enrollment, statusName } from '../../models/Enrollment'; import { i18n } from '../../models/Translation'; import styles from '../../styles/participant.module.less'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; const { t } = i18n; -export interface EnrollmentListProps extends XScrollListProps { - activity: string; +export interface EnrollmentListLayoutProps + extends XScrollListProps { onPopUp?: (extensions: Enrollment['extensions']) => any; onVerify?: (userId: string, status: Enrollment['status']) => any; } -export const EnrollmentListLayout = ({ +export const EnrollmentListLayout: FC = ({ defaultData = [], onPopUp, onVerify, -}: Pick) => ( +}) => ( @@ -86,28 +87,31 @@ export const EnrollmentListLayout = ({
); -@observer -export class EnrollmentList extends XScrollList { - store = activityStore.enrollmentOf(this.props.activity); - - constructor(props: EnrollmentListProps) { - super(props); +export interface EnrollmentListProps extends EnrollmentListLayoutProps { + activity: string; +} - this.boot(); - } +export class EnrollmentList extends PureComponent { + store = activityStore.enrollmentOf(this.props.activity); - onVerify: EnrollmentListProps['onVerify'] = async (userId, status) => { + onVerify: EnrollmentListLayoutProps['onVerify'] = async (userId, status) => { await this.store.verifyOne(userId, status); this.props.onVerify?.(userId, status); }; - renderList() { + render() { return ( - ( + + )} /> ); } diff --git a/components/Git/CardList.tsx b/components/Git/CardList.tsx index bccfd46c..39e0e426 100644 --- a/components/Git/CardList.tsx +++ b/components/Git/CardList.tsx @@ -1,4 +1,5 @@ import { text2color } from 'idea-react'; +import { FC } from 'react'; import { Badge, Button, Card, Col, Form, Row } from 'react-bootstrap'; import { GitTemplate } from '../../models/TemplateRepo'; @@ -8,11 +9,11 @@ import { GitLogo } from './Logo'; const { t } = i18n; -export const CardList = ({ +export const CardList: FC> = ({ defaultData = [], selectedIds = [], onSelect, -}: XScrollListProps) => ( +}) => ( {defaultData.map( ({ diff --git a/components/Git/List.tsx b/components/Git/List.tsx index f375a386..25f07e6a 100644 --- a/components/Git/List.tsx +++ b/components/Git/List.tsx @@ -1,42 +1,29 @@ -import { observer } from 'mobx-react'; +import { ScrollListProps } from 'mobx-restful-table'; +import { FC } from 'react'; import { Col, Row } from 'react-bootstrap'; -import { GitTemplate, GitTemplateModal } from '../../models/TemplateRepo'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { GitTemplate } from '../../models/TemplateRepo'; import { GitCard, GitCardProps } from './Card'; -export interface GitListProps - extends XScrollListProps, - Pick { - store: GitTemplateModal; -} +export type GitListLayoutProps = Pick< + ScrollListProps, + 'defaultData' +> & + Pick; -@observer -export class GitList extends XScrollList { - store = this.props.store; - - constructor(props: GitListProps) { - super(props); - - this.boot(); - } - - renderList() { - const { renderController } = this.props, - { allItems } = this.store; - - return ( - - {allItems.map(item => ( -
@@ -109,37 +106,40 @@ export const MessageListLayout = ({
); -@observer -export class MessageList extends XScrollList { - store = this.props.store; +export type MessageListProps = Pick, 'store'> & + MessageListLayoutProps; - constructor(props: MessageListProps) { - super(props); +@observer +export class MessageList extends PureComponent { + @observable + selectedIds: string[] = []; - this.boot(); - } + onSelect = (list: string[]) => + (this.selectedIds = list) && this.props.onSelect?.(list); onEdit = (id: string) => { this.props.onEdit?.(id); - this.store.getOne(id); + this.props.store.getOne(id); }; onDelete = (id: string) => { if (!confirm(t('sure_delete_this_message'))) return; this.props.onDelete?.(id); - this.store.deleteOne(id); + this.props.store.deleteOne(id); }; - renderList() { + render() { return ( - ( + + )} /> ); } diff --git a/components/Organization/OrganizationList.tsx b/components/Organization/OrganizationList.tsx index c15a08b0..664f937e 100644 --- a/components/Organization/OrganizationList.tsx +++ b/components/Organization/OrganizationList.tsx @@ -1,25 +1,20 @@ -import { observer } from 'mobx-react'; +import { FC } from 'react'; import { Form, Image, Table } from 'react-bootstrap'; import { Organization, - OrganizationModel, - OrganizationTypeName, + OrganizationTypeName } from '../../models/Organization'; import { i18n } from '../../models/Translation'; import styles from '../../styles/Table.module.less'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; import { OrganizationCard } from './OrganizationCard'; const { t } = i18n; -export interface OrganizationListProps extends XScrollListProps { - store: OrganizationModel; -} - -export const OrganizationListLayout = ({ +export const OrganizationListLayout: FC> = ({ defaultData = [], -}: Pick) => ( +}) => (
    {defaultData.map(item => (
  • @@ -29,26 +24,11 @@ export const OrganizationListLayout = ({
); -@observer -export class OrganizationList extends XScrollList { - store = this.props.store; - - constructor(props: OrganizationListProps) { - super(props); - - this.boot(); - } - - renderList() { - return ; - } -} - -export const OrganizationTableLayout = ({ +export const OrganizationTableLayout: FC> = ({ defaultData = [], selectedIds = [], onSelect, -}: Omit) => ( +}) => ( @@ -124,25 +104,3 @@ export const OrganizationTableLayout = ({
); - -@observer -export class OrganizationTable extends XScrollList { - store = this.props.store; - - constructor(props: OrganizationListProps) { - super(props); - - this.boot(); - } - - renderList() { - return ( - - ); - } -} diff --git a/components/PlatformAdmin/PlatformAdminList.tsx b/components/PlatformAdmin/PlatformAdminList.tsx deleted file mode 100644 index 0adeb769..00000000 --- a/components/PlatformAdmin/PlatformAdminList.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { observer } from 'mobx-react'; - -import { PlatformAdmin, PlatformAdminModel } from '../../models/PlatformAdmin'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; -import { HackathonAdminList } from '../User/HackathonAdminList'; - -export interface PlatformAdminListProps - extends XScrollListProps { - store: PlatformAdminModel; -} - -@observer -export class PlatformAdminList extends XScrollList { - store = this.props.store; - - constructor(props: PlatformAdminListProps) { - super(props); - - this.boot(); - } - - renderList() { - return ( - - ); - } -} diff --git a/components/Team/TeamAdministratorTable.tsx b/components/Team/TeamAdministratorTable.tsx index 60718073..b0e17de0 100644 --- a/components/Team/TeamAdministratorTable.tsx +++ b/components/Team/TeamAdministratorTable.tsx @@ -1,28 +1,23 @@ import { observer } from 'mobx-react'; +import { FC } from 'react'; import { Form, Table } from 'react-bootstrap'; import sessionStore from '../../models/Session'; -import { - MembershipStatus, - TeamMember, - TeamMemberFilter, - TeamMemberModel, -} from '../../models/Team'; +import { TeamMember } from '../../models/Team'; import { i18n } from '../../models/Translation'; import styles from '../../styles/Table.module.less'; import { convertDatetime } from '../../utils/time'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; const { t } = i18n; -export interface TeamAdministratorTableProps +export interface TeamAdministratorTableLayoutProps extends XScrollListProps { - store: TeamMemberModel; onUpdateRole?: (userId: string, role: 'admin' | 'member') => any; onPopUpUpdateRoleModal?: (userId: string) => any; } -const TableHeads = [ +const TableHeads = () => [ '#', t('nick_name'), t('mail'), @@ -33,23 +28,20 @@ const TableHeads = [ t('role_type'), ]; -const RoleName = { +const RoleName = () => ({ member: t('member'), admin: t('admin'), -}; +}); -export const TeamAdministratorTableLayout = observer( - ({ - defaultData = [], - onUpdateRole, - }: Omit) => { +export const TeamAdministratorTableLayout: FC = + observer(({ defaultData = [], onUpdateRole }) => { const { id: currentUserId } = sessionStore?.user || {}; return ( - {TableHeads.map((data, idx) => ( + {TableHeads().map((data, idx) => ( ))} @@ -87,7 +79,7 @@ export const TeamAdministratorTableLayout = observer( } defaultValue={role} > - {Object.entries(RoleName).map(([key, value]) => ( + {Object.entries(RoleName()).map(([key, value]) => ( @@ -106,33 +98,4 @@ export const TeamAdministratorTableLayout = observer(
{data}
); - }, -); - -@observer -export class TeamAdministratorTable extends XScrollList { - store = this.props.store; - - filter: TeamMemberFilter = { - status: MembershipStatus.APPROVED, - }; - - constructor(props: TeamAdministratorTableProps) { - super(props); - - this.boot(); - } - - onUpdateRole: TeamAdministratorTableProps['onUpdateRole'] = (userId, role) => - this.store.updateRole(userId, role); - - renderList() { - return ( - - ); - } -} + }); diff --git a/components/Team/TeamAwardAssignment.tsx b/components/Team/TeamAwardAssignment.tsx index 5c428421..564cd01b 100644 --- a/components/Team/TeamAwardAssignment.tsx +++ b/components/Team/TeamAwardAssignment.tsx @@ -1,21 +1,20 @@ -import { observer } from 'mobx-react'; +import { FC } from 'react'; -import activityStore from '../../models/Activity'; import { AwardAssignment } from '../../models/Award'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; -interface AwardAssignmentProps extends XScrollListProps { - activity: string; - team: string; - value?: []; +export interface TeamAwardAssignmentLayoutProps + extends XScrollListProps { size?: 'sm' | 'lg'; onDelete?: (id: AwardAssignment['id']) => any; } -const TeamAwardAssignmentLayout = ({ value = [] }: AwardAssignmentProps) => ( +export const TeamAwardAssignmentLayout: FC = ({ + defaultData = [], +}) => ( <>
    - {value.map(({ updatedAt, id, description, award: { name } }) => ( + {defaultData.map(({ updatedAt, id, description, award: { name } }) => (
  1. {name}
  2. @@ -23,25 +22,3 @@ const TeamAwardAssignmentLayout = ({ value = [] }: AwardAssignmentProps) => (
); - -@observer -export class TeamAwardAssignmentList extends XScrollList { - store = activityStore - .teamOf(this.props.activity) - .assignmentOf(this.props.team); - - constructor(props: AwardAssignmentProps) { - super(props); - - this.boot(); - } - - renderList() { - return ( - - ); - } -} diff --git a/components/Team/TeamAwardCard.tsx b/components/Team/TeamAwardCard.tsx index 4dbb5c15..c4e32ef6 100644 --- a/components/Team/TeamAwardCard.tsx +++ b/components/Team/TeamAwardCard.tsx @@ -2,13 +2,16 @@ import { faAward } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import classNames from 'classnames'; import { Avatar } from 'idea-react'; +import { ScrollList } from 'mobx-restful-table'; +import { PureComponent } from 'react'; import { Accordion, Button } from 'react-bootstrap'; +import activityStore from '../../models/Activity'; import { Team } from '../../models/Team'; import { i18n } from '../../models/Translation'; -import { TeamAwardAssignmentList } from './TeamAwardAssignment'; -import { TeamMemberList } from './TeamMemberList'; -import { TeamWorkLi } from './TeamWork'; +import { TeamAwardAssignmentLayout } from './TeamAwardAssignment'; +import { TeamMemberListLayout } from './TeamMemberList'; +import { SimpleTeamWorkListLayout } from './TeamWork'; const { t } = i18n; @@ -27,68 +30,110 @@ export interface TeamAwardCardProps onDelete?: (id: string) => any; } -export const TeamAwardCard = ({ - className, - id, - hackathonName, - displayName, - membersCount, - creatorId, - creator, - onAssign, - onDelete, -}: TeamAwardCardProps) => ( -
- - {displayName} - - - {t('team_leader')} +export class TeamAwardCard extends PureComponent { + memberStore = activityStore + .teamOf(this.props.hackathonName) + .memberOf(this.props.id); - - - {creator.nickname} - - - - - - {t('member')} {t('a_total_of')} - {membersCount} - {t('people')} - - - - - - - {t('score')} - - - - {t('work_list')} - - - - - - {t('prize_list')} - - - - - + workStore = activityStore + .teamOf(this.props.hackathonName) + .workOf(this.props.id); - -
-); + assignmentStore = activityStore + .teamOf(this.props.hackathonName) + .assignmentOf(this.props.id); + + renderDetail() { + const { id, hackathonName, membersCount } = this.props; + + return ( + + + + {t('member')} {t('a_total_of')} + {membersCount} + {t('people')} + + + ( + + )} + /> + + + + {t('score')} + + + + {t('work_list')} + + ( + + )} + /> + + + + {t('prize_list')} + + ( + + )} + /> + + + + ); + } + + render() { + const { + className, + id, + hackathonName, + displayName, + creatorId, + creator, + onAssign, + } = this.props; + + return ( +
+ + {displayName} + + + {t('team_leader')} + + + + {creator.nickname} + + + {this.renderDetail()} + + +
+ ); + } +} diff --git a/components/Team/TeamAwardList.tsx b/components/Team/TeamAwardList.tsx index 878cc554..ff606ba2 100644 --- a/components/Team/TeamAwardList.tsx +++ b/components/Team/TeamAwardList.tsx @@ -1,23 +1,23 @@ -import { observer } from 'mobx-react'; +import { ScrollList, ScrollListProps } from 'mobx-restful-table'; +import { FC, PureComponent } from 'react'; import { Col, Row } from 'react-bootstrap'; -import { Team, TeamModel } from '../../models/Team'; +import { Team } from '../../models/Team'; import { i18n } from '../../models/Translation'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; import { TeamAwardCard } from './TeamAwardCard'; const { t } = i18n; -export interface TeamAwardListProps extends XScrollListProps { - store: TeamModel; +export interface TeamAwardListLayoutProps extends XScrollListProps { onAssign?: (id: Team['id']) => any; onDelete?: (id: Team['id']) => any; } -const TeamAwardListLayout = ({ +const TeamAwardListLayout: FC = ({ defaultData = [], onAssign, -}: Omit) => ( +}) => ( {defaultData.map(item => ( @@ -31,34 +31,34 @@ const TeamAwardListLayout = ({ ); -@observer -export class TeamAwardList extends XScrollList { - store = this.props.store; - - constructor(props: TeamAwardListProps) { - super(props); - - this.boot(); - } +export type TeamAwardListProps = Pick, 'store'> & + TeamAwardListLayoutProps; +export class TeamAwardList extends PureComponent { onAssign = (id: string) => { this.props.onAssign?.(id); - this.store.getOne(id); + this.props.store.getOne(id); }; onDelete = (id: string) => { if (!confirm(t('sure_delete_this_work'))) return; this.props.onDelete?.(id); - this.store.deleteOne(id); + this.props.store.deleteOne(id); }; - renderList() { + render() { return ( - ( + + )} /> ); } diff --git a/components/Team/TeamList.tsx b/components/Team/TeamList.tsx index 3b13adff..602f7824 100644 --- a/components/Team/TeamList.tsx +++ b/components/Team/TeamList.tsx @@ -1,11 +1,10 @@ -import { observer } from 'mobx-react'; +import { ScrollListProps } from 'mobx-restful-table'; import { Col, Row } from 'react-bootstrap'; import { Team, TeamModel } from '../../models/Team'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; import { TeamCard } from './TeamCard'; -export interface TeamListProps extends XScrollListProps { +export interface TeamListProps extends ScrollListProps { store: TeamModel; } @@ -20,18 +19,3 @@ export const TeamListLayout = ({ ))}
); - -@observer -export class TeamList extends XScrollList { - store = this.props.store; - - constructor(props: TeamListProps) { - super(props); - - this.boot(); - } - - renderList() { - return ; - } -} diff --git a/components/Team/TeamMemberList.tsx b/components/Team/TeamMemberList.tsx index a27b8e7a..761b8bb9 100644 --- a/components/Team/TeamMemberList.tsx +++ b/components/Team/TeamMemberList.tsx @@ -1,9 +1,7 @@ import { Avatar } from 'idea-react'; -import { observer } from 'mobx-react'; -import activityStore from '../../models/Activity'; import { TeamMember } from '../../models/Team'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; export interface TeamMemberListProps extends XScrollListProps { activity: string; @@ -25,18 +23,3 @@ export const TeamMemberListLayout = ({ ))} ); - -@observer -export class TeamMemberList extends XScrollList { - store = activityStore.teamOf(this.props.activity).memberOf(this.props.team); - - constructor(props: TeamMemberListProps) { - super(props); - - this.boot(); - } - - renderList() { - return ; - } -} diff --git a/components/Team/TeamParticipantTable.tsx b/components/Team/TeamParticipantTable.tsx index db4ffa84..06572206 100644 --- a/components/Team/TeamParticipantTable.tsx +++ b/components/Team/TeamParticipantTable.tsx @@ -1,30 +1,25 @@ -import { observer } from 'mobx-react'; +import { FC } from 'react'; import { Form, Table } from 'react-bootstrap'; -import { - MembershipStatus, - TeamMember, - TeamMemberModel, -} from '../../models/Team'; +import { MembershipStatus, TeamMember } from '../../models/Team'; import { i18n } from '../../models/Translation'; import styles from '../../styles/Table.module.less'; import { convertDatetime } from '../../utils/time'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; const { t } = i18n; -export interface TeamParticipantTableProps +export interface TeamParticipantTableLayoutProps extends XScrollListProps { - store: TeamMemberModel; onApprove?: (userId: string, status: MembershipStatus) => any; } -const StatusName: Record = { +const StatusName: () => Record = () => ({ approved: t('status_approved'), pendingApproval: t('status_pending'), -}; +}); -const TableHeads = [ +const TableHeads = () => [ '#', t('nick_name'), t('mail'), @@ -36,14 +31,13 @@ const TableHeads = [ t('status'), ]; -export const TeamParticipantTableLayout = ({ - defaultData = [], - onApprove, -}: Omit) => ( +export const TeamParticipantTableLayout: FC< + TeamParticipantTableLayoutProps +> = ({ defaultData = [], onApprove }) => ( - {TableHeads.map((data, idx) => ( + {TableHeads().map((data, idx) => ( ))} @@ -84,7 +78,7 @@ export const TeamParticipantTableLayout = ({ } defaultValue={status} > - {Object.entries(StatusName).map(([key, value]) => ( + {Object.entries(StatusName()).map(([key, value]) => ( @@ -103,26 +97,3 @@ export const TeamParticipantTableLayout = ({
{data}
); - -@observer -export class TeamParticipantTable extends XScrollList { - store = this.props.store; - - constructor(props: TeamParticipantTableProps) { - super(props); - - this.boot(); - } - - onApprove: TeamParticipantTableProps['onApprove'] = (userId, status) => - this.store.approveOne(userId, status); - - renderList() { - return ( - - ); - } -} diff --git a/components/Team/TeamWork.tsx b/components/Team/TeamWork.tsx index 7d1d8837..0e55683a 100644 --- a/components/Team/TeamWork.tsx +++ b/components/Team/TeamWork.tsx @@ -1,17 +1,17 @@ -import { observer } from 'mobx-react'; +import { FC } from 'react'; -import activityStore from '../../models/Activity'; import { TeamWork } from '../../models/Team'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; -export interface TeamWorkProps extends XScrollListProps { - activity: string; - team: string; +export interface SimpleTeamWorkListLayoutProps + extends XScrollListProps { size?: 'sm' | 'lg'; onDelete?: (id: TeamWork['id']) => any; } -const TeamWorkLiLayout = ({ defaultData = [] }: TeamWorkProps) => ( +export const SimpleTeamWorkListLayout: FC = ({ + defaultData = [], +}) => (
    {defaultData.map(({ updatedAt, id, title, description, type, url }) => (
  • @@ -28,20 +28,3 @@ const TeamWorkLiLayout = ({ defaultData = [] }: TeamWorkProps) => ( ))}
); - -@observer -export class TeamWorkLi extends XScrollList { - store = activityStore.teamOf(this.props.activity).workOf(this.props.team); - - constructor(props: TeamWorkProps) { - super(props); - - this.boot(); - } - - renderList() { - return ( - - ); - } -} diff --git a/components/Team/TeamWorkList.tsx b/components/Team/TeamWorkList.tsx index 317ae811..c8ba81ef 100644 --- a/components/Team/TeamWorkList.tsx +++ b/components/Team/TeamWorkList.tsx @@ -1,6 +1,7 @@ import { faCalendarDay } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { observer } from 'mobx-react'; +import { ScrollList } from 'mobx-restful-table'; +import { FC, PureComponent } from 'react'; import { Button, Card, @@ -14,27 +15,26 @@ import { import activityStore from '../../models/Activity'; import { TeamWork, TeamWorkType } from '../../models/Team'; import { i18n } from '../../models/Translation'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { XScrollListProps } from '../layout/ScrollList'; const { t } = i18n; -export interface TeamWorkListProps extends XScrollListProps { +export interface TeamWorkListLayoutProps extends XScrollListProps { activity: string; team: string; size?: 'sm' | 'lg'; - value?: TeamWork[]; controls?: boolean; onDelete?: (id: TeamWork['id']) => any; } -export const TeamWorkListLayout = ({ +export const TeamWorkListLayout: FC = ({ defaultData = [], size, controls, onDelete, activity, team, -}: TeamWorkListProps) => ( +}) => ( {controls && (
@@ -116,25 +116,24 @@ export const TeamWorkListLayout = ({ ); -@observer -export class TeamWorkList extends XScrollList { +export class TeamWorkList extends PureComponent { store = activityStore.teamOf(this.props.activity).workOf(this.props.team); - constructor(props: TeamWorkListProps) { - super(props); - - this.boot(); - } - onDelete = (id?: string) => id && confirm(t('confirm_delete_work')) && this.store.deleteOne(id); - renderList() { + render() { return ( - ( + + )} /> ); } diff --git a/components/Team/WorkEdit.tsx b/components/Team/WorkEdit.tsx index 46340374..040ed76b 100644 --- a/components/Team/WorkEdit.tsx +++ b/components/Team/WorkEdit.tsx @@ -1,4 +1,5 @@ import { SpinnerButton } from 'idea-react'; +import { computed, observable } from 'mobx'; import { observer } from 'mobx-react'; import { FileUploader } from 'mobx-restful-table'; import { FormEvent, PureComponent } from 'react'; @@ -11,16 +12,6 @@ import { i18n } from '../../models/Translation'; const { t } = i18n; -const workTypes = [ - { title: t('website'), value: 'website' }, - { title: t('image'), value: 'image' }, - { title: t('video'), value: 'video' }, - { title: 'Word', value: 'word' }, - { title: 'PowerPoint', value: 'powerpoint' }, - { title: 'PDF', value: 'pdf' }, - { title: 'ZIP', value: 'zip' }, -]; - export interface WorkEditProps { name: string; tid: string; @@ -31,10 +22,40 @@ export interface WorkEditProps { export class WorkEdit extends PureComponent { store = activityStore.teamOf(this.props.name).workOf(this.props.tid); - componentDidMount() { + @computed + get workTypes() { + return [ + { title: t('website'), value: 'website' }, + { title: t('image'), value: 'image', accept: 'image/*' }, + { title: t('video'), value: 'video', accept: 'video/*' }, + { + title: 'Word', + value: 'word', + accept: + 'application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document', + }, + { + title: 'PowerPoint', + value: 'powerpoint', + accept: + 'application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation', + }, + { title: 'PDF', value: 'pdf', accept: 'application/pdf' }, + { title: 'ZIP', value: 'zip', accept: 'application/zip' }, + ]; + } + + @observable + currentType = this.workTypes[0].value; + + async componentDidMount() { const { wid } = this.props; - if (wid) this.store.getOne(wid); + if (!wid) return; + + const { type } = await this.store.getOne(wid); + + this.currentType = type; } handleSubmit = async (event: FormEvent) => { @@ -49,7 +70,8 @@ export class WorkEdit extends PureComponent { }; render() { - const { uploading, currentOne } = this.store; + const { workTypes, currentType } = this, + { uploading, currentOne } = this.store; const loading = uploading > 0 || fileStore.uploading > 0; return ( @@ -102,12 +124,13 @@ export class WorkEdit extends PureComponent { value={value} id={value} key={value} - defaultChecked={currentOne?.type === value} + checked={currentType === value} + onClick={() => (this.currentType = value)} /> ))} - {currentOne?.type === 'website' && ( + {currentType === 'website' ? ( {t('work_url')} @@ -122,8 +145,7 @@ export class WorkEdit extends PureComponent { /> - )} - {currentOne?.type !== 'website' && ( + ) : ( {t('upload_file')} @@ -131,8 +153,10 @@ export class WorkEdit extends PureComponent { value === currentType)?.accept + } max={1} required defaultValue={currentOne?.url ? [currentOne.url] : []} diff --git a/components/User/HackathonAdminList.tsx b/components/User/HackathonAdminList.tsx index fd747217..f0971df9 100644 --- a/components/User/HackathonAdminList.tsx +++ b/components/User/HackathonAdminList.tsx @@ -1,5 +1,6 @@ import 'array-unique-proposal'; +import { FC } from 'react'; import { Form, Table } from 'react-bootstrap'; import { HackathonAdmin } from '../../models/HackathonAdmin'; @@ -23,11 +24,11 @@ const TableHeads = [ t('remark'), ]; -export const HackathonAdminList = ({ +export const HackathonAdminList: FC> = ({ defaultData = [], selectedIds = [], onSelect, -}: XScrollListProps) => ( +}) => ( diff --git a/components/User/StaffList.tsx b/components/User/StaffList.tsx deleted file mode 100644 index 0323e1c2..00000000 --- a/components/User/StaffList.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { observer } from 'mobx-react'; - -import { Staff, StaffModel } from '../../models/Staff'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; -import { HackathonAdminList } from './HackathonAdminList'; - -export interface StaffListProps extends XScrollListProps { - store: StaffModel; -} - -@observer -export class StaffList extends XScrollList { - store = this.props.store; - - constructor(props: StaffListProps) { - super(props); - - this.boot(); - } - - renderList() { - return ( - - ); - } -} diff --git a/components/User/UserBar.tsx b/components/User/UserBar.tsx index b6be9eb3..8ca88dbc 100644 --- a/components/User/UserBar.tsx +++ b/components/User/UserBar.tsx @@ -1,5 +1,4 @@ import { observer } from 'mobx-react'; -import Link from 'next/link'; import { Button, Dropdown } from 'react-bootstrap'; import sessionStore from '../../models/Session'; @@ -21,9 +20,10 @@ const UserBar = observer(() => { ) : ( <> - - - + + {showName} diff --git a/components/User/UserList.tsx b/components/User/UserList.tsx index cbfbc0c4..5a14c98c 100644 --- a/components/User/UserList.tsx +++ b/components/User/UserList.tsx @@ -1,24 +1,24 @@ -import { observer } from 'mobx-react'; +import { ScrollList, ScrollListProps } from 'mobx-restful-table'; +import { FC, PureComponent } from 'react'; import { Button, Col, Form, Row, Table } from 'react-bootstrap'; import { formToJSON } from 'web-utility'; import { i18n } from '../../models/Translation'; -import { User, UserModel } from '../../models/User'; -import { XScrollList, XScrollListProps } from '../layout/ScrollList'; +import { User, UserFilter } from '../../models/User'; +import { XScrollListProps } from '../layout/ScrollList'; const { t } = i18n; -export interface UserListProps extends XScrollListProps { - store: UserModel; +export interface UserListLayoutProps extends XScrollListProps { onSearch?: (keyword: string) => any; } -export const UserListLayout = ({ +export const UserListLayout: FC = ({ defaultData = [], selectedIds, onSelect, onSearch, -}: UserListProps) => ( +}) => ( <>
{ @@ -88,32 +88,28 @@ export const UserListLayout = ({ ); -@observer -export class UserList extends XScrollList { - store = this.props.store; - - constructor(props: UserListProps) { - super(props); - - this.boot(); - } +export type UserListProps = Pick, 'store'> & + UserListLayoutProps; +export class UserList extends PureComponent { onSearch = async (keyword: string) => { - this.store.clear(); + const { store, onSearch } = this.props; + + store.clear(); - await this.store.getList({ keyword }); + await store.getList({ keyword }); - this.props.onSearch?.(keyword); + onSearch?.(keyword); }; - renderList() { + render() { return ( - ( + + )} /> ); } diff --git a/components/layout/ScrollList.tsx b/components/layout/ScrollList.tsx index f2ec56f2..e4ab0894 100644 --- a/components/layout/ScrollList.tsx +++ b/components/layout/ScrollList.tsx @@ -1,36 +1,8 @@ -import { Loading } from 'idea-react'; -import { observable } from 'mobx'; import { DataObject } from 'mobx-restful'; -import { ScrollList, ScrollListProps } from 'mobx-restful-table'; - -import { i18n } from '../../models/Translation'; +import { ScrollListProps } from 'mobx-restful-table'; export interface XScrollListProps - extends ScrollListProps { + extends Pick, 'defaultData'> { selectedIds?: string[]; onSelect?: (selectedIds: string[]) => any; } - -export abstract class XScrollList< - P extends XScrollListProps, -> extends ScrollList

{ - translator = i18n; - - @observable - selectedIds: string[] = []; - - onSelect = (list: string[]) => - (this.selectedIds = list) && this.props.onSelect?.(list); - - render() { - const { downloading, uploading } = this.store; - - return ( - <> - {(downloading > 0 || uploading > 0) && } - - {super.render()} - - ); - } -} diff --git a/package.json b/package.json index 039daeea..23032d02 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "array-unique-proposal": "^0.3.4", "classnames": "^2.3.2", "echarts-jsx": "^0.5.0", - "idea-react": "^1.0.0-rc.3", + "idea-react": "^1.0.0-rc.5", "koajax": "^0.8.4", "leaflet": "^1.9.4", "leaflet.chinatmsproviders": "^3.0.6", @@ -32,7 +32,7 @@ "mobx-i18n": "^0.3.15", "mobx-react": "^6.3.1", "mobx-restful": "^0.6.5", - "mobx-restful-table": "^0.11.0", + "mobx-restful-table": "^1.0.4", "next": "^12.3.4", "react": "^17.0.2", "react-bootstrap": "^2.8.0", diff --git a/pages/activity/[name]/index.tsx b/pages/activity/[name]/index.tsx index e5688383..b014ef64 100644 --- a/pages/activity/[name]/index.tsx +++ b/pages/activity/[name]/index.tsx @@ -10,6 +10,7 @@ import { Loading } from 'idea-react'; import { computed, observable } from 'mobx'; import { textJoin } from 'mobx-i18n'; import { observer } from 'mobx-react'; +import { ScrollList } from 'mobx-restful-table'; import { InferGetServerSidePropsType } from 'next'; import dynamic from 'next/dynamic'; import { PureComponent } from 'react'; @@ -31,7 +32,7 @@ import { MessageList } from '../../../components/Message/MessageList'; import { OrganizationListLayout } from '../../../components/Organization/OrganizationList'; import { TeamCard } from '../../../components/Team/TeamCard'; import { TeamCreateModal } from '../../../components/Team/TeamCreateModal'; -import { TeamList } from '../../../components/Team/TeamList'; +import { TeamListLayout } from '../../../components/Team/TeamList'; import activityStore, { Activity, ActivityModel, @@ -318,7 +319,13 @@ export default class ActivityPage extends PureComponent< )}


{t('all_teams')}

- + ( + + )} + /> diff --git a/pages/activity/[name]/manage/administrator.tsx b/pages/activity/[name]/manage/administrator.tsx index 1343e348..5d78d84b 100644 --- a/pages/activity/[name]/manage/administrator.tsx +++ b/pages/activity/[name]/manage/administrator.tsx @@ -2,13 +2,14 @@ import { faPlus, faTrash } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { observable } from 'mobx'; import { observer } from 'mobx-react'; +import { ScrollList } from 'mobx-restful-table'; import { InferGetServerSidePropsType } from 'next'; import { FormEvent, PureComponent } from 'react'; import { Badge, Button, Col, Form, ListGroup, Row } from 'react-bootstrap'; import { ActivityManageFrame } from '../../../../components/Activity/ActivityManageFrame'; import { AdministratorModal } from '../../../../components/User/ActivityAdministratorModal'; -import { StaffList } from '../../../../components/User/StaffList'; +import { HackathonAdminList } from '../../../../components/User/HackathonAdminList'; import activityStore from '../../../../models/Activity'; import { i18n } from '../../../../models/Translation'; import { withRoute } from '../../../api/core'; @@ -23,6 +24,7 @@ export default class AdministratorPage extends PureComponent< > { store = activityStore.staffOf(this.props.route.params!.name + ''); + @observable selectedIds: string[] = []; @observable @@ -102,9 +104,16 @@ export default class AdministratorPage extends PureComponent<
- (this.selectedIds = list)} + renderList={allItems => ( + (this.selectedIds = list)} + /> + )} /> diff --git a/pages/activity/[name]/manage/award.tsx b/pages/activity/[name]/manage/award.tsx index 14a03f2f..3a8c48c5 100644 --- a/pages/activity/[name]/manage/award.tsx +++ b/pages/activity/[name]/manage/award.tsx @@ -20,7 +20,7 @@ export const getServerSideProps = withRoute<{ name: string }>(); const { t } = i18n; @observer -class AwardPage extends PureComponent< +export default class AwardPage extends PureComponent< InferGetServerSidePropsType > { store = activityStore.awardOf(this.props.route.params!.name); @@ -106,7 +106,7 @@ class AwardPage extends PureComponent< - {Object.entries(AwardTargetName).map(([value, name]) => ( + {Object.entries(AwardTargetName()).map(([value, name]) => ( - (this.selectedIds = list)} + renderList={allItems => ( + (this.selectedIds = list)} + /> + )} /> diff --git a/pages/activity/[name]/manage/team.tsx b/pages/activity/[name]/manage/team.tsx index 24567c86..b3118499 100644 --- a/pages/activity/[name]/manage/team.tsx +++ b/pages/activity/[name]/manage/team.tsx @@ -1,4 +1,5 @@ import { observer } from 'mobx-react'; +import { ScrollList } from 'mobx-restful-table'; import { InferGetServerSidePropsType } from 'next'; import { FormEvent, PureComponent } from 'react'; import { @@ -11,7 +12,7 @@ import { import { formToJSON } from 'web-utility'; import { ActivityManageFrame } from '../../../../components/Activity/ActivityManageFrame'; -import { TeamList } from '../../../../components/Team/TeamList'; +import { TeamListLayout } from '../../../../components/Team/TeamList'; import activityStore from '../../../../models/Activity'; import { i18n } from '../../../../models/Translation'; import { withRoute } from '../../../api/core'; @@ -62,7 +63,11 @@ export default class TeamManagePage extends PureComponent< - + } + /> ); diff --git a/pages/activity/[name]/team/[tid]/index.tsx b/pages/activity/[name]/team/[tid]/index.tsx index de139818..4a5b31dc 100644 --- a/pages/activity/[name]/team/[tid]/index.tsx +++ b/pages/activity/[name]/team/[tid]/index.tsx @@ -1,6 +1,7 @@ import { Icon } from 'idea-react'; import { computed, observable } from 'mobx'; import { observer } from 'mobx-react'; +import { ScrollList } from 'mobx-restful-table'; import type { InferGetServerSidePropsType } from 'next'; import { FormEvent, PureComponent } from 'react'; import { Button, Card, Col, Container, Row, Tab, Tabs } from 'react-bootstrap'; @@ -10,7 +11,7 @@ import { CommentBox } from '../../../../../components/CommentBox'; import { MainBreadcrumb } from '../../../../../components/layout/MainBreadcrumb'; import PageHead from '../../../../../components/layout/PageHead'; import { JoinTeamModal } from '../../../../../components/Team/JoinTeamModal'; -import { TeamMemberList } from '../../../../../components/Team/TeamMemberList'; +import { TeamMemberListLayout } from '../../../../../components/Team/TeamMemberList'; import { TeamWorkList } from '../../../../../components/Team/TeamWorkList'; import activityStore, { Activity, @@ -228,9 +229,12 @@ export default class TeamPage extends PureComponent<

{t('team_members')}

- ( + + )} defaultData={teamMemberList} /> diff --git a/pages/activity/[name]/team/[tid]/manage/git.tsx b/pages/activity/[name]/team/[tid]/manage/git.tsx index 82ab7e94..188fedfa 100644 --- a/pages/activity/[name]/team/[tid]/manage/git.tsx +++ b/pages/activity/[name]/team/[tid]/manage/git.tsx @@ -1,5 +1,6 @@ -import { action, observable } from 'mobx'; +import { observable } from 'mobx'; import { observer } from 'mobx-react'; +import { ScrollList } from 'mobx-restful-table'; import { InferGetServerSidePropsType } from 'next'; import { FormEvent, PureComponent } from 'react'; import { @@ -12,10 +13,10 @@ import { } from 'react-bootstrap'; import { buildURLData, formToJSON } from 'web-utility'; -import { GitList } from '../../../../../../components/Git/List'; +import { GitListLayout } from '../../../../../../components/Git/List'; import { - GitListProps, - TeamGitList, + TeamGitListLayout, + TeamGitListLayoutProps, } from '../../../../../../components/Git/TeamGitList'; import { TeamManageFrame } from '../../../../../../components/Team/TeamManageFrame'; import activityStore from '../../../../../../models/Activity'; @@ -103,13 +104,17 @@ export default class GitPage extends PureComponent< {t('create')} - + } + /> ); } - renderController: GitListProps['renderController'] = ({ + renderController: TeamGitListLayoutProps['renderController'] = ({ id, name, default_branch, @@ -176,9 +181,15 @@ export default class GitPage extends PureComponent< - ( + + )} /> diff --git a/pages/activity/[name]/team/[tid]/manage/participant.tsx b/pages/activity/[name]/team/[tid]/manage/participant.tsx index 5e817b01..5253b421 100644 --- a/pages/activity/[name]/team/[tid]/manage/participant.tsx +++ b/pages/activity/[name]/team/[tid]/manage/participant.tsx @@ -1,4 +1,5 @@ import { observer } from 'mobx-react'; +import { ScrollList } from 'mobx-restful-table'; import { InferGetServerSidePropsType } from 'next'; import { PureComponent } from 'react'; @@ -6,7 +7,7 @@ import { TeamManageBaseRouterProps, TeamManageFrame, } from '../../../../../../components/Team/TeamManageFrame'; -import { TeamParticipantTable } from '../../../../../../components/Team/TeamParticipantTable'; +import { TeamParticipantTableLayout } from '../../../../../../components/Team/TeamParticipantTable'; import activityStore from '../../../../../../models/Activity'; import { i18n } from '../../../../../../models/Translation'; import { withRoute, withTranslation } from '../../../../../api/core'; @@ -37,7 +38,16 @@ export default class TeamParticipantPage extends PureComponent< path={resolvedUrl} title={t('team_registration')} > - + ( + store.approveOne(userId, status)} + /> + )} + /> ); } diff --git a/pages/activity/[name]/team/[tid]/manage/role.tsx b/pages/activity/[name]/team/[tid]/manage/role.tsx index 7b07772c..7b73774e 100644 --- a/pages/activity/[name]/team/[tid]/manage/role.tsx +++ b/pages/activity/[name]/team/[tid]/manage/role.tsx @@ -1,14 +1,16 @@ import { observable } from 'mobx'; import { observer } from 'mobx-react'; +import { ScrollList } from 'mobx-restful-table'; import { InferGetServerSidePropsType } from 'next'; import { PureComponent } from 'react'; -import { TeamAdministratorTable } from '../../../../../../components/Team/TeamAdministratorTable'; +import { TeamAdministratorTableLayout } from '../../../../../../components/Team/TeamAdministratorTable'; import { TeamManageBaseRouterProps, TeamManageFrame, } from '../../../../../../components/Team/TeamManageFrame'; import activityStore from '../../../../../../models/Activity'; +import { MembershipStatus } from '../../../../../../models/Team'; import { i18n } from '../../../../../../models/Translation'; import { withRoute, withTranslation } from '../../../../../api/core'; @@ -41,9 +43,18 @@ export default class TeamAdministratorPage extends PureComponent< path={resolvedUrl} title={t('role_management')} > - (this.userId = userId)} + filter={{ status: MembershipStatus.APPROVED }} + renderList={allItems => ( + store.updateRole(userId, role)} + onPopUpUpdateRoleModal={userId => (this.userId = userId)} + /> + )} /> ); diff --git a/pages/admin/platform-admin.tsx b/pages/admin/platform-admin.tsx index 64457d3b..0c13ec35 100644 --- a/pages/admin/platform-admin.tsx +++ b/pages/admin/platform-admin.tsx @@ -2,12 +2,13 @@ import { faPlus, faTrash } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { observable } from 'mobx'; import { observer } from 'mobx-react'; +import { ScrollList } from 'mobx-restful-table'; import { FormEvent, PureComponent } from 'react'; import { Button, Form } from 'react-bootstrap'; import { PlatformAdminFrame } from '../../components/PlatformAdmin/PlatformAdminFrame'; -import { PlatformAdminList } from '../../components/PlatformAdmin/PlatformAdminList'; import { PlatformAdminModal } from '../../components/PlatformAdmin/PlatformAdminModal'; +import { HackathonAdminList } from '../../components/User/HackathonAdminList'; import { PlatformAdminModel } from '../../models/PlatformAdmin'; import { i18n } from '../../models/Translation'; @@ -25,6 +26,7 @@ export default function PlatformAdminPage() { class PlatformAdmin extends PureComponent { store = new PlatformAdminModel(); + @observable selectedIds: string[] = []; @observable @@ -63,9 +65,16 @@ class PlatformAdmin extends PureComponent { {t('delete')} - (this.selectedIds = list)} + renderList={allItems => ( + (this.selectedIds = list)} + /> + )} /> diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98fb6d19..f7b9a1d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.1' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -36,8 +36,8 @@ dependencies: specifier: ^0.5.0 version: 0.5.0(react@17.0.2)(typescript@5.1.6) idea-react: - specifier: ^1.0.0-rc.3 - version: 1.0.0-rc.3(@types/react@17.0.62)(jsdom@21.1.2)(react-dom@17.0.2)(react@17.0.2)(typescript@5.1.6) + specifier: ^1.0.0-rc.5 + version: 1.0.0-rc.5(@types/react@17.0.62)(jsdom@21.1.2)(react-dom@17.0.2)(react@17.0.2)(typescript@5.1.6) koajax: specifier: ^0.8.4 version: 0.8.4(jsdom@21.1.2)(typescript@5.1.6) @@ -63,8 +63,8 @@ dependencies: specifier: ^0.6.5 version: 0.6.5(jsdom@21.1.2)(mobx@5.15.7)(typescript@5.1.6) mobx-restful-table: - specifier: ^0.11.0 - version: 0.11.0(@types/react@17.0.62)(jsdom@21.1.2)(mobx@5.15.7)(react-dom@17.0.2)(react@17.0.2)(typescript@5.1.6) + specifier: ^1.0.4 + version: 1.0.4(@types/react@17.0.62)(mobx-i18n@0.3.15)(mobx-react@6.3.1)(mobx-restful@0.6.5)(mobx@5.15.7)(react-dom@17.0.2)(react@17.0.2)(typescript@5.1.6) next: specifier: ^12.3.4 version: 12.3.4(@babel/core@7.22.8)(react-dom@17.0.2)(react@17.0.2) @@ -2078,8 +2078,8 @@ packages: resolution: {integrity: sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==} dev: false - /@typescript-eslint/parser@5.61.0(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} + /@typescript-eslint/parser@5.62.0(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2088,9 +2088,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.61.0 - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) debug: 4.3.4 eslint: 8.44.0 typescript: 5.1.6 @@ -2098,21 +2098,21 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@5.61.0: - resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==} + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/visitor-keys': 5.61.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/types@5.61.0: - resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==} + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree@5.61.0(typescript@5.1.6): - resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==} + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -2120,8 +2120,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/visitor-keys': 5.61.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2132,11 +2132,11 @@ packages: - supports-color dev: true - /@typescript-eslint/visitor-keys@5.61.0: - resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==} + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.1 dev: true @@ -2677,8 +2677,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001514 - electron-to-chromium: 1.4.454 + caniuse-lite: 1.0.30001515 + electron-to-chromium: 1.4.455 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.9) @@ -2702,8 +2702,8 @@ packages: engines: {node: '>=6'} dev: true - /caniuse-lite@1.0.30001514: - resolution: {integrity: sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==} + /caniuse-lite@1.0.30001515: + resolution: {integrity: sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==} /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -3109,8 +3109,8 @@ packages: jake: 10.8.7 dev: true - /electron-to-chromium@1.4.454: - resolution: {integrity: sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==} + /electron-to-chromium@1.4.455: + resolution: {integrity: sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA==} /element-internals-polyfill@1.3.5: resolution: {integrity: sha512-mXwGeAwECFEJso68YsQUAzXzafEywE1bnYUbcgwjPAUJUwX50ZHpI3DhRWggj/bybEslYwkmdctp+7gcY68t3g==} @@ -3194,7 +3194,7 @@ packages: string.prototype.trimstart: 1.0.6 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 + which-typed-array: 1.1.10 dev: true /es-module-lexer@1.3.0: @@ -3261,11 +3261,11 @@ packages: dependencies: '@next/eslint-plugin-next': 12.3.4 '@rushstack/eslint-patch': 1.3.2 - '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.62.0(eslint@8.44.0)(typescript@5.1.6) eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5)(eslint@8.44.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.44.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.44.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.44.0) eslint-plugin-react: 7.32.2(eslint@8.44.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.44.0) @@ -3294,7 +3294,7 @@ packages: dependencies: debug: 4.3.4 eslint: 8.44.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.44.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.44.0) glob: 7.2.3 is-glob: 4.0.3 resolve: 1.22.2 @@ -3303,7 +3303,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@2.7.1)(eslint@8.44.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@2.7.1)(eslint@8.44.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -3324,7 +3324,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.62.0(eslint@8.44.0)(typescript@5.1.6) debug: 3.2.7 eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 @@ -3333,7 +3333,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.44.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.44.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -3343,7 +3343,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.62.0(eslint@8.44.0)(typescript@5.1.6) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 @@ -3351,14 +3351,14 @@ packages: doctrine: 2.1.0 eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@2.7.1)(eslint@8.44.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@2.7.1)(eslint@8.44.0) has: 1.0.3 is-core-module: 2.12.1 is-glob: 4.0.3 minimatch: 3.1.2 object.values: 1.1.6 resolve: 1.22.2 - semver: 6.3.0 + semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -3388,7 +3388,7 @@ packages: minimatch: 3.1.2 object.entries: 1.1.6 object.fromentries: 2.0.6 - semver: 6.3.0 + semver: 6.3.1 dev: true /eslint-plugin-react-hooks@4.6.0(eslint@8.44.0): @@ -3420,7 +3420,7 @@ packages: object.values: 1.1.6 prop-types: 15.8.1 resolve: 2.0.0-next.4 - semver: 6.3.0 + semver: 6.3.1 string.prototype.matchall: 4.0.8 dev: true @@ -3961,8 +3961,8 @@ packages: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} dev: true - /idea-react@1.0.0-rc.3(@types/react@17.0.62)(jsdom@21.1.2)(react-dom@17.0.2)(react@17.0.2)(typescript@5.1.6): - resolution: {integrity: sha512-+R611mSx+tF/pr4OPL/ThzNgBrntCdhdAvulq0GcaRSUiHfk9x5gV7SNI4vfyME9rDqo9sLV4BfMwxPOoQN1Ug==} + /idea-react@1.0.0-rc.5(@types/react@17.0.62)(jsdom@21.1.2)(react-dom@17.0.2)(react@17.0.2)(typescript@5.1.6): + resolution: {integrity: sha512-C/Q4mHUoKXNlEDdv4KT51AzIK6tw6y+KNVgZ31rCAudBx5R99cS8hH9d8W6JfrF6/dgcoPlF4O5PfNYaW+NMtA==} peerDependencies: react: '>=16' react-dom: '>=16' @@ -4669,7 +4669,7 @@ packages: requiresBuild: true dependencies: pify: 4.0.1 - semver: 5.7.1 + semver: 5.7.2 dev: true optional: true @@ -4677,7 +4677,7 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: - semver: 6.3.0 + semver: 6.3.1 dev: true /make-error@1.3.6: @@ -4804,12 +4804,14 @@ packages: - react-native dev: false - /mobx-restful-table@0.11.0(@types/react@17.0.62)(jsdom@21.1.2)(mobx@5.15.7)(react-dom@17.0.2)(react@17.0.2)(typescript@5.1.6): - resolution: {integrity: sha512-pGIDG4cu6rs62voO3Bdufmnj5mHYu7oyt5YfcJw+QBDC3S+TTcmwHpb6wMTFEwiYJE+qZyUhPSytg5uHpJbwsQ==} - deprecated: Don't use versions with old API & bugs + /mobx-restful-table@1.0.4(@types/react@17.0.62)(mobx-i18n@0.3.15)(mobx-react@6.3.1)(mobx-restful@0.6.5)(mobx@5.15.7)(react-dom@17.0.2)(react@17.0.2)(typescript@5.1.6): + resolution: {integrity: sha512-YyNAysIUeE908yCyGX+NyN3zILuDL9dZz9p+ZRDJGQKz1pz9Ri7IWPPMhfqtDlQr4XN9Fe4kFIMxX4jgVWhf4g==} peerDependencies: mobx: '>=4 <6' - react: '>=16 <18' + mobx-i18n: ^0.3 + mobx-react: ^6 + mobx-restful: ^0.6 + react: '>=16.8' dependencies: '@swc/helpers': 0.4.14 classnames: 2.3.2 @@ -4824,9 +4826,7 @@ packages: web-utility: 4.0.0(typescript@5.1.6) transitivePeerDependencies: - '@types/react' - - jsdom - react-dom - - react-native - typescript dev: false @@ -4966,7 +4966,7 @@ packages: dependencies: '@next/env': 12.3.4 '@swc/helpers': 0.4.11 - caniuse-lite: 1.0.30001514 + caniuse-lite: 1.0.30001515 postcss: 8.4.14 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) @@ -6155,7 +6155,7 @@ packages: jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 - terser: 5.18.2 + terser: 5.19.0 dev: true /rollup@2.79.1: @@ -6250,14 +6250,14 @@ packages: compute-scroll-into-view: 1.0.20 dev: false - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true dev: true optional: true - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true @@ -6618,12 +6618,12 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.18.2 + terser: 5.19.0 webpack: 5.88.1 dev: true - /terser@5.18.2: - resolution: {integrity: sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==} + /terser@5.19.0: + resolution: {integrity: sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==} engines: {node: '>=10'} hasBin: true dependencies: @@ -7043,8 +7043,8 @@ packages: is-symbol: 1.0.4 dev: true - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + /which-typed-array@1.1.10: + resolution: {integrity: sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5