Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blokh/fix/refactor update category #517

Merged
merged 14 commits into from
Jun 14, 2023
Prev Previous commit
Next Next commit
feat(added usewatchdropdown logic for category to type logic): added …
…usewatchdropdown

added usewatchdropdown logic for category to type logic
  • Loading branch information
Blokh committed Jun 12, 2023
commit d7e9b9038f138956357bbb4e3eb7846299e5b927
Original file line number Diff line number Diff line change
@@ -19,8 +19,9 @@ import { SelectContent } from '../../../../common/components/atoms/Select/Select
import { SelectTrigger } from '../../../../common/components/atoms/Select/Select.Trigger';
import { SelectValue } from '../../../../common/components/atoms/Select/Select.Value';
import { Select } from '../../../../common/components/atoms/Select/Select';
import { TDropdownOption } from './types';
import { useWatchDropdownOptions } from './hooks/useWatchDropdown';

const UPDATEABLE_FIELDS = ['type', 'category'];
export const EditableDetails: FunctionComponent<IEditableDetails> = ({
data,
valueId,
@@ -33,6 +34,12 @@ export const EditableDetails: FunctionComponent<IEditableDetails> = ({
const { mutate: mutateUpdateWorkflowById } = useUpdateWorkflowByIdMutation({
workflowId,
});
const useInitiateCategorySetValue = () => {
useEffect(() => {
const categoryValue = form.getValues('category');
form.setValue('category', categoryValue);
}, [form, data, setFormData]);
};
const POSITIVE_VALUE_INDICATOR = ['approved'];
const NEGATIVE_VALUE_INDICATOR = ['revision', 'rejected'];
const isDecisionPositive = (isDecisionComponent: boolean, value) => {
@@ -64,11 +71,10 @@ export const EditableDetails: FunctionComponent<IEditableDetails> = ({
const form = useForm({
defaultValues,
});
const onSubmit: SubmitHandler<Record<PropertyKey, unknown>> = data => {
const onSubmit: SubmitHandler<Record<PropertyKey, unknown>> = formData => {
const context = {
documents: documents?.map(document => {
if (document?.id !== valueId) return document;
console.log('data', data);
const properties = Object.keys(document?.propertiesSchema?.properties ?? {}).reduce(
(acc, curr) => {
if (!data?.[curr]) return acc;
@@ -81,8 +87,8 @@ export const EditableDetails: FunctionComponent<IEditableDetails> = ({

return {
...document,
type: data.type,
category: data.category,
type: formData.type,
category: formData.category,
properties: properties,
};
}),
@@ -94,28 +100,9 @@ export const EditableDetails: FunctionComponent<IEditableDetails> = ({
});
};
const isDecisionComponent = title === 'Decision';
const watch = form.watch;
React.useEffect(() => {
watch((value, { name, type }) => {
const newData = JSON.parse(JSON.stringify(data));
newData
.filter(item => !!item.dropdownOptions)
.filter(item =>
item.dropdownOptions.find(dropdownOption => dropdownOption.dependantOn === name),
)
.forEach(item => {
item.dropdownOptions = item.dropdownOptions.filter(
(dropdownOption: TDropdownOption) => dropdownOption.dependantValue === value[name],
);
item.value = item.dropdownOptions.find(
dropDownOption => dropDownOption.value == value,
)?.value;

return (newData[newData.indexOf(item)] = item);
});
setFormData(newData);
});
}, [watch]);
useWatchDropdownOptions({ form, data, setFormData });
useInitiateCategorySetValue();

return (
<Form {...form}>
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { useEffect } from 'react';
import { TDropdownOption } from '../types';
export const useWatchDropdownOptions = ({ form, data, setFormData }) => {
Comment on lines +2 to +3
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A bit of space is necessary here :) Prettier & ESLint should do it, will fix it sometime.

Suggested change
import { TDropdownOption } from '../types';
export const useWatchDropdownOptions = ({ form, data, setFormData }) => {
import { TDropdownOption } from '../types';
export const useWatchDropdownOptions = ({ form, data, setFormData }) => {

const watch = form.watch;

useEffect(() => {
const subscription = watch((value, { name }) => {
if (!['category'].includes(name)) return subscription.unsubscribe();
const newData = structuredClone(data);

newData
.filter(item => !!item.dropdownOptions)
.filter(item =>
item.dropdownOptions.find(dropdownOption => dropdownOption.dependantOn === name),
)
.forEach(item => {
item.dropdownOptions = item.dropdownOptions.filter(
(dropdownOption: TDropdownOption) => dropdownOption.dependantValue === value[name],
);
item.value = item.dropdownOptions.find(
dropDownOption => dropDownOption.value == value,
)?.value;

form.setValue(item.title, `${item.value}`);
return (newData[newData.indexOf(item)] = item);
});

setFormData(newData);
});

return () => subscription.unsubscribe();
}, [watch, data, setFormData]);
};
Original file line number Diff line number Diff line change
@@ -16,6 +16,13 @@ import {
omit,
} from './utils';

const NONE_EDITABLE_FIELDS = ['category'] as const;
const composeIsEditable = (isEditable: boolean, title: string) => {
if (NONE_EDITABLE_FIELDS.includes(title)) return false;

return isEditable;
};

export const useEntity = () => {
const { entityId } = useParams();
const { data: entity, isLoading } = useEntityWithWorkflowQuery(entityId);
@@ -129,7 +136,8 @@ export const useEntity = () => {
type,
format,
pattern,
isEditable: caseState.writeEnabled && isEditable,
isEditable:
caseState.writeEnabled && composeIsEditable(isEditable, title),
dropdownOptions,
};
},