import React, { useState, useEffect, useCallback, useMemo, } from 'react'; import { useTranslation } from 'next-i18next'; import GrowiArchiveImportOption from '~/models/admin/growi-archive-import-option'; import ImportOptionForPages from '~/models/admin/import-option-for-pages'; import ImportOptionForRevisions from '~/models/admin/import-option-for-revisions'; import ImportCollectionConfigurationModal from './ImportData/GrowiArchive/ImportCollectionConfigurationModal'; import ImportCollectionItem, { DEFAULT_MODE, MODE_RESTRICTED_COLLECTION } from './ImportData/GrowiArchive/ImportCollectionItem'; const GROUPS_PAGE = [ 'pages', 'revisions', 'tags', 'pagetagrelations', ]; const GROUPS_USER = [ 'users', 'externalaccounts', 'usergroups', 'usergrouprelations', ]; const GROUPS_CONFIG = [ 'configs', 'updateposts', 'globalnotificationsettings', ]; const ALL_GROUPED_COLLECTIONS = GROUPS_PAGE.concat(GROUPS_USER).concat(GROUPS_CONFIG); const IMPORT_OPTION_CLASS_MAPPING = { pages: ImportOptionForPages, revisions: ImportOptionForRevisions, }; type Props = { allCollectionNames: string[], selectedCollections: Set, updateSelectedCollections: (newSelectedCollections: Set) => void, optionsMap: any, updateOptionsMap: (newOptionsMap: any) => void, }; const G2GDataTransferExportForm = (props: Props): JSX.Element => { const { t } = useTranslation('admin'); const { allCollectionNames, selectedCollections, updateSelectedCollections, optionsMap, updateOptionsMap, } = props; const [isConfigurationModalOpen, setConfigurationModalOpen] = useState(false); const [collectionNameForConfiguration, setCollectionNameForConfiguration] = useState(); const checkAll = useCallback(() => { updateSelectedCollections(new Set(allCollectionNames)); }, [allCollectionNames, updateSelectedCollections]); const uncheckAll = useCallback(() => { updateSelectedCollections(new Set()); }, [updateSelectedCollections]); const updateOption = useCallback((collectionName, data) => { const options = optionsMap[collectionName]; // merge Object.assign(options, data); const updatedOptionsMap = {}; updatedOptionsMap[collectionName] = options; updateOptionsMap((prev) => { return { ...prev, updatedOptionsMap }; }); }, [optionsMap, updateOptionsMap]); const ImportItems = ({ collectionNames }): JSX.Element => { const toggleCheckbox = (collectionName, bool) => { const collections = new Set(selectedCollections); if (bool) { collections.add(collectionName); } else { collections.delete(collectionName); } updateSelectedCollections(collections); // TODO: validation // this.validate(); }; const openConfigurationModal = (collectionName) => { setConfigurationModalOpen(true); setCollectionNameForConfiguration(collectionName); }; return (
{collectionNames.map((collectionName) => { const isConfigButtonAvailable = Object.keys(IMPORT_OPTION_CLASS_MAPPING).includes(collectionName); if (optionsMap[collectionName] == null) { return null; } return (
); })}
); }; const WarnForGroups = ({ errors }: { errors: Error[] }): JSX.Element => { if (errors.length === 0) { return <>; } return (
    {errors.map((error) => { return
  • {error.message}
  • ; })}
); }; const GroupImportItems = ({ groupList, groupName, errors }): JSX.Element => { const collectionNames = groupList.filter((groupCollectionName) => { return allCollectionNames.includes(groupCollectionName); }); if (collectionNames.length === 0) { return <>; } return (
{groupName} Collections
); }; const OtherImportItems = (): JSX.Element => { const collectionNames = allCollectionNames.filter((collectionName) => { return !ALL_GROUPED_COLLECTIONS.includes(collectionName); }); // TODO: エラー対応 return ; }; const configurationModal = useMemo(() => { if (collectionNameForConfiguration == null) { return <>; } return ( setConfigurationModalOpen(false)} onOptionChange={updateOption} collectionName={collectionNameForConfiguration} option={optionsMap[collectionNameForConfiguration]} /> ); }, [collectionNameForConfiguration, isConfigurationModalOpen, optionsMap, updateOption]); const setInitialOptionsMap = useCallback(() => { const initialOptionsMap = {}; allCollectionNames.forEach((collectionName) => { const initialMode = (MODE_RESTRICTED_COLLECTION[collectionName] != null) ? MODE_RESTRICTED_COLLECTION[collectionName][0] : DEFAULT_MODE; const ImportOption = IMPORT_OPTION_CLASS_MAPPING[collectionName] || GrowiArchiveImportOption; initialOptionsMap[collectionName] = new ImportOption(initialMode); }); updateOptionsMap(initialOptionsMap); }, [allCollectionNames, updateOptionsMap]); useEffect(() => { setInitialOptionsMap(); }, []); return ( <>
  • {t('admin:importer_management.growi_settings.description_of_import_mode.about')}
    • {t('admin:importer_management.growi_settings.description_of_import_mode.insert')}
    • {t('admin:importer_management.growi_settings.description_of_import_mode.upsert')}
    • {t('admin:importer_management.growi_settings.description_of_import_mode.flash_and_insert')}
{/* TODO: エラー追加 */} {configurationModal} ); }; export default G2GDataTransferExportForm;