Files
MyClub/RICHTEXT_EDITOR_REAL_ISSUE_FIXED.md
T
Tomas Dvorak 63700eedb2 dev day #67
2025-10-21 15:02:05 +02:00

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 F12Console 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 F12Elements 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:

  1. Loading State (brief, ~100ms):

    ┌─────────────────────┐
    │   ⟳ Načítání       │
    │   editoru...       │
    └─────────────────────┘
    
  2. Editor Appears:

    ┌──────────────────────────────────────────┐
    │ [H] [B] [I] [U] [S] [⚙] [•] [1] [≡] [🔗] │ ← Toolbar
    ├──────────────────────────────────────────┤
    │                                          │
    │  Začněte psát...                         │ ← Editor
    │  |                                       │
    │                                          │
    └──────────────────────────────────────────┘
    
  3. 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

  1. frontend/src/components/common/CustomRichEditor.tsx

    • Dynamic ReactQuill import
    • Initialization tracking
    • Loading state fallback
    • Explicit formats list
  2. frontend/src/styles/custom-editor.css (from previous fix)

    • Visibility CSS rules
  3. frontend/src/index.tsx (from previous fix)

    • Import order clarification

Key Takeaways

  1. DOM Inspection is Critical: The <div class="quill"><div></div></div> structure revealed the real issue
  2. Not All Problems Are CSS: Sometimes visibility issues are actually initialization failures
  3. React 18 + Quill Compatibility: Known issue requires workarounds
  4. 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-toolbar and .ql-container elements
  • 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