2023-05-31 10:26:50 +03:00

123 lines
3.1 KiB
TypeScript

import Validation from '../../validation';
import type { ValidationParams } from '../../validation/types';
import type { Row } from './types';
import type { Status } from '@/stores/calculation/statuses/types';
import type RootStore from '@/stores/root';
import type { IObservableArray, IObservableValue } from 'mobx';
import { makeAutoObservable, observable, reaction, toJS } from 'mobx';
export default class PaymentsTable {
private root: RootStore;
public validation: Validation;
public values: IObservableArray<number>;
public sums: IObservableArray<number>;
private statuses: IObservableArray<Status>;
private overridedStatus: IObservableValue<Status | undefined>;
constructor(rootStore: RootStore) {
this.validation = new Validation(
{
err_key: 'ERR_PAYMENTS_TABLE',
err_title: 'Таблица платежей',
},
rootStore
);
this.values = observable<number>([]);
this.sums = observable<number>([]);
this.statuses = observable<Status>([]);
this.overridedStatus = observable.box(undefined);
makeAutoObservable(this);
this.root = rootStore;
/**
* Синхронизируем длину массива значений и статусов
*/
reaction(
() => this.values.length,
(length) => {
this.statuses.length = length;
this.sums.length = length;
}
);
}
public get hasErrors() {
return this.validation.hasErrors;
}
public getValue(index: number) {
return this.values[index];
}
public get getValues() {
return toJS(this.values);
}
public setValue = (index: number, value: number) => {
this.values[index] = value;
};
public getSum(index: number) {
return this.sums[index];
}
public setSum = (index: number, sum: number) => {
this.sums[index] = sum;
};
public setValues = (values: number[]) => {
this.values.replace(values);
};
public getStatus(index: number) {
if (this.root.$process.has('Unlimited')) return 'Default';
if (this.root.$process.has('LoadKP')) return 'Disabled';
return this.overridedStatus.get() ?? this.statuses[index];
}
public setStatus = (index: number, status: Status) => {
this.statuses[index] = status;
};
public overrideStatuses = (status: Status) => {
this.overridedStatus.set(status);
};
public clearOverridedStatuses = () => {
this.overridedStatus.set(undefined);
};
public setStatuses = (statuses: Status[]) => {
this.statuses.replace(statuses);
};
public setRow = (index: number, row: Row) => {
this.setValue(index, row.value);
this.setStatus(index, row.status);
};
public setRows = (rows: Row[]) => {
const values = rows.map((row) => row.value);
const statuses = rows.map((row) => row.status);
this.setValues(values);
this.setStatuses(statuses);
};
public setError = (params: ValidationParams) => this.validation.setError(params);
public removeError = (params: Pick<ValidationParams, 'key'>) => {
this.validation.removeError(params);
};
public reset = () => {
this.values.clear();
this.statuses.clear();
this.validation.clearErrors();
};
}