x-star-design 0.0.89 → 0.0.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -187,7 +187,9 @@ var GeneralConfigItem = function GeneralConfigItem(_ref) {
187
187
  value: 'afterApproval'
188
188
  }, t('DISPLAY_AFTER_TEACHER_CONFIRMATION')), /*#__PURE__*/React.createElement(Radio, {
189
189
  value: 'scheduled'
190
- }, t('TIMED_DISPLAY')))), /*#__PURE__*/React.createElement(TimingFormItem, {
190
+ }, t('TIMED_DISPLAY')), /*#__PURE__*/React.createElement(Radio, {
191
+ value: 'started'
192
+ }, t('After_Contest_Start')))), /*#__PURE__*/React.createElement(TimingFormItem, {
191
193
  field: 'answerRelease',
192
194
  name: 'answerTime',
193
195
  label: t('ANSWER_DISPLAY_TIME')
@@ -62,7 +62,9 @@ var ProgramConfigItem = function ProgramConfigItem(_ref) {
62
62
  value: 'scheduled'
63
63
  }, t('TIMED_DISPLAY')), /*#__PURE__*/React.createElement(Radio, {
64
64
  value: 'always'
65
- }, t('Always_Visible')))), /*#__PURE__*/React.createElement(TimingFormItem, {
65
+ }, t('Always_Visible')), /*#__PURE__*/React.createElement(Radio, {
66
+ value: 'started'
67
+ }, t('After_Contest_Start')))), /*#__PURE__*/React.createElement(TimingFormItem, {
66
68
  field: 'tipRelease',
67
69
  name: 'tipTime',
68
70
  label: t('TIPS_DISPLAY_TIME')
@@ -121,7 +123,32 @@ var ProgramConfigItem = function ProgramConfigItem(_ref) {
121
123
  // return parseInt(val);
122
124
  // }}
123
125
  }));
126
+ }), /*#__PURE__*/React.createElement(Form.Item, {
127
+ label: t('Show_Top_N_Submissions'),
128
+ name: 'showTopNSubmission',
129
+ extra: t('Show_Top_N_Submissions_Extra')
130
+ }, /*#__PURE__*/React.createElement(Radio.Group, null, /*#__PURE__*/React.createElement(Radio, {
131
+ value: true,
132
+ "data-testid": "showTopNSubmission-true"
133
+ }, t('ALLOW')), /*#__PURE__*/React.createElement(Radio, {
134
+ value: false,
135
+ "data-testid": "showTopNSubmission-false"
136
+ }, t('PROHIBIT')))), /*#__PURE__*/React.createElement(Form.Item, {
137
+ noStyle: true,
138
+ shouldUpdate: function shouldUpdate(perValues, nextValues) {
139
+ return perValues['showTopNSubmission'] !== nextValues['showTopNSubmission'];
140
+ }
141
+ }, function (_ref5) {
142
+ var getFieldValue = _ref5.getFieldValue;
143
+ var isVisible = getFieldValue('showTopNSubmission');
144
+ return isVisible && /*#__PURE__*/React.createElement(Form.Item, {
145
+ label: t('Top_N_Submissions'),
146
+ name: 'showTopNSubmissionCount'
147
+ }, /*#__PURE__*/React.createElement(InputNumber, {
148
+ min: 0,
149
+ max: 100,
150
+ "data-testid": "showTopNSubmission-input"
151
+ }));
124
152
  }));
125
153
  };
126
-
127
154
  export default ProgramConfigItem;
@@ -1,12 +1,14 @@
1
1
  import { DatePicker, Form } from 'antd';
2
2
  import React from 'react';
3
+ import ContestTimeInput from "../contest-time-input";
3
4
  import { useLocale } from "../locales";
4
5
  var TimingFormItem = function TimingFormItem(_ref) {
5
6
  var field = _ref.field,
6
7
  name = _ref.name,
7
8
  label = _ref.label;
8
9
  var _useLocale = useLocale('AcConfig'),
9
- locale = _useLocale.locale;
10
+ locale = _useLocale.locale,
11
+ t = _useLocale.format;
10
12
  var lang = {
11
13
  zh_CN: 'zh',
12
14
  en_US: 'en'
@@ -28,14 +30,15 @@ var TimingFormItem = function TimingFormItem(_ref) {
28
30
  }, function (_ref2) {
29
31
  var getFieldValue = _ref2.getFieldValue;
30
32
  // 成绩发布定时发布时显示
31
- var isVisible = getFieldValue(field) === 'scheduled';
33
+ var isVisible = getFieldValue(field) === 'scheduled' || getFieldValue(field) === 'started';
34
+ var isStarted = getFieldValue(field) === 'started';
32
35
  return /*#__PURE__*/React.createElement(React.Fragment, null, isVisible && /*#__PURE__*/React.createElement(Form.Item, {
33
36
  name: name,
34
- label: label,
37
+ label: isStarted ? t('After_Contest_Start_N') : label,
35
38
  rules: [{
36
39
  required: true
37
40
  }]
38
- }, /*#__PURE__*/React.createElement(DatePicker, {
41
+ }, isStarted ? /*#__PURE__*/React.createElement(ContestTimeInput, null) : /*#__PURE__*/React.createElement(DatePicker, {
39
42
  showTime: {
40
43
  use12Hours: lang === 'en',
41
44
  format: showTimeFormat
@@ -1,5 +1,6 @@
1
1
  import { Dayjs } from 'dayjs';
2
- export type ConfigStatus = 'afterExam' | 'afterApproval' | 'scheduled' | 'afterGradeRelease';
2
+ import { ContestTimeInputValue } from '../contest-time-input';
3
+ export type ConfigStatus = 'afterExam' | 'afterApproval' | 'scheduled' | 'afterGradeRelease' | 'always' | 'started';
3
4
  export type SubmissionConfigStatus = 'noEarlySubmission' | 'allowEarlySubmission';
4
5
  export type restrictionStatus = {
5
6
  type: 'never' | 'beforeHomeworkExam';
@@ -43,6 +44,8 @@ export interface Configuration {
43
44
  downloadDataCount: number;
44
45
  scoreTypeInMatch: 'latestSubmit' | 'maxScore';
45
46
  lang: string[];
47
+ showTopNSubmission: boolean;
48
+ showTopNSubmissionCount: number;
46
49
  };
47
50
  homework?: {
48
51
  noLimit?: boolean;
@@ -59,7 +62,7 @@ export interface RawConfig {
59
62
  gradeTime: Dayjs;
60
63
  rankListTime: Dayjs;
61
64
  paperTime: Dayjs;
62
- answerTime: Dayjs;
65
+ answerTime: Dayjs | ContestTimeInputValue;
63
66
  gradeRelease: GeneralConfigStatus<'Grade'>['type'];
64
67
  rankListRelease: GeneralConfigStatus<'Ranklist'>['type'];
65
68
  paperRelease: GeneralConfigStatus['type'];
@@ -91,6 +94,14 @@ export interface RawConfig {
91
94
  downloadDataCount: number;
92
95
  scoreTypeInMatch: 'latestSubmit' | 'maxScore';
93
96
  lang: ('gcc' | 'g++' | 'g++11' | 'g++14' | 'g++17' | 'python2.7' | 'python3.8' | 'java8' | 'fpc')[];
97
+ /**
98
+ * 赛中仅显示前n项提交
99
+ */
100
+ showTopNSubmission: boolean;
101
+ /**
102
+ * 赛中仅显示前n项提交数量
103
+ */
104
+ showTopNSubmissionCount: number;
94
105
  /**
95
106
  * 学生排行榜真实姓名
96
107
  */
@@ -24,7 +24,7 @@ export var getConfigData = function getConfigData(_ref) {
24
24
  return _defineProperty({}, release, {
25
25
  type: status,
26
26
  scheduled: {
27
- releaseTime: status === 'scheduled' ? (rawData === null || rawData === void 0 ? void 0 : rawData[timeType]).second(0).unix().valueOf() : undefined
27
+ releaseTime: status === 'scheduled' ? (rawData === null || rawData === void 0 ? void 0 : rawData[timeType]).second(0).unix().valueOf() : status === 'started' ? ((rawData === null || rawData === void 0 ? void 0 : rawData[timeType]).limitHour || 0) * 60 + ((rawData === null || rawData === void 0 ? void 0 : rawData[timeType]).limitMinute || 0) : undefined
28
28
  }
29
29
  });
30
30
  };
@@ -66,7 +66,9 @@ export var getConfigData = function getConfigData(_ref) {
66
66
  downloadDataEnable: rawData.downloadDataEnable,
67
67
  downloadDataCount: rawData.downloadDataCount,
68
68
  scoreTypeInMatch: rawData.scoreTypeInMatch,
69
- lang: rawData.lang
69
+ lang: rawData.lang,
70
+ showTopNSubmission: rawData.showTopNSubmission,
71
+ showTopNSubmissionCount: rawData.showTopNSubmissionCount
70
72
  }
71
73
  };
72
74
  if (contestType === ContestExamType.Exam) {
@@ -86,7 +88,7 @@ export var getConfigData = function getConfigData(_ref) {
86
88
  return updateConfig;
87
89
  };
88
90
  var AcConfig = /*#__PURE__*/forwardRef(function (_ref3, ref) {
89
- var _initialValues$contes, _initialValues$contes2, _gradeRelease$schedul, _rankListRelease$sche, _paperRelease$schedul, _answerRelease$schedu, _tipRelease$scheduled;
91
+ var _initialValues$contes, _initialValues$contes2, _gradeRelease$schedul, _rankListRelease$sche, _paperRelease$schedul, _answerRelease$schedu, _answerRelease$schedu2, _answerRelease$schedu3, _tipRelease$scheduled, _tipRelease$scheduled2, _tipRelease$scheduled3;
90
92
  var _ref3$type = _ref3.type,
91
93
  type = _ref3$type === void 0 ? 'advanced' : _ref3$type,
92
94
  _ref3$contestType = _ref3.contestType,
@@ -128,7 +130,9 @@ var AcConfig = /*#__PURE__*/forwardRef(function (_ref3, ref) {
128
130
  downloadDataEnable = _ref6.downloadDataEnable,
129
131
  downloadDataCount = _ref6.downloadDataCount,
130
132
  scoreTypeInMatch = _ref6.scoreTypeInMatch,
131
- lang = _ref6.lang;
133
+ lang = _ref6.lang,
134
+ showTopNSubmission = _ref6.showTopNSubmission,
135
+ showTopNSubmissionCount = _ref6.showTopNSubmissionCount;
132
136
  var _ref7 = (initialValues === null || initialValues === void 0 ? void 0 : initialValues.rank) || {},
133
137
  rankListShowRealName = _ref7.rankListShowRealName,
134
138
  rankShowUserLabel = _ref7.rankShowUserLabel;
@@ -153,7 +157,10 @@ var AcConfig = /*#__PURE__*/forwardRef(function (_ref3, ref) {
153
157
  paperRelease: paperRelease === null || paperRelease === void 0 ? void 0 : paperRelease.type,
154
158
  paperTime: dayjs.unix((paperRelease === null || paperRelease === void 0 ? void 0 : (_paperRelease$schedul = paperRelease.scheduled) === null || _paperRelease$schedul === void 0 ? void 0 : _paperRelease$schedul.releaseTime) || dayjs().valueOf() / 1000),
155
159
  answerRelease: answerRelease === null || answerRelease === void 0 ? void 0 : answerRelease.type,
156
- answerTime: dayjs.unix((answerRelease === null || answerRelease === void 0 ? void 0 : (_answerRelease$schedu = answerRelease.scheduled) === null || _answerRelease$schedu === void 0 ? void 0 : _answerRelease$schedu.releaseTime) || dayjs().valueOf() / 1000),
160
+ answerTime: (answerRelease === null || answerRelease === void 0 ? void 0 : answerRelease.type) === 'started' ? {
161
+ limitHour: Math.floor(((answerRelease === null || answerRelease === void 0 ? void 0 : (_answerRelease$schedu = answerRelease.scheduled) === null || _answerRelease$schedu === void 0 ? void 0 : _answerRelease$schedu.releaseTime) || 0) / 60),
162
+ limitMinute: ((answerRelease === null || answerRelease === void 0 ? void 0 : (_answerRelease$schedu2 = answerRelease.scheduled) === null || _answerRelease$schedu2 === void 0 ? void 0 : _answerRelease$schedu2.releaseTime) || 0) % 60
163
+ } : dayjs.unix((answerRelease === null || answerRelease === void 0 ? void 0 : (_answerRelease$schedu3 = answerRelease.scheduled) === null || _answerRelease$schedu3 === void 0 ? void 0 : _answerRelease$schedu3.releaseTime) || dayjs().valueOf() / 1000),
157
164
  rankListShowRealName: rankListShowRealName,
158
165
  rankShowUserLabel: rankShowUserLabel,
159
166
  submission: submission === null || submission === void 0 ? void 0 : submission.type,
@@ -164,13 +171,18 @@ var AcConfig = /*#__PURE__*/forwardRef(function (_ref3, ref) {
164
171
  lang: lang,
165
172
  personalScoreVisibility: personalScoreVisibility,
166
173
  tipRelease: tipRelease === null || tipRelease === void 0 ? void 0 : tipRelease.type,
167
- tipTime: dayjs.unix((tipRelease === null || tipRelease === void 0 ? void 0 : (_tipRelease$scheduled = tipRelease.scheduled) === null || _tipRelease$scheduled === void 0 ? void 0 : _tipRelease$scheduled.releaseTime) || dayjs().valueOf() / 1000),
174
+ tipTime: (tipRelease === null || tipRelease === void 0 ? void 0 : tipRelease.type) === 'started' ? {
175
+ limitHour: Math.floor(((tipRelease === null || tipRelease === void 0 ? void 0 : (_tipRelease$scheduled = tipRelease.scheduled) === null || _tipRelease$scheduled === void 0 ? void 0 : _tipRelease$scheduled.releaseTime) || 0) / 60),
176
+ limitMinute: ((tipRelease === null || tipRelease === void 0 ? void 0 : (_tipRelease$scheduled2 = tipRelease.scheduled) === null || _tipRelease$scheduled2 === void 0 ? void 0 : _tipRelease$scheduled2.releaseTime) || 0) % 60
177
+ } : dayjs.unix((tipRelease === null || tipRelease === void 0 ? void 0 : (_tipRelease$scheduled3 = tipRelease.scheduled) === null || _tipRelease$scheduled3 === void 0 ? void 0 : _tipRelease$scheduled3.releaseTime) || dayjs().valueOf() / 1000),
168
178
  scoreTypeInMatch: scoreTypeInMatch,
169
179
  rankingMethod: rankingMethod,
170
180
  highScoreProgramVisibility: highScoreProgramVisibility,
171
181
  downloadDataEnable: downloadDataEnable,
172
182
  downloadDataCount: downloadDataCount,
173
- restriction: restriction === null || restriction === void 0 ? void 0 : restriction.type
183
+ restriction: restriction === null || restriction === void 0 ? void 0 : restriction.type,
184
+ showTopNSubmission: showTopNSubmission,
185
+ showTopNSubmissionCount: showTopNSubmissionCount
174
186
  };
175
187
  useImperativeHandle(ref, function () {
176
188
  return {
@@ -0,0 +1,3 @@
1
+ import { RawConfig } from '../ac-config/define';
2
+ export type ContestType = 'OI' | 'XCPC' | 'IOI' | 'HOMEWORK1' | 'HOMEWORK2';
3
+ export declare const CONTEST_TEMPLATES: Record<ContestType, Partial<RawConfig>>;
@@ -0,0 +1,163 @@
1
+ import dayjs from 'dayjs';
2
+ export var CONTEST_TEMPLATES = {
3
+ OI: {
4
+ gradeTime: dayjs(),
5
+ rankListTime: dayjs(),
6
+ paperTime: dayjs(),
7
+ answerTime: dayjs(),
8
+ tipTime: dayjs(),
9
+ gradeRelease: 'afterExam',
10
+ rankListRelease: 'afterGradeRelease',
11
+ paperRelease: 'afterExam',
12
+ answerRelease: 'afterExam',
13
+ tipRelease: 'afterExam',
14
+ submission: 'noEarlySubmission',
15
+ restriction: 'beforeHomeworkExam',
16
+ disorder: [],
17
+ personalScoreVisibility: 'afterExam',
18
+ rankingMethod: 'score',
19
+ highScoreProgramVisibility: 'never',
20
+ downloadDataEnable: false,
21
+ downloadDataCount: 0,
22
+ scoreTypeInMatch: 'latestSubmit',
23
+ lang: ['gcc', 'g++', 'g++11', 'g++14', 'g++17', 'python2.7', 'python3.8', 'java8', 'fpc'],
24
+ showTopNSubmission: false,
25
+ showTopNSubmissionCount: 0,
26
+ rankListShowRealName: false,
27
+ rankShowUserLabel: false,
28
+ submissionLimitTime: {
29
+ limitHour: 0,
30
+ limitMinute: 0
31
+ }
32
+ },
33
+ XCPC: {
34
+ gradeTime: dayjs(),
35
+ rankListTime: dayjs(),
36
+ paperTime: dayjs(),
37
+ answerTime: dayjs(),
38
+ tipTime: dayjs(),
39
+ gradeRelease: 'afterExam',
40
+ rankListRelease: 'always',
41
+ paperRelease: 'afterExam',
42
+ answerRelease: 'afterExam',
43
+ tipRelease: 'afterExam',
44
+ submission: 'allowEarlySubmission',
45
+ restriction: 'beforeHomeworkExam',
46
+ disorder: [],
47
+ personalScoreVisibility: 'always',
48
+ rankingMethod: 'acNumber',
49
+ highScoreProgramVisibility: 'afterExam',
50
+ downloadDataEnable: false,
51
+ downloadDataCount: 0,
52
+ scoreTypeInMatch: 'maxScore',
53
+ lang: ['gcc', 'g++', 'g++11', 'g++14', 'g++17', 'python2.7', 'python3.8', 'java8', 'fpc'],
54
+ showTopNSubmission: false,
55
+ showTopNSubmissionCount: 0,
56
+ rankListShowRealName: false,
57
+ rankShowUserLabel: false,
58
+ submissionLimitTime: {
59
+ limitHour: 0,
60
+ limitMinute: 0
61
+ }
62
+ },
63
+ IOI: {
64
+ gradeTime: dayjs().add(1, 'day'),
65
+ rankListTime: dayjs().add(1, 'day'),
66
+ paperTime: dayjs(),
67
+ answerTime: dayjs(),
68
+ tipTime: dayjs(),
69
+ gradeRelease: 'afterExam',
70
+ rankListRelease: 'afterGradeRelease',
71
+ paperRelease: 'afterGradeRelease',
72
+ answerRelease: 'afterApproval',
73
+ tipRelease: 'afterExam',
74
+ submission: 'noEarlySubmission',
75
+ restriction: 'never',
76
+ disorder: [],
77
+ personalScoreVisibility: 'always',
78
+ rankingMethod: 'score',
79
+ highScoreProgramVisibility: 'afterExam',
80
+ downloadDataEnable: false,
81
+ downloadDataCount: 0,
82
+ scoreTypeInMatch: 'maxScore',
83
+ lang: ['gcc', 'g++', 'g++11', 'g++14', 'g++17', 'python2.7', 'python3.8', 'java8', 'fpc'],
84
+ showTopNSubmission: false,
85
+ showTopNSubmissionCount: 0,
86
+ rankListShowRealName: false,
87
+ rankShowUserLabel: false,
88
+ submissionLimitTime: {
89
+ limitHour: 0,
90
+ limitMinute: 0
91
+ }
92
+ },
93
+ HOMEWORK1: {
94
+ contestTime: 'noLimit',
95
+ gradeTime: dayjs(),
96
+ rankListTime: dayjs(),
97
+ paperTime: dayjs(),
98
+ answerTime: dayjs(),
99
+ tipTime: dayjs(),
100
+ gradeRelease: 'afterExam',
101
+ rankListRelease: 'afterGradeRelease',
102
+ paperRelease: 'afterExam',
103
+ answerRelease: 'afterExam',
104
+ tipRelease: 'always',
105
+ submission: 'allowEarlySubmission',
106
+ restriction: 'never',
107
+ disorder: [],
108
+ personalScoreVisibility: 'always',
109
+ rankingMethod: 'score',
110
+ highScoreProgramVisibility: 'never',
111
+ downloadDataEnable: true,
112
+ downloadDataCount: 5,
113
+ scoreTypeInMatch: 'maxScore',
114
+ lang: ['gcc', 'g++', 'g++11', 'g++14', 'g++17'],
115
+ showTopNSubmission: false,
116
+ showTopNSubmissionCount: 0,
117
+ rankListShowRealName: true,
118
+ rankShowUserLabel: false,
119
+ submissionLimitTime: {
120
+ limitHour: 0,
121
+ limitMinute: 0
122
+ },
123
+ limitTime: {
124
+ limitHour: 0,
125
+ limitMinute: 0
126
+ }
127
+ },
128
+ HOMEWORK2: {
129
+ contestTime: 'limitTime',
130
+ gradeTime: dayjs(),
131
+ rankListTime: dayjs(),
132
+ paperTime: dayjs(),
133
+ answerTime: dayjs(),
134
+ tipTime: dayjs(),
135
+ gradeRelease: 'afterExam',
136
+ rankListRelease: 'afterGradeRelease',
137
+ paperRelease: 'afterExam',
138
+ answerRelease: 'afterExam',
139
+ tipRelease: 'always',
140
+ submission: 'allowEarlySubmission',
141
+ restriction: 'never',
142
+ disorder: [],
143
+ personalScoreVisibility: 'always',
144
+ rankingMethod: 'score',
145
+ highScoreProgramVisibility: 'never',
146
+ downloadDataEnable: true,
147
+ downloadDataCount: 5,
148
+ scoreTypeInMatch: 'maxScore',
149
+ lang: ['gcc', 'g++', 'g++11', 'g++14', 'g++17'],
150
+ showTopNSubmission: false,
151
+ showTopNSubmissionCount: 0,
152
+ rankListShowRealName: true,
153
+ rankShowUserLabel: false,
154
+ submissionLimitTime: {
155
+ limitHour: 0,
156
+ limitMinute: 0
157
+ },
158
+ limitTime: {
159
+ limitHour: 2,
160
+ limitMinute: 0
161
+ }
162
+ }
163
+ };
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { RawConfig } from '../ac-config/define';
3
+ import { ContestType } from './define';
4
+ interface ConfigTemplateProps {
5
+ onSelect?: (config: Partial<RawConfig>, configType: ContestType) => void;
6
+ }
7
+ declare const ConfigTemplate: ({ onSelect }: ConfigTemplateProps) => React.JSX.Element;
8
+ export default ConfigTemplate;
@@ -0,0 +1,146 @@
1
+ import { Card, Col, message, Popconfirm, Row, Space, Typography } from 'antd';
2
+ import React from 'react';
3
+ import { useLocale } from "../locales";
4
+ import { prefix } from "../utils/global";
5
+ import { CONTEST_TEMPLATES } from "./define";
6
+ var Text = Typography.Text;
7
+ var ConfigTemplate = function ConfigTemplate(_ref) {
8
+ var onSelect = _ref.onSelect;
9
+ var _useLocale = useLocale('ConfigTemplate'),
10
+ t = _useLocale.format;
11
+ var template = [{
12
+ type: 'OI',
13
+ title: t('OI')
14
+ }, {
15
+ type: 'XCPC',
16
+ title: t('XCPC')
17
+ }, {
18
+ type: 'IOI',
19
+ title: t('IOI')
20
+ }, {
21
+ type: 'HOMEWORK1',
22
+ title: t('Homework_Mode_1')
23
+ }, {
24
+ type: 'HOMEWORK2',
25
+ title: t('Homework_Mode_2')
26
+ }];
27
+ var templateConfig = {
28
+ OI: {
29
+ title: t('OI'),
30
+ features: [{
31
+ text: t('Score_Rank'),
32
+ icon: '►'
33
+ }, {
34
+ text: t('No_Submission_Result_In_Contest'),
35
+ icon: '►'
36
+ }, {
37
+ text: t('Submit_By_Last_Submission'),
38
+ icon: '►'
39
+ }]
40
+ },
41
+ XCPC: {
42
+ title: t('XCPC'),
43
+ features: [{
44
+ text: t('AC_Rank'),
45
+ icon: '►'
46
+ }, {
47
+ text: t('Penalty_Rank'),
48
+ icon: '►'
49
+ }, {
50
+ text: t('Show_Submission_Result'),
51
+ icon: '►'
52
+ }, {
53
+ text: t('Rank_List_Visible'),
54
+ icon: '►'
55
+ }]
56
+ },
57
+ IOI: {
58
+ title: t('IOI'),
59
+ features: [{
60
+ text: t('Score_Rank'),
61
+ icon: '►'
62
+ }, {
63
+ text: t('Submit_By_Highest_Score'),
64
+ icon: '►'
65
+ }, {
66
+ text: t('Show_Submission_Result'),
67
+ icon: '►'
68
+ }]
69
+ },
70
+ HOMEWORK1: {
71
+ title: t('Homework_Mode_1'),
72
+ features: [{
73
+ text: t('No_Homework_Time_Limit'),
74
+ icon: '►'
75
+ }, {
76
+ text: t('Submit_By_Highest_Score'),
77
+ icon: '►'
78
+ }, {
79
+ text: t('Personal_Score_Visibility'),
80
+ icon: '►'
81
+ }, {
82
+ text: t('Tip_Visibility'),
83
+ icon: '►'
84
+ }]
85
+ },
86
+ HOMEWORK2: {
87
+ title: t('Homework_Mode_2'),
88
+ features: [{
89
+ text: t('Homework_Time_Limit_120_Minutes'),
90
+ icon: '►'
91
+ }, {
92
+ text: t('Submit_By_Highest_Score'),
93
+ icon: '►'
94
+ }, {
95
+ text: t('Personal_Score_Visibility'),
96
+ icon: '►'
97
+ }, {
98
+ text: t('Tip_Visibility'),
99
+ icon: '►'
100
+ }]
101
+ }
102
+ };
103
+ return /*#__PURE__*/React.createElement(Row, {
104
+ gutter: [16, 16]
105
+ }, template.map(function (item) {
106
+ return /*#__PURE__*/React.createElement(Col, {
107
+ span: 8,
108
+ key: item.type
109
+ }, /*#__PURE__*/React.createElement(Popconfirm, {
110
+ title: t('Current_Operation_Hint'),
111
+ "data-testid": "popconfirm",
112
+ onConfirm: function onConfirm() {
113
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(CONTEST_TEMPLATES[item.type], item.type);
114
+ message.success({
115
+ key: 'success',
116
+ content: t('Cover_successfully')
117
+ });
118
+ }
119
+ }, /*#__PURE__*/React.createElement(Card, {
120
+ className: "".concat(prefix, "-templateCard"),
121
+ hoverable: true,
122
+ "data-testid": "templateCard"
123
+ }, /*#__PURE__*/React.createElement(Space, {
124
+ direction: "vertical",
125
+ size: "small",
126
+ style: {
127
+ width: '100%'
128
+ }
129
+ }, /*#__PURE__*/React.createElement("div", {
130
+ className: "".concat(prefix, "-type")
131
+ }, item.type), /*#__PURE__*/React.createElement(Text, {
132
+ strong: true,
133
+ className: "".concat(prefix, "-title")
134
+ }, templateConfig[item.type].title), /*#__PURE__*/React.createElement("div", {
135
+ className: "".concat(prefix, "-features")
136
+ }, templateConfig[item.type].features.map(function (feature, index) {
137
+ return /*#__PURE__*/React.createElement("div", {
138
+ key: index,
139
+ className: "".concat(prefix, "-featureItem")
140
+ }, /*#__PURE__*/React.createElement(Text, {
141
+ className: "".concat(prefix, "-icon")
142
+ }, feature.icon), /*#__PURE__*/React.createElement(Text, null, feature.text));
143
+ }))))));
144
+ }));
145
+ };
146
+ export default ConfigTemplate;
package/dist/index.d.ts CHANGED
@@ -11,6 +11,9 @@ export type { CodeDetailModalProps } from './code-detail-modal';
11
11
  export { default as CodeMirrorWrapper } from './code-mirror-wrapper';
12
12
  export type { CodeMirrorWrapperProps } from './code-mirror-wrapper';
13
13
  export { LangId, Language, Theme } from './code-mirror-wrapper/define';
14
+ export { default as ConfigTemplate } from './config-template';
15
+ export { CONTEST_TEMPLATES } from './config-template/define';
16
+ export type { ContestType } from './config-template/define';
14
17
  export { default as ContactButton } from './contact-button';
15
18
  export { default as ContestDurationInput } from './contest-duration-input';
16
19
  export { default as ContestTimeInput } from './contest-time-input';
package/dist/index.js CHANGED
@@ -5,6 +5,8 @@ export { default as AnchorXTabs } from "./anchor-x-tabs";
5
5
  export { default as CodeDetailModal } from "./code-detail-modal";
6
6
  export { default as CodeMirrorWrapper } from "./code-mirror-wrapper";
7
7
  export { LangId, Language, Theme } from "./code-mirror-wrapper/define";
8
+ export { default as ConfigTemplate } from "./config-template";
9
+ export { CONTEST_TEMPLATES } from "./config-template/define";
8
10
  export { default as ContactButton } from "./contact-button";
9
11
  export { default as ContestDurationInput } from "./contest-duration-input";
10
12
  export { default as ContestTimeInput } from "./contest-time-input";
@@ -153,6 +153,11 @@ declare const _default: {
153
153
  readonly Time_Setting_Mode_Conversion: "Time Setting Mode Conversion";
154
154
  readonly Please_Enter_Correct_Time_Format: "Please Enter Correct Time Format";
155
155
  readonly Duration_Cannot_Be_Set_To_Zero: "Duration Cannot Be Set To Zero";
156
+ readonly Show_Top_N_Submissions: "Top N Submissions Display";
157
+ readonly Show_Top_N_Submissions_Extra: "For single problem";
158
+ readonly Top_N_Submissions: "Top N";
159
+ readonly After_Contest_Start: "Display after N mins of contest start";
160
+ readonly After_Contest_Start_N: "N mins of contest start";
156
161
  };
157
162
  readonly ScoreReport: {
158
163
  readonly In_Game_Total_Score: "Timed Score";
@@ -190,5 +195,29 @@ declare const _default: {
190
195
  readonly Input_Format: "Input Format: 2025-03-12 12:00";
191
196
  readonly Duration: "Duration:";
192
197
  };
198
+ readonly ConfigTemplate: {
199
+ readonly OI: "OI";
200
+ readonly XCPC: "XCPC";
201
+ readonly IOI: "IOI";
202
+ readonly Homework_Mode_1: "Homework Mode 1";
203
+ readonly Homework_Mode_2: "Homework Mode 2";
204
+ readonly Score_Rank: "Rank by score";
205
+ readonly AC_Rank: "Rank by AC number";
206
+ readonly Penalty_Rank: "Same score, rank by penalty";
207
+ readonly Show_Submission_Result: "Show submission result in contest";
208
+ readonly Rank_List_Visible: "Rank list always valid";
209
+ readonly No_Homework_Time_Limit: "No homework time limit";
210
+ readonly Submit_By_Highest_Score: "Submit by highest score";
211
+ readonly Personal_Score_Visibility: "Personal score always visible";
212
+ readonly Tip_Visibility: "Tip always visible";
213
+ readonly Cover_successfully: "Cover successfully";
214
+ readonly Current_Homework_Mode_Hint: "Current is homework mode and the configuration does not match, are you sure to cover it?";
215
+ readonly Current_Contest_Mode_Hint: "Current is contest mode and the configuration does not match, are you sure to cover it?";
216
+ readonly Current_Operation_Hint: "Current operation will cover the original configuration, are you sure?";
217
+ readonly Homework_Time_Limit_120_Minutes: "Homework time limit 120 minutes";
218
+ readonly Same_Score_First_AC: "Same score, rank by first AC time";
219
+ readonly No_Submission_Result_In_Contest: "No submission result in contest";
220
+ readonly Submit_By_Last_Submission: "Submit by last submission";
221
+ };
193
222
  };
194
223
  export default _default;
@@ -152,7 +152,12 @@ export default {
152
152
  Config_Affects_Submission_Visibility: 'This configuration also affects the submission visibility of problems related to the learning space',
153
153
  Time_Setting_Mode_Conversion: 'Time Setting Mode Conversion',
154
154
  Please_Enter_Correct_Time_Format: 'Please Enter Correct Time Format',
155
- Duration_Cannot_Be_Set_To_Zero: 'Duration Cannot Be Set To Zero'
155
+ Duration_Cannot_Be_Set_To_Zero: 'Duration Cannot Be Set To Zero',
156
+ Show_Top_N_Submissions: 'Top N Submissions Display',
157
+ Show_Top_N_Submissions_Extra: 'For single problem',
158
+ Top_N_Submissions: 'Top N',
159
+ After_Contest_Start: 'Display after N mins of contest start',
160
+ After_Contest_Start_N: 'N mins of contest start'
156
161
  },
157
162
  ScoreReport: {
158
163
  In_Game_Total_Score: 'Timed Score',
@@ -189,5 +194,29 @@ export default {
189
194
  Please_Enter_Start_Time: 'Please Enter Start Time',
190
195
  Input_Format: 'Input Format: 2025-03-12 12:00',
191
196
  Duration: 'Duration:'
197
+ },
198
+ ConfigTemplate: {
199
+ OI: 'OI',
200
+ XCPC: 'XCPC',
201
+ IOI: 'IOI',
202
+ Homework_Mode_1: 'Homework Mode 1',
203
+ Homework_Mode_2: 'Homework Mode 2',
204
+ Score_Rank: 'Rank by score',
205
+ AC_Rank: 'Rank by AC number',
206
+ Penalty_Rank: 'Same score, rank by penalty',
207
+ Show_Submission_Result: 'Show submission result in contest',
208
+ Rank_List_Visible: 'Rank list always valid',
209
+ No_Homework_Time_Limit: 'No homework time limit',
210
+ Submit_By_Highest_Score: 'Submit by highest score',
211
+ Personal_Score_Visibility: 'Personal score always visible',
212
+ Tip_Visibility: 'Tip always visible',
213
+ Cover_successfully: 'Cover successfully',
214
+ Current_Homework_Mode_Hint: 'Current is homework mode and the configuration does not match, are you sure to cover it?',
215
+ Current_Contest_Mode_Hint: 'Current is contest mode and the configuration does not match, are you sure to cover it?',
216
+ Current_Operation_Hint: 'Current operation will cover the original configuration, are you sure?',
217
+ Homework_Time_Limit_120_Minutes: 'Homework time limit 120 minutes',
218
+ Same_Score_First_AC: 'Same score, rank by first AC time',
219
+ No_Submission_Result_In_Contest: 'No submission result in contest',
220
+ Submit_By_Last_Submission: 'Submit by last submission'
192
221
  }
193
222
  };
@@ -7,7 +7,7 @@ export interface LocaleProviderProps {
7
7
  }
8
8
  export declare const LocaleProvider: ({ children, locale, }: LocaleProviderProps) => React.JSX.Element;
9
9
  type MessageMap = typeof zh_CN | typeof en_US;
10
- export declare const useLocale: <T extends "VisualDataConfig" | "TranslateButton" | "CodeDetailModal" | "ContactButton" | "ErrorPage" | "Feedback" | "MicroApp" | "ContestTimeInput" | "AcConfig" | "ScoreReport" | "SchoolInput" | "ZipCodeSearchInput" | "ContestDurationInput">(slice: T) => {
10
+ export declare const useLocale: <T extends "VisualDataConfig" | "TranslateButton" | "CodeDetailModal" | "ContactButton" | "ErrorPage" | "Feedback" | "MicroApp" | "ContestTimeInput" | "AcConfig" | "ScoreReport" | "SchoolInput" | "ZipCodeSearchInput" | "ContestDurationInput" | "ConfigTemplate">(slice: T) => {
11
11
  locale: string;
12
12
  format: <U extends keyof MessageMap[T]>(key: U) => ({
13
13
  readonly VisualDataConfig: {
@@ -164,6 +164,11 @@ export declare const useLocale: <T extends "VisualDataConfig" | "TranslateButton
164
164
  readonly Time_Setting_Mode_Conversion: "时间设置模式转化";
165
165
  readonly Please_Enter_Correct_Time_Format: "请输入正确的时间格式";
166
166
  readonly Duration_Cannot_Be_Set_To_Zero: "持续时间不能设置为0";
167
+ readonly Show_Top_N_Submissions: "赛中仅显示前n项提交";
168
+ readonly Show_Top_N_Submissions_Extra: "针对单题生效";
169
+ readonly Top_N_Submissions: "前n项";
170
+ readonly After_Contest_Start: "比赛开始后N分钟后显示";
171
+ readonly After_Contest_Start_N: "比赛开始N分钟";
167
172
  };
168
173
  readonly ScoreReport: {
169
174
  readonly In_Game_Total_Score: "赛中总分";
@@ -201,6 +206,30 @@ export declare const useLocale: <T extends "VisualDataConfig" | "TranslateButton
201
206
  readonly Input_Format: "输入格式:2025-03-12 12:00";
202
207
  readonly Duration: "持续时间:";
203
208
  };
209
+ readonly ConfigTemplate: {
210
+ readonly OI: "信息学奥林匹克";
211
+ readonly XCPC: "ACM程序设计竞赛";
212
+ readonly IOI: "国际信息学奥林匹克";
213
+ readonly Homework_Mode_1: "作业模式1";
214
+ readonly Homework_Mode_2: "作业模式2";
215
+ readonly Score_Rank: "按照分数排名";
216
+ readonly AC_Rank: "按照AC题数排名";
217
+ readonly Penalty_Rank: "相同分数按罚时排名";
218
+ readonly Show_Submission_Result: "赛中显示提交结果";
219
+ readonly Rank_List_Visible: "排行榜一直可见";
220
+ readonly No_Homework_Time_Limit: "无作业时长限制";
221
+ readonly Submit_By_Highest_Score: "提交按最高分计分";
222
+ readonly Personal_Score_Visibility: "个人分数始终可见";
223
+ readonly Tip_Visibility: "提示一直可见";
224
+ readonly Cover_successfully: "覆盖成功";
225
+ readonly Current_Homework_Mode_Hint: "当前为作业模式,相关配置不匹配,你确定要覆盖吗?";
226
+ readonly Current_Contest_Mode_Hint: "当前为考试模式,相关配置不匹配,你确定要覆盖吗?";
227
+ readonly Current_Operation_Hint: "当前操作将覆盖原有配置,你确定吗?";
228
+ readonly Homework_Time_Limit_120_Minutes: "作业时长限制120分钟";
229
+ readonly Same_Score_First_AC: "同分按首次AC时间排名";
230
+ readonly No_Submission_Result_In_Contest: "比赛中不显示提交结果";
231
+ readonly Submit_By_Last_Submission: "提交按最后一次提交时间计分";
232
+ };
204
233
  } | {
205
234
  readonly VisualDataConfig: {
206
235
  readonly Time_MS: "Time Limit(MS)";
@@ -356,6 +385,11 @@ export declare const useLocale: <T extends "VisualDataConfig" | "TranslateButton
356
385
  readonly Time_Setting_Mode_Conversion: "Time Setting Mode Conversion";
357
386
  readonly Please_Enter_Correct_Time_Format: "Please Enter Correct Time Format";
358
387
  readonly Duration_Cannot_Be_Set_To_Zero: "Duration Cannot Be Set To Zero";
388
+ readonly Show_Top_N_Submissions: "Top N Submissions Display";
389
+ readonly Show_Top_N_Submissions_Extra: "For single problem";
390
+ readonly Top_N_Submissions: "Top N";
391
+ readonly After_Contest_Start: "Display after N mins of contest start";
392
+ readonly After_Contest_Start_N: "N mins of contest start";
359
393
  };
360
394
  readonly ScoreReport: {
361
395
  readonly In_Game_Total_Score: "Timed Score";
@@ -393,6 +427,30 @@ export declare const useLocale: <T extends "VisualDataConfig" | "TranslateButton
393
427
  readonly Input_Format: "Input Format: 2025-03-12 12:00";
394
428
  readonly Duration: "Duration:";
395
429
  };
430
+ readonly ConfigTemplate: {
431
+ readonly OI: "OI";
432
+ readonly XCPC: "XCPC";
433
+ readonly IOI: "IOI";
434
+ readonly Homework_Mode_1: "Homework Mode 1";
435
+ readonly Homework_Mode_2: "Homework Mode 2";
436
+ readonly Score_Rank: "Rank by score";
437
+ readonly AC_Rank: "Rank by AC number";
438
+ readonly Penalty_Rank: "Same score, rank by penalty";
439
+ readonly Show_Submission_Result: "Show submission result in contest";
440
+ readonly Rank_List_Visible: "Rank list always valid";
441
+ readonly No_Homework_Time_Limit: "No homework time limit";
442
+ readonly Submit_By_Highest_Score: "Submit by highest score";
443
+ readonly Personal_Score_Visibility: "Personal score always visible";
444
+ readonly Tip_Visibility: "Tip always visible";
445
+ readonly Cover_successfully: "Cover successfully";
446
+ readonly Current_Homework_Mode_Hint: "Current is homework mode and the configuration does not match, are you sure to cover it?";
447
+ readonly Current_Contest_Mode_Hint: "Current is contest mode and the configuration does not match, are you sure to cover it?";
448
+ readonly Current_Operation_Hint: "Current operation will cover the original configuration, are you sure?";
449
+ readonly Homework_Time_Limit_120_Minutes: "Homework time limit 120 minutes";
450
+ readonly Same_Score_First_AC: "Same score, rank by first AC time";
451
+ readonly No_Submission_Result_In_Contest: "No submission result in contest";
452
+ readonly Submit_By_Last_Submission: "Submit by last submission";
453
+ };
396
454
  })[T][U];
397
455
  };
398
456
  export {};
@@ -153,6 +153,11 @@ declare const _default: {
153
153
  readonly Time_Setting_Mode_Conversion: "时间设置模式转化";
154
154
  readonly Please_Enter_Correct_Time_Format: "请输入正确的时间格式";
155
155
  readonly Duration_Cannot_Be_Set_To_Zero: "持续时间不能设置为0";
156
+ readonly Show_Top_N_Submissions: "赛中仅显示前n项提交";
157
+ readonly Show_Top_N_Submissions_Extra: "针对单题生效";
158
+ readonly Top_N_Submissions: "前n项";
159
+ readonly After_Contest_Start: "比赛开始后N分钟后显示";
160
+ readonly After_Contest_Start_N: "比赛开始N分钟";
156
161
  };
157
162
  readonly ScoreReport: {
158
163
  readonly In_Game_Total_Score: "赛中总分";
@@ -190,5 +195,29 @@ declare const _default: {
190
195
  readonly Input_Format: "输入格式:2025-03-12 12:00";
191
196
  readonly Duration: "持续时间:";
192
197
  };
198
+ readonly ConfigTemplate: {
199
+ readonly OI: "信息学奥林匹克";
200
+ readonly XCPC: "ACM程序设计竞赛";
201
+ readonly IOI: "国际信息学奥林匹克";
202
+ readonly Homework_Mode_1: "作业模式1";
203
+ readonly Homework_Mode_2: "作业模式2";
204
+ readonly Score_Rank: "按照分数排名";
205
+ readonly AC_Rank: "按照AC题数排名";
206
+ readonly Penalty_Rank: "相同分数按罚时排名";
207
+ readonly Show_Submission_Result: "赛中显示提交结果";
208
+ readonly Rank_List_Visible: "排行榜一直可见";
209
+ readonly No_Homework_Time_Limit: "无作业时长限制";
210
+ readonly Submit_By_Highest_Score: "提交按最高分计分";
211
+ readonly Personal_Score_Visibility: "个人分数始终可见";
212
+ readonly Tip_Visibility: "提示一直可见";
213
+ readonly Cover_successfully: "覆盖成功";
214
+ readonly Current_Homework_Mode_Hint: "当前为作业模式,相关配置不匹配,你确定要覆盖吗?";
215
+ readonly Current_Contest_Mode_Hint: "当前为考试模式,相关配置不匹配,你确定要覆盖吗?";
216
+ readonly Current_Operation_Hint: "当前操作将覆盖原有配置,你确定吗?";
217
+ readonly Homework_Time_Limit_120_Minutes: "作业时长限制120分钟";
218
+ readonly Same_Score_First_AC: "同分按首次AC时间排名";
219
+ readonly No_Submission_Result_In_Contest: "比赛中不显示提交结果";
220
+ readonly Submit_By_Last_Submission: "提交按最后一次提交时间计分";
221
+ };
193
222
  };
194
223
  export default _default;
@@ -152,7 +152,12 @@ export default {
152
152
  Config_Affects_Submission_Visibility: '该配置同时影响学生学习空间相关题目的提交可见性',
153
153
  Time_Setting_Mode_Conversion: '时间设置模式转化',
154
154
  Please_Enter_Correct_Time_Format: '请输入正确的时间格式',
155
- Duration_Cannot_Be_Set_To_Zero: '持续时间不能设置为0'
155
+ Duration_Cannot_Be_Set_To_Zero: '持续时间不能设置为0',
156
+ Show_Top_N_Submissions: '赛中仅显示前n项提交',
157
+ Show_Top_N_Submissions_Extra: '针对单题生效',
158
+ Top_N_Submissions: '前n项',
159
+ After_Contest_Start: '比赛开始后N分钟后显示',
160
+ After_Contest_Start_N: '比赛开始N分钟'
156
161
  },
157
162
  ScoreReport: {
158
163
  In_Game_Total_Score: '赛中总分',
@@ -189,5 +194,29 @@ export default {
189
194
  Please_Enter_Start_Time: '请输入开始时间',
190
195
  Input_Format: '输入格式:2025-03-12 12:00',
191
196
  Duration: '持续时间:'
197
+ },
198
+ ConfigTemplate: {
199
+ OI: '信息学奥林匹克',
200
+ XCPC: 'ACM程序设计竞赛',
201
+ IOI: '国际信息学奥林匹克',
202
+ Homework_Mode_1: '作业模式1',
203
+ Homework_Mode_2: '作业模式2',
204
+ Score_Rank: '按照分数排名',
205
+ AC_Rank: '按照AC题数排名',
206
+ Penalty_Rank: '相同分数按罚时排名',
207
+ Show_Submission_Result: '赛中显示提交结果',
208
+ Rank_List_Visible: '排行榜一直可见',
209
+ No_Homework_Time_Limit: '无作业时长限制',
210
+ Submit_By_Highest_Score: '提交按最高分计分',
211
+ Personal_Score_Visibility: '个人分数始终可见',
212
+ Tip_Visibility: '提示一直可见',
213
+ Cover_successfully: '覆盖成功',
214
+ Current_Homework_Mode_Hint: '当前为作业模式,相关配置不匹配,你确定要覆盖吗?',
215
+ Current_Contest_Mode_Hint: '当前为考试模式,相关配置不匹配,你确定要覆盖吗?',
216
+ Current_Operation_Hint: '当前操作将覆盖原有配置,你确定吗?',
217
+ Homework_Time_Limit_120_Minutes: '作业时长限制120分钟',
218
+ Same_Score_First_AC: '同分按首次AC时间排名',
219
+ No_Submission_Result_In_Contest: '比赛中不显示提交结果',
220
+ Submit_By_Last_Submission: '提交按最后一次提交时间计分'
192
221
  }
193
222
  };
@@ -780,3 +780,37 @@
780
780
  font-size: 14px;
781
781
  color: rgba(0, 0, 0, 0.4509803922);
782
782
  }
783
+
784
+ .x-star-design-templateCard {
785
+ height: 100%;
786
+ transition: all 0.3s;
787
+ cursor: pointer;
788
+ }
789
+ .x-star-design-templateCard:hover {
790
+ transform: translateY(-2px);
791
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
792
+ }
793
+ .x-star-design-templateCard.selected {
794
+ border: 2px solid #1990fe;
795
+ }
796
+ .x-star-design-templateCard .x-star-design-type {
797
+ padding: 2px 8px;
798
+ width: fit-content;
799
+ border-radius: 4px;
800
+ color: #1990fe;
801
+ background-color: #e6f4ff;
802
+ }
803
+ .x-star-design-templateCard .x-star-design-title {
804
+ display: block;
805
+ margin-bottom: 12px;
806
+ font-size: 16px;
807
+ }
808
+ .x-star-design-templateCard .x-star-design-features .x-star-design-featureItem {
809
+ display: flex;
810
+ align-items: center;
811
+ margin-bottom: 8px;
812
+ }
813
+ .x-star-design-templateCard .x-star-design-features .x-star-design-featureItem .x-star-design-icon {
814
+ margin-right: 8px;
815
+ color: #1990fe;
816
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "x-star-design",
3
- "version": "0.0.89",
3
+ "version": "0.0.92",
4
4
  "description": "A react component library developed by turingstar",
5
5
  "license": "MIT",
6
6
  "module": "dist/index.js",