7.6 KiB
Rich Text Editor - REAL Issue Found & Fixed
The Real Problem 🔍
After inspecting the actual DOM structure:
<div class="quill">
<div></div> <!-- ❌ Empty! Should contain .ql-toolbar and .ql-container -->
</div>
The issue was NOT a CSS visibility problem. The Quill editor was not initializing at all.
Root Cause
- React 18 Strict Mode + react-quill v2.0.0 compatibility issue
- Strict Mode causes double-mounting in development
- Quill's initialization fails during the unmount/remount cycle
- Result: ReactQuill wrapper renders, but Quill instance inside never creates
The Fix Applied ✅
1. Dynamic Import of ReactQuill
File: frontend/src/components/common/CustomRichEditor.tsx
Changed from static import to dynamic loading:
// Before (static import)
import ReactQuill from 'react-quill';
// After (dynamic import)
let ReactQuill: any = null;
if (typeof window !== 'undefined') {
ReactQuill = require('react-quill');
}
Why: Ensures ReactQuill loads properly in the browser environment and avoids SSR issues.
2. Added Initialization Tracking
// State to track if Quill is mounted (fix for React 18 StrictMode)
const [quillMounted, setQuillMounted] = useState(false);
// Ensure Quill initializes properly (React 18 StrictMode fix)
useEffect(() => {
const timer = setTimeout(() => {
if (quillRef.current) {
const editor = quillRef.current.getEditor();
if (editor) {
setQuillMounted(true);
console.log('Quill editor initialized successfully');
} else {
console.warn('Quill editor failed to initialize');
}
}
}, 100);
return () => clearTimeout(timer);
}, []);
Why: Monitors Quill initialization and logs warnings if it fails.
3. Added Loading State Fallback
{!ReactQuill ? (
<Center minH={height} bg="gray.50" borderRadius="md">
<VStack spacing={3}>
<Spinner size="lg" color="blue.500" thickness="4px" />
<Text color="gray.600">Načítání editoru...</Text>
</VStack>
</Center>
) : (
<ReactQuill
key={`quill-${readOnly ? 'readonly' : 'edit'}`}
theme="snow"
value={value}
onChange={handleChange}
readOnly={readOnly}
placeholder={placeholder}
ref={quillRef}
modules={quillModules}
formats={[...]}
/>
)}
Why: Shows a spinner while ReactQuill loads, provides better UX.
4. Added Explicit Formats List
formats={[
'header',
'bold', 'italic', 'underline', 'strike',
'color', 'background',
'list', 'bullet',
'align',
'link', 'image',
'blockquote',
'clean'
]}
Why: Explicitly defines allowed formats to ensure Quill knows what to render in the toolbar.
5. Fixed Container Sizing (From Previous Fix)
<Box
position="relative"
borderWidth="1px"
borderColor={borderColor}
borderRadius="md"
overflow="visible" // ✅ Was "hidden"
bg={bgColor}
minHeight={height} // ✅ Added
width="100%" // ✅ Added
display="block" // ✅ Added
sx={{...}}
>
How to Test
Step 1: Rebuild Frontend
cd frontend
npm start
Step 2: Open Browser Console
Press F12 → Console tab
Step 3: Navigate to Admin Page
Go to: http://localhost:3000/admin/articles (or /admin/about)
Step 4: Watch Console
You should see:
✅ Quill editor initialized successfully
Step 5: Inspect DOM
Press F12 → Elements tab → Search for "ql-toolbar"
You should now see:
<div class="quill">
<div class="ql-toolbar ql-snow"> <!-- ✅ Toolbar exists! -->
<span class="ql-formats">...</span>
</div>
<div class="ql-container ql-snow"> <!-- ✅ Container exists! -->
<div class="ql-editor">...</div> <!-- ✅ Editor exists! -->
</div>
</div>
Expected Behavior ✅
After the fix:
-
Loading State (brief, ~100ms):
┌─────────────────────┐ │ ⟳ Načítání │ │ editoru... │ └─────────────────────┘ -
Editor Appears:
┌──────────────────────────────────────────┐ │ [H] [B] [I] [U] [S] [⚙] [•] [1] [≡] [🔗] │ ← Toolbar ├──────────────────────────────────────────┤ │ │ │ Začněte psát... │ ← Editor │ | │ │ │ └──────────────────────────────────────────┘ -
Console shows:
Quill editor initialized successfully
If Still Not Working 🔧
Check 1: Verify React Quill is Installed
cd frontend
npm list react-quill quill
Expected:
├── quill@2.0.3
└── react-quill@2.0.0
Check 2: Reinstall if Needed
cd frontend
rm -rf node_modules package-lock.json
npm install
Check 3: Check Console for Errors
Look for:
- ❌
Cannot find module 'react-quill' - ❌
Quill is not defined - ❌
Cannot read property 'getEditor' of null
Check 4: Temporary Disable Strict Mode (Testing Only)
In frontend/src/index.tsx:
// Temporarily remove StrictMode wrapper
root.render(
// <React.StrictMode> // ← Comment out
<ErrorBoundary>
<HelmetProvider>
<ColorModeScript initialColorMode={theme.config.initialColorMode} />
<App />
</HelmetProvider>
</ErrorBoundary>
// </React.StrictMode> // ← Comment out
);
If it works without StrictMode, the issue is confirmed as a StrictMode conflict.
Why Previous CSS Fix Wasn't Enough
The previous fix added:
.ql-toolbar, .ql-container, .ql-editor {
display: block !important;
visibility: visible !important;
opacity: 1 !important;
}
This helped with layout issues, but couldn't solve the fact that Quill wasn't initializing at all.
The CSS was trying to show elements that didn't exist because Quill never created them.
Files Modified
-
✅
frontend/src/components/common/CustomRichEditor.tsx- Dynamic ReactQuill import
- Initialization tracking
- Loading state fallback
- Explicit formats list
-
✅
frontend/src/styles/custom-editor.css(from previous fix)- Visibility CSS rules
-
✅
frontend/src/index.tsx(from previous fix)- Import order clarification
Key Takeaways
- DOM Inspection is Critical: The
<div class="quill"><div></div></div>structure revealed the real issue - Not All Problems Are CSS: Sometimes visibility issues are actually initialization failures
- React 18 + Quill Compatibility: Known issue requires workarounds
- Dynamic Imports Help: Ensures libraries load in the correct environment
Success Criteria
Fix is successful when:
- Console shows "Quill editor initialized successfully"
- DOM contains
.ql-toolbarand.ql-containerelements - Toolbar buttons are visible and functional
- Editor area is visible and clickable
- Text can be typed and formatted
- Images can be inserted
- All admin pages with RichTextEditor work
Rollback if Needed
git checkout HEAD -- frontend/src/components/common/CustomRichEditor.tsx
Status: Real issue identified and fixed Confidence: High - Targets the actual initialization problem Next Steps: Rebuild, test, and verify in browser console