UNPKG

@sklinet/strapi-plugin-tinymce

Version:

Strapi custom field with a customized build of TinyMCE richtext editor.

1 lines 10.6 kB
{"version":3,"file":"Wysiwyg-DKKo1ZGa.mjs","sources":["../../admin/src/utils/prefixFileUrlWithBackendUrl.ts","../../admin/src/components/Editor.tsx","../../admin/src/components/MediaLib.tsx","../../admin/src/components/Wysiwyg.tsx"],"sourcesContent":["export const prefixFileUrlWithBackendUrl = (path: string, defaultDomain = 'http://localhost:1337') => {\n if (path?.startsWith('http')) {\n return path;\n }\n const url = process.env.BACKEND_URL;\n\n if (url) {\n return url + path;\n } else {\n return defaultDomain + path;\n }\n};\n","import React, { useEffect, useState } from 'react';\nimport { Editor } from '@tinymce/tinymce-react';\nimport { PLUGIN_ID } from '../pluginId';\nimport taskRequests from '../api/settings';\nimport { useFetchClient } from '@strapi/strapi/admin';\nimport { prefixFileUrlWithBackendUrl } from '../utils/prefixFileUrlWithBackendUrl';\n\ninterface TinyEditorProps {\n onChange: (e: any) => void;\n name: string;\n value?: string;\n disabled?: boolean;\n}\n\nconst TinyEditor = ({ onChange, name, value, disabled }: TinyEditorProps) => {\n const { get } = useFetchClient();\n\n const [pluginConfig, setPluginConfig] = useState<any>(null);\n const [apiKey, setApiKey] = useState('');\n const [loading, setLoading] = useState(true);\n const uploadUrl = prefixFileUrlWithBackendUrl('/api/upload', pluginConfig?.data?.defaultAdminDomain || '');\n\n useEffect(() => {\n const getApiKey = async () => {\n const data = await taskRequests.getSettings();\n if (data) {\n return setApiKey(data.data.apiKey);\n }\n };\n const getPluginConfig = async () => {\n const editor = await get(`/${PLUGIN_ID}/config/editor`);\n if (editor) {\n setPluginConfig(editor);\n }\n };\n getApiKey().then(() => {\n setLoading(false);\n });\n getPluginConfig();\n }, []);\n\n return !loading && pluginConfig?.data ? (\n <Editor\n apiKey={apiKey || ''}\n tinymceScriptSrc={pluginConfig?.data?.tinymceSrc || undefined}\n value={value}\n tagName={name}\n onEditorChange={(editorContent) => {\n onChange({ target: { name, value: editorContent } });\n }}\n init={{\n ...pluginConfig?.data?.editorConfig,\n images_upload_handler: async (blobInfo) => {\n const formData = new FormData();\n formData.append('files', blobInfo.blob());\n const response = await fetch(uploadUrl, {\n method: 'POST',\n headers: {\n Authorization: 'Bearer ',\n },\n body: formData,\n })\n .then((response) => response.json())\n .catch(function (err) {\n console.log('error:', err);\n });\n return response?.[0]?.url || '';\n },\n }}\n />\n ) : (\n <></>\n );\n};\n\nexport default TinyEditor;\n","import React from 'react';\nimport { prefixFileUrlWithBackendUrl } from '../utils/prefixFileUrlWithBackendUrl';\nimport { useStrapiApp } from '@strapi/strapi/admin';\n\ninterface MediaLibProps {\n isOpen?: boolean;\n onChange?: (e: any) => void;\n onToggle?: () => void;\n}\n\nconst MediaLib = ({ isOpen, onChange, onToggle }: MediaLibProps) => {\n const mediaLibraryDialog = useStrapiApp('mediaLibrary', (state: any) => state.components);\n const MediaDialog = mediaLibraryDialog['media-library'];\n\n\n const handleSelectAssets = (files: any) => {\n const formattedFiles = files.map((f: any) => ({\n alt: f.alternativeText || f.name,\n url: prefixFileUrlWithBackendUrl(f.url),\n mime: f.mime,\n }));\n\n if (onChange) onChange(formattedFiles);\n };\n\n if (!isOpen) {\n return null;\n }\n\n return <MediaDialog onClose={onToggle} onSelectAssets={handleSelectAssets} />;\n};\n\nexport default MediaLib;\n","import React, { useState } from 'react';\nimport { Box, Button, Flex, Typography } from '@strapi/design-system';\nimport { Earth, Image } from '@strapi/icons';\nimport TinyEditor from './Editor';\nimport MediaLib from './MediaLib';\n\ninterface WysiwygProps {\n disabled?: boolean;\n error?: string;\n name: string;\n onChange: (e: any) => void;\n required?: boolean;\n label?: string;\n placeholder?: string;\n hint?: string;\n value?: any;\n attribute?: any;\n}\n\nconst Wysiwyg = ({ name, onChange, value, label, disabled, error, required, hint, attribute }: WysiwygProps) => {\n const localized = Boolean(attribute?.pluginOptions?.i18n?.localized || false);\n const [mediaLibVisible, setMediaLibVisible] = useState(false);\n\n const handleToggleMediaLib = () => setMediaLibVisible((prev) => !prev);\n\n const handleChangeAssets = (assets: any) => {\n let newValue = value ? value : \"\";\n\n assets.map((asset: any) => {\n if (asset.mime.includes(\"image\")) {\n const imgTag = `<p><img src=\"${asset.url}\" alt=\"${asset.alt}\"></img></p>`;\n newValue = `${newValue}${imgTag}`;\n }\n if (asset.mime.includes(\"video\")) {\n const videoTag = `<video><source src=\"${asset.url}\" alt=\"${asset.alt}\"</source></video>`;\n newValue = `${newValue}${videoTag}`;\n }\n });\n\n onChange({ target: {name, value: newValue } });\n handleToggleMediaLib();\n };\n\n return (\n <>\n <Box>\n {label && (\n <Flex paddingBottom={1}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\">\n {label}\n </Typography>\n {required && (\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"danger600\">\n *\n </Typography>\n )}\n {localized && (\n <Flex paddingLeft={1}>\n <Earth width={12} height={12}/>\n </Flex>\n )}\n </Flex>\n )}\n <Button\n startIcon={<Image/>}\n variant=\"secondary\"\n fullWidth\n onClick={handleToggleMediaLib}\n >\n Media library\n </Button>\n <TinyEditor disabled={Boolean(disabled)} name={name} onChange={onChange} value={value}/>\n {(error || hint) && (\n <Box paddingTop={1}>\n {error ? (\n <Typography variant=\"pi\" textColor=\"danger600\">\n {error}\n </Typography>\n ) : (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {hint}\n </Typography>\n )}\n </Box>\n )}\n </Box>\n <MediaLib\n isOpen={mediaLibVisible}\n onChange={handleChangeAssets}\n onToggle={handleToggleMediaLib}\n />\n </>\n );\n};\n\nexport default Wysiwyg;\n"],"names":["response"],"mappings":"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"}