All Downloads are FREE. Search and download functionalities are using the official Maven repository.

META-INF.resources.designer.js.definition-builder.source-builder.SourceBuilder.js Maven / Gradle / Ivy

The newest version!
/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

import ClayAlert from '@clayui/alert';
import ClayIcon from '@clayui/icon';
import ClayLayout from '@clayui/layout';
import ClayLink from '@clayui/link';
import ClayLoadingIndicator from '@clayui/loading-indicator';
import ClayToolbar from '@clayui/toolbar';
import {ClassicEditor} from 'frontend-editor-ckeditor-web';
import React, {useContext, useEffect, useRef, useState} from 'react';
import {isEdge, isNode} from 'react-flow-renderer';

import XMLUtil from '../../../js/definition-builder/source-builder/xmlUtil';
import {DefinitionBuilderContext} from '../DefinitionBuilderContext';
import {editorConfig} from '../constants';
import {xmlNamespace} from './constants';
import DeserializeUtil from './deserializeUtil';
import {serializeDefinition} from './serializeUtil';

export default function SourceBuilder() {
	const {
		blockingError,
		currentEditor,
		definitionDescription,
		definitionName,
		elements,
		setBlockingError,
		setCurrentEditor,
		workflowDefinitionVersions,
	} = useContext(DefinitionBuilderContext);
	const editorRef = useRef();
	const [loading, setLoading] = useState(true);
	const [showImportSuccessMessage, setShowImportSuccessMessage] =
		useState(false);

	useEffect(() => {
		function loadXmlContent() {
			if (currentEditor?.mode === 'source' && elements) {
				const metadata = {
					description: definitionDescription,
					name: definitionName,
					version: workflowDefinitionVersions.length,
				};

				const currentData = currentEditor.getData();
				let currentElements;

				if (currentData) {
					const deserializeUtil = new DeserializeUtil();

					deserializeUtil.updateXMLDefinition(
						encodeURIComponent(currentData)
					);

					currentElements = deserializeUtil.getElements();
				}
				else {
					currentElements = elements;
				}

				const xmlContent = serializeDefinition(
					xmlNamespace,
					metadata,
					currentElements.filter(isNode),
					currentElements.filter(isEdge)
				);

				if (xmlContent) {
					currentEditor.setData(xmlContent);

					setLoading(false);
				}
			}
		}

		const interval = setInterval(() => {
			if (currentEditor) {
				if (currentEditor.mode !== 'source') {
					setTimeout(() => {
						currentEditor.setMode('source');
					}, 1000);
				}
				else {
					clearInterval(interval);
					loadXmlContent();
				}
			}
		}, 1000);

		// eslint-disable-next-line react-hooks/exhaustive-deps
	}, [
		currentEditor,
		definitionName,
		elements,
		workflowDefinitionVersions.length,
	]);

	useEffect(() => {
		if (blockingError.errorType === 'invalidXML') {
			document.addEventListener('keydown', () => {
				setBlockingError({errorType: ''});
			});

			return () => {
				document.removeEventListener('keydown', () => {
					setBlockingError({errorType: ''});
				});
			};
		}
	}, [blockingError, setBlockingError]);

	const writeDefinitionMessage = Liferay.Language.get(
		'write-your-definition-or-x'
	).substring(0, 25);

	const importFileMessage =
		Liferay.Language.get('import-a-file').toLowerCase();

	function handleInvalidXMLBlockingError() {
		setBlockingError(() => ({
			errorMessage: Liferay.Language.get(
				'please-select-a-valid-xml-file'
			),
			errorType: 'invalidXML',
		}));
	}

	function loadFile(event) {
		setBlockingError({errorType: ''});

		const files = event.target.files;

		if (files[0].type === 'text/xml') {
			const reader = new FileReader();

			reader.onloadend = (event) => {
				if (
					event.target.readyState === FileReader.DONE &&
					XMLUtil.validateDefinition(event.target.result)
				) {
					currentEditor.setData(event.target.result);

					const fileInput = document.querySelector('#fileInput');

					fileInput.value = '';

					setShowImportSuccessMessage(true);
				}
				else {
					handleInvalidXMLBlockingError();
				}
			};

			reader.readAsText(files[0]);
		}
		else if (files[0].type !== 'text/xml') {
			handleInvalidXMLBlockingError();
		}
	}

	return (
		<>
			
				
					
						
							{Liferay.Language.get('source')}
						

						
							
{writeDefinitionMessage} loadFile(event)} type="file" />
{loading && ( )} { if ( editor.checkDirty() && !XMLUtil.validateDefinition(editor.getData()) ) { editor.setData(''); } }} onInstanceReady={({editor}) => { editor.setMode('source'); setCurrentEditor(editor); }} ref={editorRef} /> {showImportSuccessMessage && ( setShowImportSuccessMessage(false)} title={`${Liferay.Language.get('success')}:`} > {Liferay.Language.get( 'definition-imported-successfully' )} )} {blockingError.errorType === 'invalidXML' && ( setBlockingError({errorType: ''})} title={`${Liferay.Language.get('error')}:`} > {Liferay.Language.get('please-select-a-valid-xml-file')} )} ); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy