Calculation/InsuranceTable: add statuses

This commit is contained in:
Chika 2022-06-23 15:25:38 +03:00
parent 1295b94b25
commit 824e10dcba
7 changed files with 93 additions and 5 deletions

View File

@ -1,6 +1,6 @@
import { observer } from 'mobx-react-lite';
import type { ComponentType } from 'react';
import { useRowOptions } from 'stores/tables/insurance/hooks';
import { useRowOptions, useRowStatuses } from 'stores/tables/insurance/hooks';
import { useInsuranceValue } from './hooks';
import type { Keys } from './types';
@ -8,15 +8,25 @@ export function buildOptionComponent<T>(key: string, Component: ComponentType<T>
return observer((props: T) => {
const [value, setValue] = useInsuranceValue(key, valueName);
const options = useRowOptions(valueName);
const statuses = useRowStatuses(key);
return <Component value={value} options={options} setValue={setValue} {...props} />;
return (
<Component
value={value}
options={options}
setValue={setValue}
status={statuses[valueName]}
{...props}
/>
);
});
}
export function buildValueComponent<T>(key: string, Component: ComponentType<T>, valueName: Keys) {
return observer((props: T) => {
const [value, setValue] = useInsuranceValue(key, valueName);
const statuses = useRowStatuses(key);
return <Component value={value} setValue={setValue} {...props} />;
return <Component value={value} setValue={setValue} status={statuses[valueName]} {...props} />;
});
}

View File

@ -1,4 +1,4 @@
import type { BaseOption } from 'Elements/types';
import type { BaseOption, Status } from 'Elements/types';
export type Row = {
key: string;
@ -14,3 +14,7 @@ export type Keys = keyof Row;
export type Options = {
[Key in keyof Row]?: BaseOption<Row[Key]>[];
};
export type RowStatuses = Omit<Record<Keys, Status>, 'key'> & {
key: string;
};

View File

@ -66,3 +66,46 @@ export const defaultRows: Insurance.Row[] = [
insTerm: null,
},
];
export const defaultStatuses: Insurance.RowStatuses[] = [
{
key: 'osago',
insTerm: 'Disabled',
insCost: 'Default',
insuranceCompany: 'Default',
insured: 'Default',
policyType: 'Default',
},
{
key: 'kasko',
insTerm: 'Disabled',
insCost: 'Default',
insuranceCompany: 'Default',
insured: 'Default',
policyType: 'Default',
},
{
key: 'dgo',
insuranceCompany: 'Disabled',
insured: 'Disabled',
insTerm: 'Disabled',
insCost: 'Default',
policyType: 'Default',
},
{
key: 'ns',
insuranceCompany: 'Disabled',
insured: 'Disabled',
insTerm: 'Disabled',
insCost: 'Default',
policyType: 'Default',
},
{
key: 'finGAP',
insCost: 'Disabled',
insuranceCompany: 'Default',
insured: 'Default',
insTerm: 'Default',
policyType: 'Default',
},
];

View File

@ -38,6 +38,7 @@ export const getServerSideProps: GetServerSideProps<PageProps> = async (ctx) =>
insurance: {
values: insuranceTableConfig.defaultRows,
options: insuranceTableConfig.defaultOptions,
statuses: insuranceTableConfig.defaultStatuses,
},
},
},

View File

@ -23,6 +23,7 @@ export function initializeStore(initialData) {
_store.$tables.insurance.hydrate({
values: tables.insurance.values,
options: tables.insurance.options,
statuses: tables.insurance.statuses,
});
}
}

View File

@ -21,3 +21,11 @@ export function useRowOptions(valueName) {
return options;
}
export function useRowStatuses(key) {
const { $tables } = useStore();
const statuses = $tables.insurance.getRowStatuses(key);
return statuses;
}

View File

@ -7,21 +7,28 @@ import type RootStore from 'stores/root';
export interface InsuranceTableData {
values: Insurance.Row[];
options: Insurance.Options;
statuses: Insurance.RowStatuses[];
}
export default class InsuranceTable {
root: RootStore;
values: Insurance.Row[] = [];
options: Insurance.Options = {};
statuses: Insurance.RowStatuses[] = [];
constructor(rootStore: RootStore) {
this.root = rootStore;
makeAutoObservable(this);
}
hydrate = ({ values: initialValues, options: initialOptions }: InsuranceTableData) => {
hydrate = ({
values: initialValues,
options: initialOptions,
statuses: initialStatuses,
}: InsuranceTableData) => {
this.values = initialValues;
this.options = initialOptions;
this.statuses = initialStatuses;
};
getRowValue(key: string, valueName: Insurance.Keys) {
@ -41,4 +48,18 @@ export default class InsuranceTable {
getRowOptions(valueName: Insurance.Keys) {
return this.options[valueName];
}
getRowStatuses(key: string) {
const rowIndex = this.values.findIndex((x) => x.key === key);
return this.statuses[rowIndex];
}
setRowStatuses = (key: string, rowStatuses: Insurance.RowStatuses) => {
const rowIndex = this.values.findIndex((x) => x.key === key);
if (rowIndex >= 0) {
mergeWith(this.statuses[rowIndex], rowStatuses);
}
};
}