Skip to content

Commit

Permalink
Поддержка обработки нескольких дисциплин одновременно
Browse files Browse the repository at this point in the history
  • Loading branch information
disturm committed May 4, 2024
1 parent 72b5f38 commit 7c3c41e
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 114 deletions.
115 changes: 68 additions & 47 deletions src/components/work/GoogleTableFetch/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ import React, { memo } from "react";
import SpreadsheetManager, {
DisciplineConfig,
SpreadsheetData,
SpreadsheetDatas,
} from "../../../managers/SpreadsheetManager";
import NestedList, { NestedItem } from "../../shared/NestedList";
import { Collapse, Container } from "@material-ui/core";
import { compareNormalized } from "../../../helpers/tools";
import { getSpreadsheetProperties } from "../../../apis/GoogleApi";
import BrsApi, { Discipline } from "../../../apis/BrsApi";
import BrsApi, { Discipline, TermType } from "../../../apis/BrsApi";
import "./styles.css";
import RunWorkerButtons from "../RunWorkerButtons";
import WorkerDialog, { MarksData } from "../WorkerDialog";
Expand All @@ -22,7 +23,7 @@ enum LastAction {
}

class GoogleTableFetch extends React.Component<Props, State> {
marksData: MarksData = {} as any;
marksDatas: Array<MarksData> = [];
workerSaveMode: boolean = false;
spreadsheetId: string = "";
sheetId: string | null = null;
Expand Down Expand Up @@ -50,42 +51,49 @@ class GoogleTableFetch extends React.Component<Props, State> {

this.setState({ loading: true });

const spreadsheetData = await this.getActualSpreadsheetDataAsync(
const spreadsheetDatas = await this.getActualSpreadsheetDataAsync(
spreadsheetId,
sheetId
);
if (!spreadsheetData) {
if (!spreadsheetDatas?.datas || spreadsheetDatas.datas.length === 0) {
this.setState({ loading: false });
return false;
}

const disciplines = await this.getActualDisciplinesAsync(
spreadsheetData.disciplineConfig
);
if (!disciplines) {
this.setState({ loading: false });
return false;
this.marksDatas = [];
const nestedItems: NestedItem[] = [];
let allMissed = true;
let missedCount = 0;
for (const data of spreadsheetDatas.datas) {
const disciplines = await this.getActualDisciplinesAsync(
data.disciplineConfig
);
if (!disciplines) {
this.setState({ loading: false });
return false;
}
this.marksDatas.push({
spreadsheetData: data,
suitableDisciplines: disciplines,
});

const items = this.disciplinesToListItems(disciplines, data);
allMissed = allMissed && items.allMissed;
missedCount += items.missedCount;
nestedItems.push(...items.disciplines);
}

const disciplinesInfo = this.disciplinesToListItems(
disciplines,
spreadsheetData
);

this.marksData.spreadsheetData = spreadsheetData;
this.marksData.suitableDisciplines = disciplines;

this.setState({
loading: false,
disciplines: disciplinesInfo.disciplines,
disciplines: nestedItems,
showDisciplines: true,
lastAction: LastAction.LoadDisciplines,
allDisciplinesMissed: disciplinesInfo.allMissed,
missedDisciplinesCount: disciplinesInfo.missedCount,
showWorkerButtons: !disciplinesInfo.allMissed,
allDisciplinesMissed: allMissed,
missedDisciplinesCount: missedCount,
showWorkerButtons: !allMissed,
});

return !disciplinesInfo.allMissed;
return !allMissed;
};

disciplinesToListItems(
Expand All @@ -104,12 +112,20 @@ class GoogleTableFetch extends React.Component<Props, State> {
return { title: group, colored: groupMissed };
});

const disciplineConfig = spreadsheetData.disciplineConfig;
const disciplineTime =
disciplineConfig.termType === TermType.Fall
? `осень ${disciplineConfig.year}`
: disciplineConfig.termType === TermType.Spring
? `весна ${disciplineConfig.year + 1}`
: `${disciplineConfig.year}/${disciplineConfig.year + 1}`;
const disciplineTitle = `${disciplineConfig.name}, ${disciplineTime}, ${disciplineConfig.course} курс`;
return {
allMissed: missedCount === actualGroups.size,
missedCount,
disciplines: [
{
title: spreadsheetData.disciplineConfig.name,
title: disciplineTitle,
nestedItems,
},
],
Expand All @@ -128,7 +144,7 @@ class GoogleTableFetch extends React.Component<Props, State> {
return allDisciplines.filter((d) =>
compareNormalized(d.discipline, disciplineConfig.name)
);
} catch (error) {
} catch (error: any) {
this.props.onError(error);
}
}
Expand All @@ -142,13 +158,13 @@ class GoogleTableFetch extends React.Component<Props, State> {
return null;
}

let spreadsheetData: SpreadsheetData;
let spreadsheetData: SpreadsheetDatas;
try {
const spreadsheetManager = new SpreadsheetManager(spreadsheetId);
spreadsheetData = await spreadsheetManager.getSpreadsheetDataAsync(
sheetName
);
} catch (e) {
} catch (e: any) {
this.props.onError(e.message || JSON.stringify(e));
return null;
}
Expand All @@ -174,7 +190,7 @@ class GoogleTableFetch extends React.Component<Props, State> {
return null;
}
return maybeSheet.title;
} catch (e) {
} catch (e: any) {
this.props.onError(e.message || JSON.stringify(e));
return null;
}
Expand All @@ -186,29 +202,34 @@ class GoogleTableFetch extends React.Component<Props, State> {
event.preventDefault();
this.setState({ showDisciplines: false });

const disciplineConfig = this.marksData.spreadsheetData?.disciplineConfig;
if (!disciplineConfig) return;

this.props.brsApi
.clearDisciplineCacheAsync(
disciplineConfig.year,
disciplineConfig.termType,
disciplineConfig.course,
disciplineConfig.isModule
)
.then(
(x) => x,
(error) => {
this.props.onError(error);
}
);
for (const marksData of this.marksDatas) {
const disciplineConfig = marksData.spreadsheetData?.disciplineConfig;
if (!disciplineConfig) return;

this.props.brsApi
.clearDisciplineCacheAsync(
disciplineConfig.year,
disciplineConfig.termType,
disciplineConfig.course,
disciplineConfig.isModule
)
.then(
(x) => x,
(error) => {
this.props.onError(error);
}
);
}

this.loadDisciplines(this.spreadsheetId, this.sheetId);
};

runWork = async (save: boolean) => {
if (this.state.lastAction !== LastAction.LoadDisciplines) {
const success = await this.loadDisciplines(this.spreadsheetId, this.sheetId);
const success = await this.loadDisciplines(
this.spreadsheetId,
this.sheetId
);
if (!success) {
return;
}
Expand All @@ -217,7 +238,7 @@ class GoogleTableFetch extends React.Component<Props, State> {
this.workerSaveMode = save;
this.setState({
lastAction: LastAction.RunWork,
runWorker: true
runWorker: true,
});
};

Expand Down Expand Up @@ -299,7 +320,7 @@ class GoogleTableFetch extends React.Component<Props, State> {
</Collapse>
{this.state.runWorker && (
<WorkerDialog
marksData={this.marksData}
marksDatas={this.marksDatas}
onClosed={this.handleWorkerClosed}
brsApi={this.props.brsApi}
onError={this.props.onError}
Expand Down
51 changes: 30 additions & 21 deletions src/components/work/WorkerDialog/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@ import MuiDialogContent from "@material-ui/core/DialogContent";
import MuiDialogActions from "@material-ui/core/DialogActions";
import SubmitWithLoading from "../../shared/SubmitWithLoading";
import MarksManager from "../../../managers/MarksManager";
import BrsApi, { Discipline } from "../../../apis/BrsApi";
import BrsApi, { Discipline, TermType } from "../../../apis/BrsApi";
import { SpreadsheetData } from "../../../managers/SpreadsheetManager";
import NestedList, { NestedItem } from "../../shared/NestedList";
import ReportManager, { Report } from "../../../managers/ReportManager";
import ReportManager from "../../../managers/ReportManager";
import { pluralize } from "../../../helpers/tools";
import { BrsReport } from "../../../managers/BrsReport";

const DialogContent = withStyles(() => ({
root: {
Expand Down Expand Up @@ -59,19 +60,23 @@ export default class WorkerDialog extends React.Component<Props, State> {
this.setState({ logItems });
};

logMessage = async (report: Report) => {
logMessage = async (report: BrsReport) => {
const logItems = await this.reportToNestedListItems(report);
this.setState({ logItems });
};

reportToNestedListItems(report: Report): Promise<NestedItem[]> {
reportToNestedListItems(report: BrsReport): Promise<NestedItem[]> {
const logItems = this.state.logItems;
return new Promise((resolve) => {
let title =
`Группа ${report.group}` +
(report.teacher !== undefined
? `, преподаватель ${report.teacher}`
: "");
const disciplineConfig = report.disciplineConfig;
const disciplineTime =
disciplineConfig.termType === TermType.Fall
? `осень ${disciplineConfig.year}`
: disciplineConfig.termType === TermType.Spring
? `весна ${disciplineConfig.year + 1}`
: `${disciplineConfig.year}/${disciplineConfig.year + 1}`;
let title = `Группа ${report.discipline.group} (${disciplineTime}, ${disciplineConfig.course} курс)`;

const nestedItems: NestedItem[] = [];
const mainItem: NestedItem = { title, collapsed: true, nestedItems };

Expand Down Expand Up @@ -154,7 +159,8 @@ export default class WorkerDialog extends React.Component<Props, State> {
renderAsText: true,
}));
nestedItems.push(marksItem);
hasErrors = hasErrors || marks.filter(({ failed }) => !!failed).length > 0
hasErrors =
hasErrors || marks.filter(({ failed }) => !!failed).length > 0;

const skipped = report.skipped;
if (skipped.length > 0) {
Expand Down Expand Up @@ -186,17 +192,20 @@ export default class WorkerDialog extends React.Component<Props, State> {
}

startWork = async () => {
const { spreadsheetData, suitableDisciplines } = this.props.marksData;
const error = await this.marksManager.putMarksToBrsAsync(
spreadsheetData,
suitableDisciplines
);
for (const marksData of this.props.marksDatas) {
const { spreadsheetData, suitableDisciplines } = marksData;

const error = await this.marksManager.putMarksToBrsAsync(
spreadsheetData,
suitableDisciplines
);

if (error) {
if (typeof error === "object") {
this.props.onError(error.toString());
} else if (typeof error === "string") {
this.props.onError(error);
if (error) {
if (typeof error === "object") {
this.props.onError(error.toString());
} else if (typeof error === "string") {
this.props.onError(error);
}
}
}

Expand Down Expand Up @@ -244,7 +253,7 @@ export interface MarksData {
}

interface Props {
marksData: MarksData;
marksDatas: MarksData[];
brsApi: BrsApi;
save: boolean;
onClosed: () => void;
Expand Down
20 changes: 20 additions & 0 deletions src/managers/BrsReport.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Discipline } from "../apis/BrsApi";
import { DisciplineConfig } from "./SpreadsheetManager";

export interface BrsReport {
disciplineConfig: DisciplineConfig
discipline: Discipline;
merge: {
succeed: number;
failedActual?: string[];
failedBrs?: string[];
};
marks: BrsReportSection[];
skipped: BrsReportSection[];
}

export interface BrsReportSection {
title: string;
students?: string[];
failed?: boolean;
}
Loading

0 comments on commit 7c3c41e

Please sign in to comment.