2020-12-16 10:53:28 +00:00
|
|
|
import { FileUpload } from "@saleor/files/types/FileUpload";
|
|
|
|
import { AttributeErrorFragment } from "@saleor/fragments/types/AttributeErrorFragment";
|
|
|
|
import { SelectedVariantAttributeFragment } from "@saleor/fragments/types/SelectedVariantAttributeFragment";
|
|
|
|
import { UploadErrorFragment } from "@saleor/fragments/types/UploadErrorFragment";
|
|
|
|
import { FormsetData } from "@saleor/hooks/useFormset";
|
|
|
|
import { PageDetails_page_attributes } from "@saleor/pages/types/PageDetails";
|
|
|
|
import {
|
|
|
|
AttributeInputTypeEnum,
|
|
|
|
AttributeValueInput
|
|
|
|
} from "@saleor/types/globalTypes";
|
|
|
|
import { MutationFetchResult } from "react-apollo";
|
|
|
|
|
2021-01-12 11:11:15 +00:00
|
|
|
import { AttributePageFormData } from "../components/AttributePage";
|
|
|
|
import { AttributeValueEditDialogFormData } from "../components/AttributeValueEditDialog";
|
2020-12-16 10:53:28 +00:00
|
|
|
import { AttributeValueDelete } from "../types/AttributeValueDelete";
|
|
|
|
|
2021-01-12 11:11:15 +00:00
|
|
|
export const ATTRIBUTE_TYPES_WITH_DEDICATED_VALUES = [
|
|
|
|
AttributeInputTypeEnum.DROPDOWN,
|
|
|
|
AttributeInputTypeEnum.MULTISELECT
|
|
|
|
];
|
|
|
|
|
|
|
|
function getSimpleAttributeData(
|
|
|
|
data: AttributePageFormData,
|
|
|
|
values: AttributeValueEditDialogFormData[]
|
|
|
|
) {
|
|
|
|
return {
|
|
|
|
...data,
|
|
|
|
metadata: undefined,
|
|
|
|
privateMetadata: undefined,
|
|
|
|
storefrontSearchPosition: parseInt(data.storefrontSearchPosition, 10),
|
|
|
|
values: values.map(value => ({
|
|
|
|
name: value.name
|
|
|
|
}))
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function getFileOrReferenceAttributeData(
|
|
|
|
data: AttributePageFormData,
|
|
|
|
values: AttributeValueEditDialogFormData[]
|
|
|
|
) {
|
|
|
|
return {
|
|
|
|
...getSimpleAttributeData(data, values),
|
|
|
|
availableInGrid: undefined,
|
|
|
|
filterableInDashboard: undefined,
|
|
|
|
filterableInStorefront: undefined
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function getAttributeData(
|
|
|
|
data: AttributePageFormData,
|
|
|
|
values: AttributeValueEditDialogFormData[]
|
|
|
|
) {
|
|
|
|
if (ATTRIBUTE_TYPES_WITH_DEDICATED_VALUES.includes(data.inputType)) {
|
|
|
|
return getSimpleAttributeData(data, values);
|
|
|
|
} else {
|
|
|
|
return getFileOrReferenceAttributeData(data, values);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-16 10:53:28 +00:00
|
|
|
export const isFileValueUnused = (
|
|
|
|
attributesWithNewFileValue: FormsetData<null, File>,
|
|
|
|
existingAttribute:
|
|
|
|
| PageDetails_page_attributes
|
|
|
|
| SelectedVariantAttributeFragment
|
|
|
|
) => {
|
|
|
|
if (existingAttribute.attribute.inputType !== AttributeInputTypeEnum.FILE) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (existingAttribute.values.length === 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
const modifiedAttribute = attributesWithNewFileValue.find(
|
|
|
|
dataAttribute => dataAttribute.id === existingAttribute.attribute.id
|
|
|
|
);
|
|
|
|
|
|
|
|
return !!modifiedAttribute;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const mergeFileUploadErrors = (
|
|
|
|
uploadFilesResult: Array<MutationFetchResult<FileUpload>>
|
|
|
|
): UploadErrorFragment[] =>
|
|
|
|
uploadFilesResult.reduce((errors, uploadFileResult) => {
|
|
|
|
const uploadErrors = uploadFileResult?.data?.fileUpload?.uploadErrors;
|
|
|
|
if (uploadErrors) {
|
|
|
|
return [...errors, ...uploadErrors];
|
|
|
|
}
|
|
|
|
return errors;
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
export const mergeAttributeValueDeleteErrors = (
|
|
|
|
deleteAttributeValuesResult: Array<MutationFetchResult<AttributeValueDelete>>
|
|
|
|
): AttributeErrorFragment[] =>
|
|
|
|
deleteAttributeValuesResult.reduce((errors, deleteValueResult) => {
|
|
|
|
const deleteErrors = deleteValueResult?.data?.attributeValueDelete?.errors;
|
|
|
|
if (deleteErrors) {
|
|
|
|
return [...errors, ...deleteErrors];
|
|
|
|
}
|
|
|
|
return errors;
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
export const getFileValuesToUploadFromAttributes = (
|
|
|
|
attributesWithNewFileValue: FormsetData<null, File>
|
|
|
|
) => attributesWithNewFileValue.filter(fileAttribute => !!fileAttribute.value);
|
|
|
|
|
|
|
|
export const getFileValuesRemovedFromAttributes = (
|
|
|
|
attributesWithNewFileValue: FormsetData<null, File>
|
|
|
|
) => attributesWithNewFileValue.filter(attribute => !attribute.value);
|
|
|
|
|
|
|
|
export const getAttributesOfRemovedFiles = (
|
|
|
|
fileAttributesRemoved: FormsetData<null, File>
|
|
|
|
) =>
|
|
|
|
fileAttributesRemoved.map(attribute => ({
|
|
|
|
file: undefined,
|
|
|
|
id: attribute.id,
|
|
|
|
values: []
|
|
|
|
}));
|
|
|
|
|
|
|
|
export const getAttributesOfUploadedFiles = (
|
|
|
|
fileValuesToUpload: FormsetData<null, File>,
|
|
|
|
uploadFilesResult: Array<MutationFetchResult<FileUpload>>
|
|
|
|
) =>
|
|
|
|
uploadFilesResult.map((uploadFileResult, index) => {
|
|
|
|
const attribute = fileValuesToUpload[index];
|
|
|
|
|
|
|
|
return {
|
|
|
|
file: uploadFileResult.data.fileUpload.uploadedFile.url,
|
|
|
|
id: attribute.id,
|
|
|
|
values: []
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
export const getAttributesAfterFileAttributesUpdate = (
|
|
|
|
attributesWithNewFileValue: FormsetData<null, File>,
|
|
|
|
uploadFilesResult: Array<MutationFetchResult<FileUpload>>
|
|
|
|
): AttributeValueInput[] => {
|
|
|
|
const removedFileValues = getFileValuesRemovedFromAttributes(
|
|
|
|
attributesWithNewFileValue
|
|
|
|
);
|
|
|
|
const fileValuesToUpload = getFileValuesToUploadFromAttributes(
|
|
|
|
attributesWithNewFileValue
|
|
|
|
);
|
|
|
|
|
|
|
|
const removedFileAttributes = getAttributesOfRemovedFiles(removedFileValues);
|
|
|
|
const uploadedFileAttributes = getAttributesOfUploadedFiles(
|
|
|
|
fileValuesToUpload,
|
|
|
|
uploadFilesResult
|
|
|
|
);
|
|
|
|
|
|
|
|
return uploadedFileAttributes.concat(removedFileAttributes);
|
|
|
|
};
|