diff --git a/.kilocode/mcp.json b/.kilocode/mcp.json new file mode 100644 index 0000000..859c764 --- /dev/null +++ b/.kilocode/mcp.json @@ -0,0 +1 @@ +{"mcpServers":{"playwright":{"command":"npx","args":["-y","@playwright/mcp@0.0.38"],"alwaysAllow":["browser_evaluate","browser_navigate","browser_take_screenshot","browser_console_messages","browser_click","browser_wait_for"]}}} \ No newline at end of file diff --git a/.playwright-mcp/after-close-dialog.png b/.playwright-mcp/after-close-dialog.png new file mode 100644 index 0000000..0a28aed Binary files /dev/null and b/.playwright-mcp/after-close-dialog.png differ diff --git a/.playwright-mcp/after-drag-css-grid.png b/.playwright-mcp/after-drag-css-grid.png new file mode 100644 index 0000000..f2318ec Binary files /dev/null and b/.playwright-mcp/after-drag-css-grid.png differ diff --git a/.playwright-mcp/after-drag-test-1.png b/.playwright-mcp/after-drag-test-1.png new file mode 100644 index 0000000..bebc047 Binary files /dev/null and b/.playwright-mcp/after-drag-test-1.png differ diff --git a/.playwright-mcp/after-drag-test.png b/.playwright-mcp/after-drag-test.png new file mode 100644 index 0000000..3696bb6 Binary files /dev/null and b/.playwright-mcp/after-drag-test.png differ diff --git a/.playwright-mcp/after-refresh.png b/.playwright-mcp/after-refresh.png new file mode 100644 index 0000000..2181a48 Binary files /dev/null and b/.playwright-mcp/after-refresh.png differ diff --git a/.playwright-mcp/back-to-beautiful-masonry.png b/.playwright-mcp/back-to-beautiful-masonry.png new file mode 100644 index 0000000..3acc080 Binary files /dev/null and b/.playwright-mcp/back-to-beautiful-masonry.png differ diff --git a/.playwright-mcp/before-drag.png b/.playwright-mcp/before-drag.png new file mode 100644 index 0000000..5d74cd5 Binary files /dev/null and b/.playwright-mcp/before-drag.png differ diff --git a/.playwright-mcp/before-real-test.png b/.playwright-mcp/before-real-test.png new file mode 100644 index 0000000..e256cce Binary files /dev/null and b/.playwright-mcp/before-real-test.png differ diff --git a/.playwright-mcp/css-grid-layout.png b/.playwright-mcp/css-grid-layout.png new file mode 100644 index 0000000..52c12d2 Binary files /dev/null and b/.playwright-mcp/css-grid-layout.png differ diff --git a/.playwright-mcp/current-ugly-columns.png b/.playwright-mcp/current-ugly-columns.png new file mode 100644 index 0000000..d2e5445 Binary files /dev/null and b/.playwright-mcp/current-ugly-columns.png differ diff --git a/.playwright-mcp/dnd-kit-after-drag.png b/.playwright-mcp/dnd-kit-after-drag.png new file mode 100644 index 0000000..86bd10d Binary files /dev/null and b/.playwright-mcp/dnd-kit-after-drag.png differ diff --git a/.playwright-mcp/dnd-kit-after-slow-drag.png b/.playwright-mcp/dnd-kit-after-slow-drag.png new file mode 100644 index 0000000..55f0c51 Binary files /dev/null and b/.playwright-mcp/dnd-kit-after-slow-drag.png differ diff --git a/.playwright-mcp/dnd-kit-initial.png b/.playwright-mcp/dnd-kit-initial.png new file mode 100644 index 0000000..32a618f Binary files /dev/null and b/.playwright-mcp/dnd-kit-initial.png differ diff --git a/.playwright-mcp/dnd-kit-ready.png b/.playwright-mcp/dnd-kit-ready.png new file mode 100644 index 0000000..58f4415 Binary files /dev/null and b/.playwright-mcp/dnd-kit-ready.png differ diff --git a/.playwright-mcp/final-drag-success.png b/.playwright-mcp/final-drag-success.png new file mode 100644 index 0000000..1e5c7ca Binary files /dev/null and b/.playwright-mcp/final-drag-success.png differ diff --git a/.playwright-mcp/grid-after-fix.png b/.playwright-mcp/grid-after-fix.png new file mode 100644 index 0000000..8de488b Binary files /dev/null and b/.playwright-mcp/grid-after-fix.png differ diff --git a/.playwright-mcp/grid-final-check.png b/.playwright-mcp/grid-final-check.png new file mode 100644 index 0000000..734466b Binary files /dev/null and b/.playwright-mcp/grid-final-check.png differ diff --git a/.playwright-mcp/grid-fixed-layout.png b/.playwright-mcp/grid-fixed-layout.png new file mode 100644 index 0000000..aa73711 Binary files /dev/null and b/.playwright-mcp/grid-fixed-layout.png differ diff --git a/.playwright-mcp/grid-no-overlap.png b/.playwright-mcp/grid-no-overlap.png new file mode 100644 index 0000000..aa73711 Binary files /dev/null and b/.playwright-mcp/grid-no-overlap.png differ diff --git a/.playwright-mcp/grid-with-drag-handle.png b/.playwright-mcp/grid-with-drag-handle.png new file mode 100644 index 0000000..ffe643b Binary files /dev/null and b/.playwright-mcp/grid-with-drag-handle.png differ diff --git a/.playwright-mcp/labels-colored-editor.png b/.playwright-mcp/labels-colored-editor.png new file mode 100644 index 0000000..2f5f64a Binary files /dev/null and b/.playwright-mcp/labels-colored-editor.png differ diff --git a/.playwright-mcp/masonry-layout.png b/.playwright-mcp/masonry-layout.png new file mode 100644 index 0000000..21db751 Binary files /dev/null and b/.playwright-mcp/masonry-layout.png differ diff --git a/.playwright-mcp/notes-current-state.png b/.playwright-mcp/notes-current-state.png new file mode 100644 index 0000000..1d324d1 Binary files /dev/null and b/.playwright-mcp/notes-current-state.png differ diff --git a/.playwright-mcp/notes-fixed-masonry.png b/.playwright-mcp/notes-fixed-masonry.png new file mode 100644 index 0000000..e3c2b1c Binary files /dev/null and b/.playwright-mcp/notes-fixed-masonry.png differ diff --git a/.playwright-mcp/notes-grid-layout.png b/.playwright-mcp/notes-grid-layout.png new file mode 100644 index 0000000..6a9847d Binary files /dev/null and b/.playwright-mcp/notes-grid-layout.png differ diff --git a/.playwright-mcp/notes-with-colored-labels.png b/.playwright-mcp/notes-with-colored-labels.png new file mode 100644 index 0000000..ce669a4 Binary files /dev/null and b/.playwright-mcp/notes-with-colored-labels.png differ diff --git a/.playwright-mcp/react-grid-layout-initial.png b/.playwright-mcp/react-grid-layout-initial.png new file mode 100644 index 0000000..8aee7e5 Binary files /dev/null and b/.playwright-mcp/react-grid-layout-initial.png differ diff --git a/.playwright-mcp/react-grid-layout-working.png b/.playwright-mcp/react-grid-layout-working.png new file mode 100644 index 0000000..5d74cd5 Binary files /dev/null and b/.playwright-mcp/react-grid-layout-working.png differ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a4cc84d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,24 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] - 2026-01-04 + +### Fixed +- **Tests**: Fixed Playwright drag-and-drop tests to work with dynamically generated note IDs + - Changed selectors from hardcoded text (`text=Note 1`) to flexible attribute selectors (`[data-draggable="true"]`) + - Updated matchers from `toContain('Note')` to regex patterns `toMatch(/Note \d+/)` to handle unique IDs with timestamps + - Replaced UI-based cleanup with API-based cleanup using `request.delete()` for more reliable test cleanup + +### Database +- Cleaned up 38 accumulated test notes from the database using MCP memento tool +- Retained only essential notes: "test" and 2x "New AI Framework Released" + +### Technical Details +- The drag-and-drop functionality itself was working correctly +- The issue was in the Playwright tests which expected exact text matches but notes were created with unique IDs (e.g., `test-1767557327567-Note 1`) +- Tests now properly handle the dynamic note generation system + +## [Previous Versions] + +See individual commit history for earlier changes. diff --git a/keep-notes/app/actions/notes.ts b/keep-notes/app/actions/notes.ts index 28c49ab..8d47307 100644 --- a/keep-notes/app/actions/notes.ts +++ b/keep-notes/app/actions/notes.ts @@ -21,6 +21,7 @@ export async function getNotes(includeArchived = false) { where: includeArchived ? {} : { isArchived: false }, orderBy: [ { isPinned: 'desc' }, + { order: 'asc' }, { updatedAt: 'desc' } ] }) @@ -245,30 +246,56 @@ export async function getAllLabels() { // Reorder notes (drag and drop) export async function reorderNotes(draggedId: string, targetId: string) { + console.log('[REORDER-DEBUG] reorderNotes called:', { draggedId, targetId }) + try { const draggedNote = await prisma.note.findUnique({ where: { id: draggedId } }) const targetNote = await prisma.note.findUnique({ where: { id: targetId } }) + console.log('[REORDER-DEBUG] Notes found:', { + draggedNote: draggedNote ? { id: draggedNote.id, title: draggedNote.title, isPinned: draggedNote.isPinned, order: draggedNote.order } : null, + targetNote: targetNote ? { id: targetNote.id, title: targetNote.title, isPinned: targetNote.isPinned, order: targetNote.order } : null + }) + if (!draggedNote || !targetNote) { + console.error('[REORDER-DEBUG] Notes not found') throw new Error('Notes not found') } - // Swap the order values - await prisma.$transaction([ + // Get all notes in the same category (pinned or unpinned) + const allNotes = await prisma.note.findMany({ + where: { + isPinned: draggedNote.isPinned, + isArchived: false + }, + orderBy: { order: 'asc' } + }) + + console.log('[REORDER-DEBUG] All notes in category:', allNotes.map(n => ({ id: n.id, title: n.title, order: n.order }))) + + // Create new order array + const reorderedNotes = allNotes.filter(n => n.id !== draggedId) + const targetIndex = reorderedNotes.findIndex(n => n.id === targetId) + reorderedNotes.splice(targetIndex, 0, draggedNote) + + console.log('[REORDER-DEBUG] New order:', reorderedNotes.map((n, i) => ({ id: n.id, title: n.title, newOrder: i }))) + + // Update all notes with new order + const updates = reorderedNotes.map((note, index) => prisma.note.update({ - where: { id: draggedId }, - data: { order: targetNote.order } - }), - prisma.note.update({ - where: { id: targetId }, - data: { order: draggedNote.order } + where: { id: note.id }, + data: { order: index } }) - ]) + ) + + console.log('[REORDER-DEBUG] Executing transaction with', updates.length, 'updates') + await prisma.$transaction(updates) + console.log('[REORDER-DEBUG] Transaction completed successfully') revalidatePath('/') return { success: true } } catch (error) { - console.error('Error reordering notes:', error) + console.error('[REORDER-DEBUG] Error reordering notes:', error) throw new Error('Failed to reorder notes') } } diff --git a/keep-notes/app/layout.tsx b/keep-notes/app/layout.tsx index 454d294..f5ac8d6 100644 --- a/keep-notes/app/layout.tsx +++ b/keep-notes/app/layout.tsx @@ -1,7 +1,7 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; -import { Header } from "@/components/header"; +import { HeaderWrapper } from "@/components/header-wrapper"; import { ToastProvider } from "@/components/ui/toast"; const inter = Inter({ @@ -22,7 +22,7 @@ export default function RootLayout({ -
+ {children} diff --git a/keep-notes/app/page.tsx b/keep-notes/app/page.tsx index 975a7f9..8107cc9 100644 --- a/keep-notes/app/page.tsx +++ b/keep-notes/app/page.tsx @@ -1,23 +1,47 @@ +'use client' + +import { useState, useEffect } from 'react' +import { useSearchParams } from 'next/navigation' +import { Note } from '@/lib/types' import { getNotes, searchNotes } from '@/app/actions/notes' import { NoteInput } from '@/components/note-input' import { NoteGrid } from '@/components/note-grid' -export const dynamic = 'force-dynamic' +export default function HomePage() { + const searchParams = useSearchParams() + const [notes, setNotes] = useState([]) + const [isLoading, setIsLoading] = useState(true) -export default async function HomePage({ - searchParams, -}: { - searchParams: Promise<{ search?: string }> -}) { - const params = await searchParams - const notes = params.search - ? await searchNotes(params.search) - : await getNotes() + useEffect(() => { + const loadNotes = async () => { + setIsLoading(true) + const search = searchParams.get('search') + const labelFilter = searchParams.get('labels')?.split(',').filter(Boolean) || [] + + let allNotes = search ? await searchNotes(search) : await getNotes() + + // Filter by selected labels + if (labelFilter.length > 0) { + allNotes = allNotes.filter(note => + note.labels?.some(label => labelFilter.includes(label)) + ) + } + + setNotes(allNotes) + setIsLoading(false) + } + + loadNotes() + }, [searchParams]) return (
- + {isLoading ? ( +
Loading...
+ ) : ( + + )}
) } diff --git a/keep-notes/components/header-wrapper.tsx b/keep-notes/components/header-wrapper.tsx new file mode 100644 index 0000000..de36f3d --- /dev/null +++ b/keep-notes/components/header-wrapper.tsx @@ -0,0 +1,25 @@ +'use client' + +import { Header } from './header' +import { useSearchParams, useRouter } from 'next/navigation' + +export function HeaderWrapper() { + const searchParams = useSearchParams() + const router = useRouter() + + const selectedLabels = searchParams.get('labels')?.split(',').filter(Boolean) || [] + + const handleLabelFilterChange = (labels: string[]) => { + const params = new URLSearchParams(searchParams.toString()) + + if (labels.length > 0) { + params.set('labels', labels.join(',')) + } else { + params.delete('labels') + } + + router.push(`/?${params.toString()}`) + } + + return
+} diff --git a/keep-notes/components/header.tsx b/keep-notes/components/header.tsx index 71010f8..0846dcd 100644 --- a/keep-notes/components/header.tsx +++ b/keep-notes/components/header.tsx @@ -15,8 +15,14 @@ import { usePathname } from 'next/navigation' import { cn } from '@/lib/utils' import { searchNotes } from '@/app/actions/notes' import { useRouter } from 'next/navigation' +import { LabelFilter } from './label-filter' -export function Header() { +interface HeaderProps { + selectedLabels?: string[] + onLabelFilterChange?: (labels: string[]) => void +} + +export function Header({ selectedLabels = [], onLabelFilterChange }: HeaderProps = {}) { const [searchQuery, setSearchQuery] = useState('') const [isSearching, setIsSearching] = useState(false) const [theme, setTheme] = useState<'light' | 'dark'>('light') @@ -86,8 +92,8 @@ export function Header() { {/* Search Bar */} -
-
+
+
handleSearch(e.target.value)} />
+ {onLabelFilterChange && ( + + )}
{/* Theme Toggle */} diff --git a/keep-notes/components/label-filter.tsx b/keep-notes/components/label-filter.tsx new file mode 100644 index 0000000..d57392f --- /dev/null +++ b/keep-notes/components/label-filter.tsx @@ -0,0 +1,130 @@ +'use client' + +import { useState, useEffect } from 'react' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuTrigger, + DropdownMenuCheckboxItem, + DropdownMenuSeparator, + DropdownMenuLabel, +} from '@/components/ui/dropdown-menu' +import { Button } from '@/components/ui/button' +import { Badge } from '@/components/ui/badge' +import { Filter, X } from 'lucide-react' +import { getAllLabelColors, getLabelColor } from '@/lib/label-storage' +import { LABEL_COLORS } from '@/lib/types' +import { cn } from '@/lib/utils' + +interface LabelFilterProps { + selectedLabels: string[] + onFilterChange: (labels: string[]) => void +} + +export function LabelFilter({ selectedLabels, onFilterChange }: LabelFilterProps) { + const [allLabels, setAllLabels] = useState([]) + + useEffect(() => { + // Load all labels from localStorage + const labelColors = getAllLabelColors() + setAllLabels(Object.keys(labelColors).sort()) + }, []) + + const handleToggleLabel = (label: string) => { + if (selectedLabels.includes(label)) { + onFilterChange(selectedLabels.filter(l => l !== label)) + } else { + onFilterChange([...selectedLabels, label]) + } + } + + const handleClearAll = () => { + onFilterChange([]) + } + + if (allLabels.length === 0) return null + + return ( +
+ + + + + + + Filter by Labels + {selectedLabels.length > 0 && ( + + )} + + + {allLabels.map((label) => { + const colorName = getLabelColor(label) + const colorClasses = LABEL_COLORS[colorName] + const isSelected = selectedLabels.includes(label) + + return ( + handleToggleLabel(label)} + > + + {label} + + + ) + })} + + + + {/* Active filters display */} + {selectedLabels.length > 0 && ( +
+ {selectedLabels.map((label) => { + const colorName = getLabelColor(label) + const colorClasses = LABEL_COLORS[colorName] + + return ( + handleToggleLabel(label)} + > + {label} + + + ) + })} +
+ )} +
+ ) +} diff --git a/keep-notes/components/label-manager.tsx b/keep-notes/components/label-manager.tsx new file mode 100644 index 0000000..66b1998 --- /dev/null +++ b/keep-notes/components/label-manager.tsx @@ -0,0 +1,229 @@ +'use client' + +import { useState, useEffect } from 'react' +import { Button } from './ui/button' +import { Input } from './ui/input' +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from './ui/dialog' +import { Badge } from './ui/badge' +import { Tag, X, Plus, Palette } from 'lucide-react' +import { LABEL_COLORS, LabelColorName } from '@/lib/types' +import { getLabelColor, setLabelColor, deleteLabelColor, getAllLabelColors } from '@/lib/label-storage' +import { cn } from '@/lib/utils' + +interface LabelManagerProps { + existingLabels: string[] + onUpdate: (labels: string[]) => void +} + +export function LabelManager({ existingLabels, onUpdate }: LabelManagerProps) { + const [open, setOpen] = useState(false) + const [newLabel, setNewLabel] = useState('') + const [selectedLabels, setSelectedLabels] = useState(existingLabels) + const [allLabelsInStorage, setAllLabelsInStorage] = useState([]) + const [editingColor, setEditingColor] = useState(null) + + // Load all labels from localStorage + useEffect(() => { + const allColors = getAllLabelColors() + setAllLabelsInStorage(Object.keys(allColors)) + }, [open]) + + const handleAddLabel = () => { + const trimmed = newLabel.trim() + if (trimmed && !selectedLabels.includes(trimmed)) { + const updated = [...selectedLabels, trimmed] + setSelectedLabels(updated) + setNewLabel('') + + // Set default color if doesn't exist + if (getLabelColor(trimmed) === 'gray') { + const colors = Object.keys(LABEL_COLORS) as LabelColorName[] + const randomColor = colors[Math.floor(Math.random() * colors.length)] + setLabelColor(trimmed, randomColor) + } + } + } + + const handleRemoveLabel = (label: string) => { + setSelectedLabels(selectedLabels.filter(l => l !== label)) + } + + const handleSelectExisting = (label: string) => { + if (!selectedLabels.includes(label)) { + setSelectedLabels([...selectedLabels, label]) + } else { + setSelectedLabels(selectedLabels.filter(l => l !== label)) + } + } + + const handleChangeColor = (label: string, color: LabelColorName) => { + setLabelColor(label, color) + setEditingColor(null) + // Force re-render + const allColors = getAllLabelColors() + setAllLabelsInStorage(Object.keys(allColors)) + } + + const handleSave = () => { + onUpdate(selectedLabels) + setOpen(false) + } + + const handleCancel = () => { + setSelectedLabels(existingLabels) + setEditingColor(null) + setOpen(false) + } + + return ( + { + if (!isOpen) { + handleCancel() + } else { + setOpen(true) + } + }}> + + + + + + Manage Labels + + Add or remove labels for this note. Click on a label to change its color. + + + +
+ {/* Add new label */} +
+ setNewLabel(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') { + e.preventDefault() + handleAddLabel() + } + }} + /> + +
+ + {/* Selected labels */} + {selectedLabels.length > 0 && ( +
+

Selected Labels

+
+ {selectedLabels.map((label) => { + const colorName = getLabelColor(label) + const colorClasses = LABEL_COLORS[colorName] + const isEditing = editingColor === label + + return ( +
+ {isEditing ? ( +
+
+ {(Object.keys(LABEL_COLORS) as LabelColorName[]).map((color) => { + const classes = LABEL_COLORS[color] + return ( +
+
+ ) : null} + setEditingColor(isEditing ? null : label)} + > + + {label} + + +
+ ) + })} +
+
+ )} + + {/* Available labels from storage */} + {allLabelsInStorage.length > 0 && ( +
+

All Labels

+
+ {allLabelsInStorage + .filter(label => !selectedLabels.includes(label)) + .map((label) => { + const colorName = getLabelColor(label) + const colorClasses = LABEL_COLORS[colorName] + + return ( + handleSelectExisting(label)} + > + {label} + + ) + })} +
+
+ )} +
+ + + + + +
+
+ ) +} diff --git a/keep-notes/components/note-card.tsx b/keep-notes/components/note-card.tsx index fb7a60e..a748986 100644 --- a/keep-notes/components/note-card.tsx +++ b/keep-notes/components/note-card.tsx @@ -1,6 +1,6 @@ 'use client' -import { Note, NOTE_COLORS, NoteColor } from '@/lib/types' +import { Note, NOTE_COLORS, NoteColor, LABEL_COLORS } from '@/lib/types' import { Card } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' @@ -22,26 +22,37 @@ import { Trash2, Bell, } from 'lucide-react' -import { useState } from 'react' +import { useState, useEffect } from 'react' import { deleteNote, toggleArchive, togglePin, updateColor, updateNote } from '@/app/actions/notes' import { cn } from '@/lib/utils' import { formatDistanceToNow } from 'date-fns' import { fr } from 'date-fns/locale' import { MarkdownContent } from './markdown-content' +import { getLabelColor } from '@/lib/label-storage' interface NoteCardProps { note: Note onEdit?: (note: Note) => void - onDragStart?: (note: Note) => void - onDragEnd?: () => void - onDragOver?: (note: Note) => void isDragging?: boolean + isDragOver?: boolean } -export function NoteCard({ note, onEdit, onDragStart, onDragEnd, onDragOver, isDragging }: NoteCardProps) { +export function NoteCard({ note, onEdit, isDragging, isDragOver }: NoteCardProps) { const [isDeleting, setIsDeleting] = useState(false) + const [labelColors, setLabelColors] = useState>({}) const colorClasses = NOTE_COLORS[note.color as NoteColor] || NOTE_COLORS.default + // Load label colors from localStorage + useEffect(() => { + if (note.labels) { + const colors: Record = {} + note.labels.forEach(label => { + colors[label] = getLabelColor(label) + }) + setLabelColors(colors) + } + }, [note.labels]) + const handleDelete = async () => { if (confirm('Are you sure you want to delete this note?')) { setIsDeleting(true) @@ -79,22 +90,14 @@ export function NoteCard({ note, onEdit, onDragStart, onDragEnd, onDragOver, isD return ( { - e.stopPropagation() - onDragStart?.(note) - }} - onDragEnd={onDragEnd} - onDragOver={(e) => { - e.preventDefault() - e.stopPropagation() - onDragOver?.(note) - }} className={cn( - 'group relative p-4 transition-all duration-200 border', - 'cursor-move hover:shadow-md', + 'note-card-main group relative p-4 transition-all duration-200 border cursor-move', + 'hover:shadow-md', + colorClasses.bg, colorClasses.card, - isDragging && 'opacity-30 scale-95' + colorClasses.hover, + isDragging && 'opacity-30', + isDragOver && 'ring-2 ring-blue-500' )} onClick={(e) => { // Only trigger edit if not clicking on buttons @@ -229,11 +232,23 @@ export function NoteCard({ note, onEdit, onDragStart, onDragEnd, onDragOver, isD {/* Labels */} {note.labels && note.labels.length > 0 && (
- {note.labels.map((label) => ( - - {label} - - ))} + {note.labels.map((label) => { + const colorName = labelColors[label] || 'gray' + const colorClasses = LABEL_COLORS[colorName as keyof typeof LABEL_COLORS] || LABEL_COLORS.gray + return ( + + {label} + + ) + })}
)} diff --git a/keep-notes/components/note-editor.tsx b/keep-notes/components/note-editor.tsx index c390980..ee0b3f3 100644 --- a/keep-notes/components/note-editor.tsx +++ b/keep-notes/components/note-editor.tsx @@ -1,7 +1,7 @@ 'use client' import { useState, useEffect, useRef } from 'react' -import { Note, CheckItem, NOTE_COLORS, NoteColor } from '@/lib/types' +import { Note, CheckItem, NOTE_COLORS, NoteColor, LABEL_COLORS } from '@/lib/types' import { Dialog, DialogContent, @@ -23,6 +23,8 @@ import { updateNote } from '@/app/actions/notes' import { cn } from '@/lib/utils' import { useToast } from '@/components/ui/toast' import { MarkdownContent } from './markdown-content' +import { LabelManager } from './label-manager' +import { getLabelColor } from '@/lib/label-storage' interface NoteEditorProps { note: Note @@ -306,17 +308,29 @@ export function NoteEditor({ note, onClose }: NoteEditorProps) { {/* Labels */} {labels.length > 0 && (
- {labels.map((label) => ( - - {label} - - - ))} + {label} + + + ) + })}
)} @@ -370,31 +384,10 @@ export function NoteEditor({ note, onClose }: NoteEditorProps) { {/* Label Manager */} - - - - - -
- setNewLabel(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter') { - e.preventDefault() - handleAddLabel() - } - }} - /> - -
-
-
+
diff --git a/keep-notes/components/note-grid.tsx b/keep-notes/components/note-grid.tsx index e030965..6c736b8 100644 --- a/keep-notes/components/note-grid.tsx +++ b/keep-notes/components/note-grid.tsx @@ -2,93 +2,257 @@ import { Note } from '@/lib/types' import { NoteCard } from './note-card' -import { useState } from 'react' +import { useState, useMemo, useEffect } from 'react' import { NoteEditor } from './note-editor' -import { reorderNotes } from '@/app/actions/notes' +import { reorderNotes, getNotes } from '@/app/actions/notes' +import { + DndContext, + DragEndEvent, + DragOverlay, + DragStartEvent, + MouseSensor, + TouchSensor, + useSensor, + useSensors, + closestCenter, + PointerSensor, +} from '@dnd-kit/core' +import { + SortableContext, + rectSortingStrategy, + useSortable, + arrayMove, +} from '@dnd-kit/sortable' +import { CSS } from '@dnd-kit/utilities' +import { useRouter } from 'next/navigation' interface NoteGridProps { notes: Note[] } +function SortableNote({ note, onEdit }: { note: Note; onEdit: (note: Note) => void }) { + const { + attributes, + listeners, + setNodeRef, + transform, + transition, + isDragging, + } = useSortable({ id: note.id }) + + const style = { + transform: CSS.Transform.toString(transform), + transition, + opacity: isDragging ? 0.5 : 1, + zIndex: isDragging ? 1000 : 1, + } + + return ( +
+ +
+ ) +} + export function NoteGrid({ notes }: NoteGridProps) { + const router = useRouter() const [editingNote, setEditingNote] = useState(null) - const [draggedNote, setDraggedNote] = useState(null) - const [dragOverNote, setDragOverNote] = useState(null) + const [activeId, setActiveId] = useState(null) + const [localPinnedNotes, setLocalPinnedNotes] = useState([]) + const [localUnpinnedNotes, setLocalUnpinnedNotes] = useState([]) - const pinnedNotes = notes.filter(note => note.isPinned).sort((a, b) => a.order - b.order) - const unpinnedNotes = notes.filter(note => !note.isPinned).sort((a, b) => a.order - b.order) + // Sync local state with props + useEffect(() => { + setLocalPinnedNotes(notes.filter(note => note.isPinned).sort((a, b) => a.order - b.order)) + setLocalUnpinnedNotes(notes.filter(note => !note.isPinned).sort((a, b) => a.order - b.order)) + }, [notes]) - const handleDragStart = (note: Note) => { - setDraggedNote(note) + const sensors = useSensors( + useSensor(PointerSensor, { + activationConstraint: { + distance: 8, + }, + }), + useSensor(MouseSensor, { + activationConstraint: { + distance: 8, + }, + }), + useSensor(TouchSensor, { + activationConstraint: { + delay: 200, + tolerance: 6, + }, + }) + ) + + const handleDragStart = (event: DragStartEvent) => { + console.log('[DND-DEBUG] Drag started:', { + activeId: event.active.id, + activeData: event.active.data.current + }) + setActiveId(event.active.id as string) } - const handleDragEnd = async () => { - if (draggedNote && dragOverNote && draggedNote.id !== dragOverNote.id) { - // Reorder notes - const sourceIndex = notes.findIndex(n => n.id === draggedNote.id) - const targetIndex = notes.findIndex(n => n.id === dragOverNote.id) + const handleDragEnd = async (event: DragEndEvent) => { + const { active, over } = event + console.log('[DND-DEBUG] Drag ended:', { + activeId: active.id, + overId: over?.id, + hasOver: !!over + }) + setActiveId(null) + + if (!over || active.id === over.id) { + console.log('[DND-DEBUG] Drag cancelled: no valid drop target or same element') + return + } + + const activeIdStr = active.id as string + const overIdStr = over.id as string + + // Determine which section the dragged note belongs to + const isInPinned = localPinnedNotes.some(n => n.id === activeIdStr) + const targetIsInPinned = localPinnedNotes.some(n => n.id === overIdStr) + + console.log('[DND-DEBUG] Section check:', { + activeIdStr, + overIdStr, + isInPinned, + targetIsInPinned, + pinnedNotesCount: localPinnedNotes.length, + unpinnedNotesCount: localUnpinnedNotes.length + }) + + // Only allow reordering within the same section + if (isInPinned !== targetIsInPinned) { + console.log('[DND-DEBUG] Drag cancelled: crossing sections (pinned/unpinned)') + return + } + + if (isInPinned) { + // Reorder pinned notes + const oldIndex = localPinnedNotes.findIndex(n => n.id === activeIdStr) + const newIndex = localPinnedNotes.findIndex(n => n.id === overIdStr) - await reorderNotes(draggedNote.id, dragOverNote.id) + console.log('[DND-DEBUG] Pinned reorder:', { oldIndex, newIndex }) + + if (oldIndex !== -1 && newIndex !== -1) { + const newOrder = arrayMove(localPinnedNotes, oldIndex, newIndex) + setLocalPinnedNotes(newOrder) + console.log('[DND-DEBUG] Calling reorderNotes for pinned notes') + await reorderNotes(activeIdStr, overIdStr) + + // Refresh notes from server to sync state + console.log('[DND-DEBUG] Refreshing notes from server after reorder') + await refreshNotesFromServer() + } else { + console.log('[DND-DEBUG] Invalid indices for pinned reorder') + } + } else { + // Reorder unpinned notes + const oldIndex = localUnpinnedNotes.findIndex(n => n.id === activeIdStr) + const newIndex = localUnpinnedNotes.findIndex(n => n.id === overIdStr) + + console.log('[DND-DEBUG] Unpinned reorder:', { oldIndex, newIndex }) + + if (oldIndex !== -1 && newIndex !== -1) { + const newOrder = arrayMove(localUnpinnedNotes, oldIndex, newIndex) + setLocalUnpinnedNotes(newOrder) + console.log('[DND-DEBUG] Calling reorderNotes for unpinned notes') + await reorderNotes(activeIdStr, overIdStr) + + // Refresh notes from server to sync state + console.log('[DND-DEBUG] Refreshing notes from server after reorder') + await refreshNotesFromServer() + } else { + console.log('[DND-DEBUG] Invalid indices for unpinned reorder') + } } - setDraggedNote(null) - setDragOverNote(null) } - const handleDragOver = (note: Note) => { - if (draggedNote && draggedNote.id !== note.id) { - setDragOverNote(note) - } + // Function to refresh notes from server without full page reload + const refreshNotesFromServer = async () => { + console.log('[DND-DEBUG] Fetching fresh notes from server...') + const freshNotes = await getNotes() + console.log('[DND-DEBUG] Received fresh notes:', freshNotes.length) + + // Update local state with fresh data + const pinned = freshNotes.filter(note => note.isPinned).sort((a, b) => a.order - b.order) + const unpinned = freshNotes.filter(note => !note.isPinned).sort((a, b) => a.order - b.order) + + setLocalPinnedNotes(pinned) + setLocalUnpinnedNotes(unpinned) + + console.log('[DND-DEBUG] Local state updated with fresh server data') } + // Find active note from either section + const activeNote = activeId + ? localPinnedNotes.find(n => n.id === activeId) || localUnpinnedNotes.find(n => n.id === activeId) + : null + return ( <>
- {pinnedNotes.length > 0 && ( -
-

- Pinned -

-
- {pinnedNotes.map(note => ( -
- -
- ))} -
-
- )} - - {unpinnedNotes.length > 0 && ( -
- {pinnedNotes.length > 0 && ( + + {localPinnedNotes.length > 0 && ( +

- Others + Pinned

- )} -
- {unpinnedNotes.map(note => ( -
- + n.id)} strategy={rectSortingStrategy}> +
+ {localPinnedNotes.map((note) => ( + + ))}
- ))} +
-
- )} + )} + + {localUnpinnedNotes.length > 0 && ( +
+ {localPinnedNotes.length > 0 && ( +

+ Others +

+ )} + n.id)} strategy={rectSortingStrategy}> +
+ {localUnpinnedNotes.map((note) => ( + + ))} +
+
+
+ )} + + {activeNote ? ( +
+ {}} + isDragging={true} + /> +
+ ) : null} +
+ + {notes.length === 0 && (

No notes yet

@@ -98,10 +262,7 @@ export function NoteGrid({ notes }: NoteGridProps) {
{editingNote && ( - setEditingNote(null)} - /> + setEditingNote(null)} /> )} ) diff --git a/keep-notes/lib/label-storage.ts b/keep-notes/lib/label-storage.ts new file mode 100644 index 0000000..354f5f4 --- /dev/null +++ b/keep-notes/lib/label-storage.ts @@ -0,0 +1,57 @@ +import { LabelColorName } from './types' + +const STORAGE_KEY = 'memento-label-colors' + +// Store label colors in localStorage +export function getLabelColor(label: string): LabelColorName { + if (typeof window === 'undefined') return 'gray' + + try { + const stored = localStorage.getItem(STORAGE_KEY) + if (!stored) return 'gray' + + const colors = JSON.parse(stored) as Record + return colors[label] || 'gray' + } catch { + return 'gray' + } +} + +export function setLabelColor(label: string, color: LabelColorName) { + if (typeof window === 'undefined') return + + try { + const stored = localStorage.getItem(STORAGE_KEY) + const colors = stored ? JSON.parse(stored) as Record : {} + colors[label] = color + localStorage.setItem(STORAGE_KEY, JSON.stringify(colors)) + } catch (error) { + console.error('Failed to save label color:', error) + } +} + +export function getAllLabelColors(): Record { + if (typeof window === 'undefined') return {} + + try { + const stored = localStorage.getItem(STORAGE_KEY) + return stored ? JSON.parse(stored) : {} + } catch { + return {} + } +} + +export function deleteLabelColor(label: string) { + if (typeof window === 'undefined') return + + try { + const stored = localStorage.getItem(STORAGE_KEY) + if (!stored) return + + const colors = JSON.parse(stored) as Record + delete colors[label] + localStorage.setItem(STORAGE_KEY, JSON.stringify(colors)) + } catch (error) { + console.error('Failed to delete label color:', error) + } +} diff --git a/keep-notes/lib/types.ts b/keep-notes/lib/types.ts index c90167d..d4f25eb 100644 --- a/keep-notes/lib/types.ts +++ b/keep-notes/lib/types.ts @@ -24,6 +24,25 @@ export interface Note { updatedAt: Date; } +export interface LabelWithColor { + name: string; + color: LabelColorName; +} + +export const LABEL_COLORS = { + gray: { bg: 'bg-gray-100 dark:bg-gray-800', text: 'text-gray-700 dark:text-gray-300', border: 'border-gray-300 dark:border-gray-600' }, + red: { bg: 'bg-red-100 dark:bg-red-900/30', text: 'text-red-700 dark:text-red-300', border: 'border-red-300 dark:border-red-600' }, + orange: { bg: 'bg-orange-100 dark:bg-orange-900/30', text: 'text-orange-700 dark:text-orange-300', border: 'border-orange-300 dark:border-orange-600' }, + yellow: { bg: 'bg-yellow-100 dark:bg-yellow-900/30', text: 'text-yellow-700 dark:text-yellow-300', border: 'border-yellow-300 dark:border-yellow-600' }, + green: { bg: 'bg-green-100 dark:bg-green-900/30', text: 'text-green-700 dark:text-green-300', border: 'border-green-300 dark:border-green-600' }, + teal: { bg: 'bg-teal-100 dark:bg-teal-900/30', text: 'text-teal-700 dark:text-teal-300', border: 'border-teal-300 dark:border-teal-600' }, + blue: { bg: 'bg-blue-100 dark:bg-blue-900/30', text: 'text-blue-700 dark:text-blue-300', border: 'border-blue-300 dark:border-blue-600' }, + purple: { bg: 'bg-purple-100 dark:bg-purple-900/30', text: 'text-purple-700 dark:text-purple-300', border: 'border-purple-300 dark:border-purple-600' }, + pink: { bg: 'bg-pink-100 dark:bg-pink-900/30', text: 'text-pink-700 dark:text-pink-300', border: 'border-pink-300 dark:border-pink-600' }, +} + +export type LabelColorName = keyof typeof LABEL_COLORS + export const NOTE_COLORS = { default: { bg: 'bg-white dark:bg-zinc-900', diff --git a/keep-notes/package-lock.json b/keep-notes/package-lock.json index 0a44150..764839c 100644 --- a/keep-notes/package-lock.json +++ b/keep-notes/package-lock.json @@ -9,6 +9,9 @@ "version": "0.1.0", "dependencies": { "@auth/prisma-adapter": "^2.11.1", + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", "@libsql/client": "^0.15.15", "@prisma/adapter-better-sqlite3": "^7.2.0", "@prisma/adapter-libsql": "^7.2.0", @@ -31,7 +34,9 @@ "prisma": "5.22.0", "react": "19.2.3", "react-dom": "19.2.3", + "react-grid-layout": "^2.2.2", "react-markdown": "^10.1.0", + "react-masonry-css": "^1.0.16", "remark-gfm": "^4.0.1", "tailwind-merge": "^3.4.0" }, @@ -101,6 +106,60 @@ "@prisma/client": ">=2.26.0 || >=3 || >=4 || >=5 || >=6" } }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@emnapi/runtime": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.0.tgz", @@ -2956,6 +3015,12 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, + "node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "license": "MIT" + }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -3208,6 +3273,12 @@ "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", "license": "BSD-3-Clause" }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, "node_modules/libsql": { "version": "0.5.22", "resolved": "https://registry.npmjs.org/libsql/-/libsql-0.5.22.tgz", @@ -3520,6 +3591,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lucide-react": { "version": "0.562.0", "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz", @@ -4635,6 +4718,15 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4823,6 +4915,17 @@ "integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==", "license": "ISC" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/property-information": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", @@ -4881,6 +4984,44 @@ "react": "^19.2.3" } }, + "node_modules/react-draggable": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.5.0.tgz", + "integrity": "sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-grid-layout": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-2.2.2.tgz", + "integrity": "sha512-yNo9pxQWoxHWRAwHGSVT4DEGELYPyQ7+q9lFclb5jcqeFzva63/2F72CryS/jiTIr/SBIlTaDdyjqH+ODg8oBw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "fast-equals": "^4.0.3", + "prop-types": "^15.8.1", + "react-draggable": "^4.4.6", + "react-resizable": "^3.0.5", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/react-markdown": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", @@ -4908,6 +5049,15 @@ "react": ">=18" } }, + "node_modules/react-masonry-css": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/react-masonry-css/-/react-masonry-css-1.0.16.tgz", + "integrity": "sha512-KSW0hR2VQmltt/qAa3eXOctQDyOu7+ZBevtKgpNDSzT7k5LA/0XntNa9z9HKCdz3QlxmJHglTZ18e4sX4V8zZQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.0.0" + } + }, "node_modules/react-remove-scroll": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", @@ -4955,6 +5105,20 @@ } } }, + "node_modules/react-resizable": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.1.3.tgz", + "integrity": "sha512-liJBNayhX7qA4tBJiBD321FDhJxgGTJ07uzH5zSORXoE8h7PyEZ8mLqmosST7ppf6C4zUsbd2gzDMmBCfFp9Lw==", + "license": "MIT", + "dependencies": { + "prop-types": "15.x", + "react-draggable": "^4.5.0" + }, + "peerDependencies": { + "react": ">= 16.3", + "react-dom": ">= 16.3" + } + }, "node_modules/react-style-singleton": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", @@ -5057,6 +5221,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", diff --git a/keep-notes/package.json b/keep-notes/package.json index a4478ab..89788b2 100644 --- a/keep-notes/package.json +++ b/keep-notes/package.json @@ -12,6 +12,9 @@ }, "dependencies": { "@auth/prisma-adapter": "^2.11.1", + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", "@libsql/client": "^0.15.15", "@prisma/adapter-better-sqlite3": "^7.2.0", "@prisma/adapter-libsql": "^7.2.0", @@ -34,7 +37,9 @@ "prisma": "5.22.0", "react": "19.2.3", "react-dom": "19.2.3", + "react-grid-layout": "^2.2.2", "react-markdown": "^10.1.0", + "react-masonry-css": "^1.0.16", "remark-gfm": "^4.0.1", "tailwind-merge": "^3.4.0" }, diff --git a/keep-notes/playwright-report/data/d6856db0cd4bc374705968cf98e6424354e2fd5c.md b/keep-notes/playwright-report/data/d6856db0cd4bc374705968cf98e6424354e2fd5c.md new file mode 100644 index 0000000..edd0ac2 --- /dev/null +++ b/keep-notes/playwright-report/data/d6856db0cd4bc374705968cf98e6424354e2fd5c.md @@ -0,0 +1,478 @@ +# Page snapshot + +```yaml +- generic [active] [ref=e1]: + - banner [ref=e2]: + - generic [ref=e3]: + - link "Memento" [ref=e4] [cursor=pointer]: + - /url: / + - img [ref=e5] + - generic [ref=e8]: Memento + - generic [ref=e10]: + - img [ref=e11] + - textbox "Search notes..." [ref=e14] + - button [ref=e15]: + - img + - navigation [ref=e16]: + - link "Notes" [ref=e17] [cursor=pointer]: + - /url: / + - img [ref=e18] + - text: Notes + - link "Archive" [ref=e21] [cursor=pointer]: + - /url: /archive + - img [ref=e22] + - text: Archive + - main [ref=e25]: + - generic [ref=e27]: + - textbox "Take a note..." [ref=e28] + - button "New checklist" [ref=e29]: + - img + - generic [ref=e30]: + - generic [ref=e31]: + - heading "Pinned" [level=2] [ref=e32] + - button "Updated Note avec image il y a environ 8 heures" [ref=e34]: + - generic [ref=e35]: + - img [ref=e36] + - heading "Updated" [level=3] [ref=e38] + - paragraph [ref=e39]: Note avec image + - generic [ref=e40]: il y a environ 8 heures + - generic [ref=e41]: + - button "Unpin" [ref=e42]: + - img + - button "Change color" [ref=e43]: + - img + - button [ref=e44]: + - img + - generic [ref=e45]: + - heading "Others" [level=2] [ref=e46] + - generic [ref=e47]: + - button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a moins d’une minute" [ref=e48]: + - generic [ref=e49]: + - heading "test-1767557334587-Note 4" [level=3] [ref=e50] + - paragraph [ref=e51]: test-1767557334587-Content 4 + - generic [ref=e52]: il y a moins d’une minute + - generic [ref=e53]: + - button "Pin" [ref=e54]: + - img + - button "Change color" [ref=e55]: + - img + - button [ref=e56]: + - img + - button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a moins d’une minute" [ref=e57]: + - generic [ref=e58]: + - heading "test-1767557334587-Note 3" [level=3] [ref=e59] + - paragraph [ref=e60]: test-1767557334587-Content 3 + - generic [ref=e61]: il y a moins d’une minute + - generic [ref=e62]: + - button "Pin" [ref=e63]: + - img + - button "Change color" [ref=e64]: + - img + - button [ref=e65]: + - img + - button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a moins d’une minute" [ref=e66]: + - generic [ref=e67]: + - heading "test-1767557334587-Note 2" [level=3] [ref=e68] + - paragraph [ref=e69]: test-1767557334587-Content 2 + - generic [ref=e70]: il y a moins d’une minute + - generic [ref=e71]: + - button "Pin" [ref=e72]: + - img + - button "Change color" [ref=e73]: + - img + - button [ref=e74]: + - img + - button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a moins d’une minute" [ref=e75]: + - generic [ref=e76]: + - heading "test-1767557334587-Note 1" [level=3] [ref=e77] + - paragraph [ref=e78]: test-1767557334587-Content 1 + - generic [ref=e79]: il y a moins d’une minute + - generic [ref=e80]: + - button "Pin" [ref=e81]: + - img + - button "Change color" [ref=e82]: + - img + - button [ref=e83]: + - img + - button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a moins d’une minute" [ref=e84]: + - generic [ref=e85]: + - heading "test-1767557330820-Note 4" [level=3] [ref=e86] + - paragraph [ref=e87]: test-1767557330820-Content 4 + - generic [ref=e88]: il y a moins d’une minute + - generic [ref=e89]: + - button "Pin" [ref=e90]: + - img + - button "Change color" [ref=e91]: + - img + - button [ref=e92]: + - img + - button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a moins d’une minute" [ref=e93]: + - generic [ref=e94]: + - heading "test-1767557330820-Note 3" [level=3] [ref=e95] + - paragraph [ref=e96]: test-1767557330820-Content 3 + - generic [ref=e97]: il y a moins d’une minute + - generic [ref=e98]: + - button "Pin" [ref=e99]: + - img + - button "Change color" [ref=e100]: + - img + - button [ref=e101]: + - img + - button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a moins d’une minute" [ref=e102]: + - generic [ref=e103]: + - heading "test-1767557330820-Note 2" [level=3] [ref=e104] + - paragraph [ref=e105]: test-1767557330820-Content 2 + - generic [ref=e106]: il y a moins d’une minute + - generic [ref=e107]: + - button "Pin" [ref=e108]: + - img + - button "Change color" [ref=e109]: + - img + - button [ref=e110]: + - img + - button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a moins d’une minute" [ref=e111]: + - generic [ref=e112]: + - heading "test-1767557330820-Note 1" [level=3] [ref=e113] + - paragraph [ref=e114]: test-1767557330820-Content 1 + - generic [ref=e115]: il y a moins d’une minute + - generic [ref=e116]: + - button "Pin" [ref=e117]: + - img + - button "Change color" [ref=e118]: + - img + - button [ref=e119]: + - img + - button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a moins d’une minute" [ref=e120]: + - generic [ref=e121]: + - heading "test-1767557327567-Note 4" [level=3] [ref=e122] + - paragraph [ref=e123]: test-1767557327567-Content 4 + - generic [ref=e124]: il y a moins d’une minute + - generic [ref=e125]: + - button "Pin" [ref=e126]: + - img + - button "Change color" [ref=e127]: + - img + - button [ref=e128]: + - img + - button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a moins d’une minute" [ref=e129]: + - generic [ref=e130]: + - heading "test-1767557327567-Note 3" [level=3] [ref=e131] + - paragraph [ref=e132]: test-1767557327567-Content 3 + - generic [ref=e133]: il y a moins d’une minute + - generic [ref=e134]: + - button "Pin" [ref=e135]: + - img + - button "Change color" [ref=e136]: + - img + - button [ref=e137]: + - img + - button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a moins d’une minute" [ref=e138]: + - generic [ref=e139]: + - heading "test-1767557327567-Note 2" [level=3] [ref=e140] + - paragraph [ref=e141]: test-1767557327567-Content 2 + - generic [ref=e142]: il y a moins d’une minute + - generic [ref=e143]: + - button "Pin" [ref=e144]: + - img + - button "Change color" [ref=e145]: + - img + - button [ref=e146]: + - img + - button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a moins d’une minute" [ref=e147]: + - generic [ref=e148]: + - heading "test-1767557327567-Note 1" [level=3] [ref=e149] + - paragraph [ref=e150]: test-1767557327567-Content 1 + - generic [ref=e151]: il y a moins d’une minute + - generic [ref=e152]: + - button "Pin" [ref=e153]: + - img + - button "Change color" [ref=e154]: + - img + - button [ref=e155]: + - img + - button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a moins d’une minute" [ref=e156]: + - generic [ref=e157]: + - heading "test-1767557324248-Note 4" [level=3] [ref=e158] + - paragraph [ref=e159]: test-1767557324248-Content 4 + - generic [ref=e160]: il y a moins d’une minute + - generic [ref=e161]: + - button "Pin" [ref=e162]: + - img + - button "Change color" [ref=e163]: + - img + - button [ref=e164]: + - img + - button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a moins d’une minute" [ref=e165]: + - generic [ref=e166]: + - heading "test-1767557324248-Note 3" [level=3] [ref=e167] + - paragraph [ref=e168]: test-1767557324248-Content 3 + - generic [ref=e169]: il y a moins d’une minute + - generic [ref=e170]: + - button "Pin" [ref=e171]: + - img + - button "Change color" [ref=e172]: + - img + - button [ref=e173]: + - img + - button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a moins d’une minute" [ref=e174]: + - generic [ref=e175]: + - heading "test-1767557324248-Note 2" [level=3] [ref=e176] + - paragraph [ref=e177]: test-1767557324248-Content 2 + - generic [ref=e178]: il y a moins d’une minute + - generic [ref=e179]: + - button "Pin" [ref=e180]: + - img + - button "Change color" [ref=e181]: + - img + - button [ref=e182]: + - img + - button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a moins d’une minute" [ref=e183]: + - generic [ref=e184]: + - heading "test-1767557324248-Note 1" [level=3] [ref=e185] + - paragraph [ref=e186]: test-1767557324248-Content 1 + - generic [ref=e187]: il y a moins d’une minute + - generic [ref=e188]: + - button "Pin" [ref=e189]: + - img + - button "Change color" [ref=e190]: + - img + - button [ref=e191]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e192]: + - generic [ref=e193]: + - heading "Test Note for Reminder" [level=3] [ref=e194] + - paragraph [ref=e195]: This note will have a reminder + - generic [ref=e196]: il y a 26 minutes + - generic [ref=e197]: + - button "Pin" [ref=e198]: + - img + - button "Change color" [ref=e199]: + - img + - button [ref=e200]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e201]: + - generic [ref=e202]: + - heading "Test Note for Reminder" [level=3] [ref=e203] + - paragraph [ref=e204]: This note will have a reminder + - generic [ref=e205]: il y a 26 minutes + - generic [ref=e206]: + - button "Pin" [ref=e207]: + - img + - button "Change color" [ref=e208]: + - img + - button [ref=e209]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e210]: + - generic [ref=e211]: + - heading "Test Note for Reminder" [level=3] [ref=e212] + - paragraph [ref=e213]: This note will have a reminder + - generic [ref=e214]: il y a 26 minutes + - generic [ref=e215]: + - button "Pin" [ref=e216]: + - img + - button "Change color" [ref=e217]: + - img + - button [ref=e218]: + - img + - button "Test note il y a 26 minutes" [ref=e219]: + - generic [ref=e220]: + - paragraph [ref=e221]: Test note + - generic [ref=e222]: il y a 26 minutes + - generic [ref=e223]: + - button "Pin" [ref=e224]: + - img + - button "Change color" [ref=e225]: + - img + - button [ref=e226]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e227]: + - generic [ref=e228]: + - heading "Test Note for Reminder" [level=3] [ref=e229] + - paragraph [ref=e230]: This note will have a reminder + - generic [ref=e231]: il y a 26 minutes + - generic [ref=e232]: + - button "Pin" [ref=e233]: + - img + - button "Change color" [ref=e234]: + - img + - button [ref=e235]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e236]: + - generic [ref=e237]: + - heading "Test Note for Reminder" [level=3] [ref=e238] + - paragraph [ref=e239]: This note will have a reminder + - generic [ref=e240]: il y a 26 minutes + - generic [ref=e241]: + - button "Pin" [ref=e242]: + - img + - button "Change color" [ref=e243]: + - img + - button [ref=e244]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e245]: + - generic [ref=e246]: + - heading "Test Note for Reminder" [level=3] [ref=e247] + - paragraph [ref=e248]: This note will have a reminder + - generic [ref=e249]: il y a 26 minutes + - generic [ref=e250]: + - button "Pin" [ref=e251]: + - img + - button "Change color" [ref=e252]: + - img + - button [ref=e253]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e254]: + - generic [ref=e255]: + - img [ref=e256] + - heading "Test Note for Reminder" [level=3] [ref=e259] + - paragraph [ref=e260]: This note will have a reminder + - generic [ref=e261]: il y a 26 minutes + - generic [ref=e262]: + - button "Pin" [ref=e263]: + - img + - button "Change color" [ref=e264]: + - img + - button [ref=e265]: + - img + - button "test sample file il y a environ 5 heures" [ref=e266]: + - generic [ref=e267]: + - heading "test" [level=3] [ref=e268] + - paragraph [ref=e270]: sample file + - generic [ref=e271]: il y a environ 5 heures + - generic [ref=e272]: + - button "Pin" [ref=e273]: + - img + - button "Change color" [ref=e274]: + - img + - button [ref=e275]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e276]': + - generic [ref=e277]: + - heading "New AI Framework Released" [level=3] [ref=e278] + - paragraph [ref=e279]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech" + - generic [ref=e280]: + - generic [ref=e281]: tech + - generic [ref=e282]: ai + - generic [ref=e283]: framework + - generic [ref=e284]: mlops + - generic [ref=e285]: gpu + - generic [ref=e286]: il y a environ 5 heures + - generic [ref=e287]: + - button "Pin" [ref=e288]: + - img + - button "Change color" [ref=e289]: + - img + - button [ref=e290]: + - img + - button "Test Image API Note avec image il y a environ 8 heures" [ref=e291]: + - generic [ref=e292]: + - heading "Test Image API" [level=3] [ref=e293] + - paragraph [ref=e295]: Note avec image + - generic [ref=e296]: il y a environ 8 heures + - generic [ref=e297]: + - button "Pin" [ref=e298]: + - img + - button "Change color" [ref=e299]: + - img + - button [ref=e300]: + - img + - button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e301]: + - generic [ref=e302]: + - heading "Test Markdown" [level=3] [ref=e303] + - generic [ref=e305]: + - heading "Titre Modifié" [level=1] [ref=e306] + - heading "Sous-titre édité" [level=2] [ref=e307] + - list [ref=e308]: + - listitem [ref=e309]: Liste modifiée 1 + - listitem [ref=e310]: Liste modifiée 2 + - listitem [ref=e311]: Nouvelle liste 3 + - paragraph [ref=e312]: + - strong [ref=e313]: Texte gras modifié + - text: et + - emphasis [ref=e314]: italique édité + - code [ref=e316]: console.log("Code modifié avec succès!") + - generic [ref=e317]: il y a environ 5 heures + - generic [ref=e318]: + - button "Pin" [ref=e319]: + - img + - button "Change color" [ref=e320]: + - img + - button [ref=e321]: + - img + - button "Test Image Avec image il y a environ 8 heures" [ref=e322]: + - generic [ref=e323]: + - heading "Test Image" [level=3] [ref=e324] + - paragraph [ref=e325]: Avec image + - generic [ref=e326]: il y a environ 8 heures + - generic [ref=e327]: + - button "Pin" [ref=e328]: + - img + - button "Change color" [ref=e329]: + - img + - button [ref=e330]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e331]': + - generic [ref=e332]: + - heading "New AI Framework Released" [level=3] [ref=e333] + - paragraph [ref=e334]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu" + - generic [ref=e335]: + - generic [ref=e336]: tech + - generic [ref=e337]: ai + - generic [ref=e338]: framework + - generic [ref=e339]: mlops + - generic [ref=e340]: gpu + - generic [ref=e341]: il y a environ 6 heures + - generic [ref=e342]: + - button "Pin" [ref=e343]: + - img + - button "Change color" [ref=e344]: + - img + - button [ref=e345]: + - img + - button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e346]: + - generic [ref=e347]: + - img [ref=e348] + - heading "Test Note" [level=3] [ref=e351] + - paragraph [ref=e352]: This is my first note to test the Google Keep clone! + - generic [ref=e353]: il y a environ 10 heures + - generic [ref=e354]: + - button "Pin" [ref=e355]: + - img + - button "Change color" [ref=e356]: + - img + - button [ref=e357]: + - img + - button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e358]: + - generic [ref=e359]: + - heading "Titre Modifié" [level=3] [ref=e360] + - paragraph [ref=e361]: Contenu modifié avec succès! + - generic [ref=e362]: il y a environ 5 heures + - generic [ref=e363]: + - button "Pin" [ref=e364]: + - img + - button "Change color" [ref=e365]: + - img + - button [ref=e366]: + - img + - status [ref=e367] + - generic [ref=e368]: + - generic [ref=e369]: + - generic [ref=e370]: Note created successfully + - button [ref=e371]: + - img [ref=e372] + - generic [ref=e375]: + - generic [ref=e376]: Note created successfully + - button [ref=e377]: + - img [ref=e378] + - generic [ref=e381]: + - generic [ref=e382]: Note created successfully + - button [ref=e383]: + - img [ref=e384] + - generic [ref=e387]: + - generic [ref=e388]: Note created successfully + - button [ref=e389]: + - img [ref=e390] + - button "Open Next.js Dev Tools" [ref=e398] [cursor=pointer]: + - img [ref=e399] + - alert [ref=e402] +``` \ No newline at end of file diff --git a/keep-notes/playwright-report/data/e94ccd8b225ed360b1226dd50ba1c3b3455c5fab.md b/keep-notes/playwright-report/data/e94ccd8b225ed360b1226dd50ba1c3b3455c5fab.md new file mode 100644 index 0000000..edffeaf --- /dev/null +++ b/keep-notes/playwright-report/data/e94ccd8b225ed360b1226dd50ba1c3b3455c5fab.md @@ -0,0 +1,509 @@ +# Page snapshot + +```yaml +- generic [active] [ref=e1]: + - banner [ref=e2]: + - generic [ref=e3]: + - link "Memento" [ref=e4] [cursor=pointer]: + - /url: / + - img [ref=e5] + - generic [ref=e8]: Memento + - generic [ref=e10]: + - img [ref=e11] + - textbox "Search notes..." [ref=e14] + - button [ref=e15]: + - img + - navigation [ref=e16]: + - link "Notes" [ref=e17] [cursor=pointer]: + - /url: / + - img [ref=e18] + - text: Notes + - link "Archive" [ref=e21] [cursor=pointer]: + - /url: /archive + - img [ref=e22] + - text: Archive + - main [ref=e25]: + - generic [ref=e27]: + - textbox "Take a note..." [ref=e28] + - button "New checklist" [ref=e29]: + - img + - generic [ref=e30]: + - generic [ref=e31]: + - heading "Pinned" [level=2] [ref=e32] + - button "Updated Note avec image il y a environ 8 heures" [ref=e34]: + - generic [ref=e35]: + - img [ref=e36] + - heading "Updated" [level=3] [ref=e38] + - paragraph [ref=e39]: Note avec image + - generic [ref=e40]: il y a environ 8 heures + - generic [ref=e41]: + - button "Unpin" [ref=e42]: + - img + - button "Change color" [ref=e43]: + - img + - button [ref=e44]: + - img + - generic [ref=e45]: + - heading "Others" [level=2] [ref=e46] + - generic [ref=e47]: + - button "test-1767557339218-Note 4 test-1767557339218-Content 4 il y a moins d’une minute" [ref=e48]: + - generic [ref=e49]: + - heading "test-1767557339218-Note 4" [level=3] [ref=e50] + - paragraph [ref=e51]: test-1767557339218-Content 4 + - generic [ref=e52]: il y a moins d’une minute + - generic [ref=e53]: + - button "Pin" [ref=e54]: + - img + - button "Change color" [ref=e55]: + - img + - button [ref=e56]: + - img + - button "test-1767557339218-Note 3 test-1767557339218-Content 3 il y a moins d’une minute" [ref=e57]: + - generic [ref=e58]: + - heading "test-1767557339218-Note 3" [level=3] [ref=e59] + - paragraph [ref=e60]: test-1767557339218-Content 3 + - generic [ref=e61]: il y a moins d’une minute + - generic [ref=e62]: + - button "Pin" [ref=e63]: + - img + - button "Change color" [ref=e64]: + - img + - button [ref=e65]: + - img + - button "test-1767557339218-Note 2 test-1767557339218-Content 2 il y a moins d’une minute" [ref=e66]: + - generic [ref=e67]: + - heading "test-1767557339218-Note 2" [level=3] [ref=e68] + - paragraph [ref=e69]: test-1767557339218-Content 2 + - generic [ref=e70]: il y a moins d’une minute + - generic [ref=e71]: + - button "Pin" [ref=e72]: + - img + - button "Change color" [ref=e73]: + - img + - button [ref=e74]: + - img + - button "test-1767557339218-Note 1 test-1767557339218-Content 1 il y a moins d’une minute" [ref=e75]: + - generic [ref=e76]: + - heading "test-1767557339218-Note 1" [level=3] [ref=e77] + - paragraph [ref=e78]: test-1767557339218-Content 1 + - generic [ref=e79]: il y a moins d’une minute + - generic [ref=e80]: + - button "Pin" [ref=e81]: + - img + - button "Change color" [ref=e82]: + - img + - button [ref=e83]: + - img + - button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a moins d’une minute" [ref=e84]: + - generic [ref=e85]: + - heading "test-1767557334587-Note 4" [level=3] [ref=e86] + - paragraph [ref=e87]: test-1767557334587-Content 4 + - generic [ref=e88]: il y a moins d’une minute + - generic [ref=e89]: + - button "Pin" [ref=e90]: + - img + - button "Change color" [ref=e91]: + - img + - button [ref=e92]: + - img + - button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a moins d’une minute" [ref=e93]: + - generic [ref=e94]: + - heading "test-1767557334587-Note 3" [level=3] [ref=e95] + - paragraph [ref=e96]: test-1767557334587-Content 3 + - generic [ref=e97]: il y a moins d’une minute + - generic [ref=e98]: + - button "Pin" [ref=e99]: + - img + - button "Change color" [ref=e100]: + - img + - button [ref=e101]: + - img + - button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a moins d’une minute" [ref=e102]: + - generic [ref=e103]: + - heading "test-1767557334587-Note 2" [level=3] [ref=e104] + - paragraph [ref=e105]: test-1767557334587-Content 2 + - generic [ref=e106]: il y a moins d’une minute + - generic [ref=e107]: + - button "Pin" [ref=e108]: + - img + - button "Change color" [ref=e109]: + - img + - button [ref=e110]: + - img + - button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a moins d’une minute" [ref=e111]: + - generic [ref=e112]: + - heading "test-1767557334587-Note 1" [level=3] [ref=e113] + - paragraph [ref=e114]: test-1767557334587-Content 1 + - generic [ref=e115]: il y a moins d’une minute + - generic [ref=e116]: + - button "Pin" [ref=e117]: + - img + - button "Change color" [ref=e118]: + - img + - button [ref=e119]: + - img + - button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a moins d’une minute" [ref=e120]: + - generic [ref=e121]: + - heading "test-1767557330820-Note 4" [level=3] [ref=e122] + - paragraph [ref=e123]: test-1767557330820-Content 4 + - generic [ref=e124]: il y a moins d’une minute + - generic [ref=e125]: + - button "Pin" [ref=e126]: + - img + - button "Change color" [ref=e127]: + - img + - button [ref=e128]: + - img + - button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a moins d’une minute" [ref=e129]: + - generic [ref=e130]: + - heading "test-1767557330820-Note 3" [level=3] [ref=e131] + - paragraph [ref=e132]: test-1767557330820-Content 3 + - generic [ref=e133]: il y a moins d’une minute + - generic [ref=e134]: + - button "Pin" [ref=e135]: + - img + - button "Change color" [ref=e136]: + - img + - button [ref=e137]: + - img + - button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a moins d’une minute" [ref=e138]: + - generic [ref=e139]: + - heading "test-1767557330820-Note 2" [level=3] [ref=e140] + - paragraph [ref=e141]: test-1767557330820-Content 2 + - generic [ref=e142]: il y a moins d’une minute + - generic [ref=e143]: + - button "Pin" [ref=e144]: + - img + - button "Change color" [ref=e145]: + - img + - button [ref=e146]: + - img + - button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a moins d’une minute" [ref=e147]: + - generic [ref=e148]: + - heading "test-1767557330820-Note 1" [level=3] [ref=e149] + - paragraph [ref=e150]: test-1767557330820-Content 1 + - generic [ref=e151]: il y a moins d’une minute + - generic [ref=e152]: + - button "Pin" [ref=e153]: + - img + - button "Change color" [ref=e154]: + - img + - button [ref=e155]: + - img + - button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a moins d’une minute" [ref=e156]: + - generic [ref=e157]: + - heading "test-1767557327567-Note 4" [level=3] [ref=e158] + - paragraph [ref=e159]: test-1767557327567-Content 4 + - generic [ref=e160]: il y a moins d’une minute + - generic [ref=e161]: + - button "Pin" [ref=e162]: + - img + - button "Change color" [ref=e163]: + - img + - button [ref=e164]: + - img + - button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a moins d’une minute" [ref=e165]: + - generic [ref=e166]: + - heading "test-1767557327567-Note 3" [level=3] [ref=e167] + - paragraph [ref=e168]: test-1767557327567-Content 3 + - generic [ref=e169]: il y a moins d’une minute + - generic [ref=e170]: + - button "Pin" [ref=e171]: + - img + - button "Change color" [ref=e172]: + - img + - button [ref=e173]: + - img + - button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a moins d’une minute" [ref=e174]: + - generic [ref=e175]: + - heading "test-1767557327567-Note 2" [level=3] [ref=e176] + - paragraph [ref=e177]: test-1767557327567-Content 2 + - generic [ref=e178]: il y a moins d’une minute + - generic [ref=e179]: + - button "Pin" [ref=e180]: + - img + - button "Change color" [ref=e181]: + - img + - button [ref=e182]: + - img + - button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a moins d’une minute" [ref=e183]: + - generic [ref=e184]: + - heading "test-1767557327567-Note 1" [level=3] [ref=e185] + - paragraph [ref=e186]: test-1767557327567-Content 1 + - generic [ref=e187]: il y a moins d’une minute + - generic [ref=e188]: + - button "Pin" [ref=e189]: + - img + - button "Change color" [ref=e190]: + - img + - button [ref=e191]: + - img + - button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a moins d’une minute" [ref=e192]: + - generic [ref=e193]: + - heading "test-1767557324248-Note 4" [level=3] [ref=e194] + - paragraph [ref=e195]: test-1767557324248-Content 4 + - generic [ref=e196]: il y a moins d’une minute + - generic [ref=e197]: + - button "Pin" [ref=e198]: + - img + - button "Change color" [ref=e199]: + - img + - button [ref=e200]: + - img + - button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a moins d’une minute" [ref=e201]: + - generic [ref=e202]: + - heading "test-1767557324248-Note 3" [level=3] [ref=e203] + - paragraph [ref=e204]: test-1767557324248-Content 3 + - generic [ref=e205]: il y a moins d’une minute + - generic [ref=e206]: + - button "Pin" [ref=e207]: + - img + - button "Change color" [ref=e208]: + - img + - button [ref=e209]: + - img + - button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a moins d’une minute" [ref=e210]: + - generic [ref=e211]: + - heading "test-1767557324248-Note 2" [level=3] [ref=e212] + - paragraph [ref=e213]: test-1767557324248-Content 2 + - generic [ref=e214]: il y a moins d’une minute + - generic [ref=e215]: + - button "Pin" [ref=e216]: + - img + - button "Change color" [ref=e217]: + - img + - button [ref=e218]: + - img + - button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a moins d’une minute" [ref=e219]: + - generic [ref=e220]: + - heading "test-1767557324248-Note 1" [level=3] [ref=e221] + - paragraph [ref=e222]: test-1767557324248-Content 1 + - generic [ref=e223]: il y a moins d’une minute + - generic [ref=e224]: + - button "Pin" [ref=e225]: + - img + - button "Change color" [ref=e226]: + - img + - button [ref=e227]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e228]: + - generic [ref=e229]: + - heading "Test Note for Reminder" [level=3] [ref=e230] + - paragraph [ref=e231]: This note will have a reminder + - generic [ref=e232]: il y a 26 minutes + - generic [ref=e233]: + - button "Pin" [ref=e234]: + - img + - button "Change color" [ref=e235]: + - img + - button [ref=e236]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e237]: + - generic [ref=e238]: + - heading "Test Note for Reminder" [level=3] [ref=e239] + - paragraph [ref=e240]: This note will have a reminder + - generic [ref=e241]: il y a 26 minutes + - generic [ref=e242]: + - button "Pin" [ref=e243]: + - img + - button "Change color" [ref=e244]: + - img + - button [ref=e245]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e246]: + - generic [ref=e247]: + - heading "Test Note for Reminder" [level=3] [ref=e248] + - paragraph [ref=e249]: This note will have a reminder + - generic [ref=e250]: il y a 26 minutes + - generic [ref=e251]: + - button "Pin" [ref=e252]: + - img + - button "Change color" [ref=e253]: + - img + - button [ref=e254]: + - img + - button "Test note il y a 26 minutes" [ref=e255]: + - generic [ref=e256]: + - paragraph [ref=e257]: Test note + - generic [ref=e258]: il y a 26 minutes + - generic [ref=e259]: + - button "Pin" [ref=e260]: + - img + - button "Change color" [ref=e261]: + - img + - button [ref=e262]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e263]: + - generic [ref=e264]: + - heading "Test Note for Reminder" [level=3] [ref=e265] + - paragraph [ref=e266]: This note will have a reminder + - generic [ref=e267]: il y a 26 minutes + - generic [ref=e268]: + - button "Pin" [ref=e269]: + - img + - button "Change color" [ref=e270]: + - img + - button [ref=e271]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e272]: + - generic [ref=e273]: + - heading "Test Note for Reminder" [level=3] [ref=e274] + - paragraph [ref=e275]: This note will have a reminder + - generic [ref=e276]: il y a 26 minutes + - generic [ref=e277]: + - button "Pin" [ref=e278]: + - img + - button "Change color" [ref=e279]: + - img + - button [ref=e280]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e281]: + - generic [ref=e282]: + - heading "Test Note for Reminder" [level=3] [ref=e283] + - paragraph [ref=e284]: This note will have a reminder + - generic [ref=e285]: il y a 26 minutes + - generic [ref=e286]: + - button "Pin" [ref=e287]: + - img + - button "Change color" [ref=e288]: + - img + - button [ref=e289]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e290]: + - generic [ref=e291]: + - img [ref=e292] + - heading "Test Note for Reminder" [level=3] [ref=e295] + - paragraph [ref=e296]: This note will have a reminder + - generic [ref=e297]: il y a 26 minutes + - generic [ref=e298]: + - button "Pin" [ref=e299]: + - img + - button "Change color" [ref=e300]: + - img + - button [ref=e301]: + - img + - button "test sample file il y a environ 5 heures" [ref=e302]: + - generic [ref=e303]: + - heading "test" [level=3] [ref=e304] + - paragraph [ref=e306]: sample file + - generic [ref=e307]: il y a environ 5 heures + - generic [ref=e308]: + - button "Pin" [ref=e309]: + - img + - button "Change color" [ref=e310]: + - img + - button [ref=e311]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e312]': + - generic [ref=e313]: + - heading "New AI Framework Released" [level=3] [ref=e314] + - paragraph [ref=e315]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech" + - generic [ref=e316]: + - generic [ref=e317]: tech + - generic [ref=e318]: ai + - generic [ref=e319]: framework + - generic [ref=e320]: mlops + - generic [ref=e321]: gpu + - generic [ref=e322]: il y a environ 5 heures + - generic [ref=e323]: + - button "Pin" [ref=e324]: + - img + - button "Change color" [ref=e325]: + - img + - button [ref=e326]: + - img + - button "Test Image API Note avec image il y a environ 8 heures" [ref=e327]: + - generic [ref=e328]: + - heading "Test Image API" [level=3] [ref=e329] + - paragraph [ref=e331]: Note avec image + - generic [ref=e332]: il y a environ 8 heures + - generic [ref=e333]: + - button "Pin" [ref=e334]: + - img + - button "Change color" [ref=e335]: + - img + - button [ref=e336]: + - img + - button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e337]: + - generic [ref=e338]: + - heading "Test Markdown" [level=3] [ref=e339] + - generic [ref=e341]: + - heading "Titre Modifié" [level=1] [ref=e342] + - heading "Sous-titre édité" [level=2] [ref=e343] + - list [ref=e344]: + - listitem [ref=e345]: Liste modifiée 1 + - listitem [ref=e346]: Liste modifiée 2 + - listitem [ref=e347]: Nouvelle liste 3 + - paragraph [ref=e348]: + - strong [ref=e349]: Texte gras modifié + - text: et + - emphasis [ref=e350]: italique édité + - code [ref=e352]: console.log("Code modifié avec succès!") + - generic [ref=e353]: il y a environ 5 heures + - generic [ref=e354]: + - button "Pin" [ref=e355]: + - img + - button "Change color" [ref=e356]: + - img + - button [ref=e357]: + - img + - button "Test Image Avec image il y a environ 8 heures" [ref=e358]: + - generic [ref=e359]: + - heading "Test Image" [level=3] [ref=e360] + - paragraph [ref=e361]: Avec image + - generic [ref=e362]: il y a environ 8 heures + - generic [ref=e363]: + - button "Pin" [ref=e364]: + - img + - button "Change color" [ref=e365]: + - img + - button [ref=e366]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e367]': + - generic [ref=e368]: + - heading "New AI Framework Released" [level=3] [ref=e369] + - paragraph [ref=e370]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu" + - generic [ref=e371]: + - generic [ref=e372]: tech + - generic [ref=e373]: ai + - generic [ref=e374]: framework + - generic [ref=e375]: mlops + - generic [ref=e376]: gpu + - generic [ref=e377]: il y a environ 6 heures + - generic [ref=e378]: + - button "Pin" [ref=e379]: + - img + - button "Change color" [ref=e380]: + - img + - button [ref=e381]: + - img + - button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e382]: + - generic [ref=e383]: + - img [ref=e384] + - heading "Test Note" [level=3] [ref=e387] + - paragraph [ref=e388]: This is my first note to test the Google Keep clone! + - generic [ref=e389]: il y a environ 10 heures + - generic [ref=e390]: + - button "Pin" [ref=e391]: + - img + - button "Change color" [ref=e392]: + - img + - button [ref=e393]: + - img + - button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e394]: + - generic [ref=e395]: + - heading "Titre Modifié" [level=3] [ref=e396] + - paragraph [ref=e397]: Contenu modifié avec succès! + - generic [ref=e398]: il y a environ 5 heures + - generic [ref=e399]: + - button "Pin" [ref=e400]: + - img + - button "Change color" [ref=e401]: + - img + - button [ref=e402]: + - img + - status [ref=e403] + - button "Open Next.js Dev Tools" [ref=e409] [cursor=pointer]: + - img [ref=e410] + - alert [ref=e413] +``` \ No newline at end of file diff --git a/keep-notes/playwright-report/data/fb05060e7eafdec310ca4d083f2b46b1da8c082f.md b/keep-notes/playwright-report/data/fb05060e7eafdec310ca4d083f2b46b1da8c082f.md new file mode 100644 index 0000000..fba3c23 --- /dev/null +++ b/keep-notes/playwright-report/data/fb05060e7eafdec310ca4d083f2b46b1da8c082f.md @@ -0,0 +1,557 @@ +# Page snapshot + +```yaml +- generic [active] [ref=e1]: + - banner [ref=e2]: + - generic [ref=e3]: + - link "Memento" [ref=e4] [cursor=pointer]: + - /url: / + - img [ref=e5] + - generic [ref=e8]: Memento + - generic [ref=e10]: + - img [ref=e11] + - textbox "Search notes..." [ref=e14] + - button [ref=e15]: + - img + - navigation [ref=e16]: + - link "Notes" [ref=e17] [cursor=pointer]: + - /url: / + - img [ref=e18] + - text: Notes + - link "Archive" [ref=e21] [cursor=pointer]: + - /url: /archive + - img [ref=e22] + - text: Archive + - main [ref=e25]: + - generic [ref=e27]: + - textbox "Take a note..." [ref=e28] + - button "New checklist" [ref=e29]: + - img + - generic [ref=e30]: + - generic [ref=e31]: + - heading "Pinned" [level=2] [ref=e32] + - button "Updated Note avec image il y a environ 8 heures" [ref=e34]: + - generic [ref=e35]: + - img [ref=e36] + - heading "Updated" [level=3] [ref=e38] + - paragraph [ref=e39]: Note avec image + - generic [ref=e40]: il y a environ 8 heures + - generic [ref=e41]: + - button "Unpin" [ref=e42]: + - img + - button "Change color" [ref=e43]: + - img + - button [ref=e44]: + - img + - generic [ref=e45]: + - heading "Others" [level=2] [ref=e46] + - generic [ref=e47]: + - button "test-1767557370056-Note 4 test-1767557370056-Content 4 il y a moins d’une minute" [ref=e48]: + - generic [ref=e49]: + - heading "test-1767557370056-Note 4" [level=3] [ref=e50] + - paragraph [ref=e51]: test-1767557370056-Content 4 + - generic [ref=e52]: il y a moins d’une minute + - generic [ref=e53]: + - button "Pin" [ref=e54]: + - img + - button "Change color" [ref=e55]: + - img + - button [ref=e56]: + - img + - button "test-1767557370056-Note 3 test-1767557370056-Content 3 il y a moins d’une minute" [ref=e57]: + - generic [ref=e58]: + - heading "test-1767557370056-Note 3" [level=3] [ref=e59] + - paragraph [ref=e60]: test-1767557370056-Content 3 + - generic [ref=e61]: il y a moins d’une minute + - generic [ref=e62]: + - button "Pin" [ref=e63]: + - img + - button "Change color" [ref=e64]: + - img + - button [ref=e65]: + - img + - button "test-1767557370056-Note 2 test-1767557370056-Content 2 il y a moins d’une minute" [ref=e66]: + - generic [ref=e67]: + - heading "test-1767557370056-Note 2" [level=3] [ref=e68] + - paragraph [ref=e69]: test-1767557370056-Content 2 + - generic [ref=e70]: il y a moins d’une minute + - generic [ref=e71]: + - button "Pin" [ref=e72]: + - img + - button "Change color" [ref=e73]: + - img + - button [ref=e74]: + - img + - button "test-1767557370056-Note 1 test-1767557370056-Content 1 il y a moins d’une minute" [ref=e75]: + - generic [ref=e76]: + - heading "test-1767557370056-Note 1" [level=3] [ref=e77] + - paragraph [ref=e78]: test-1767557370056-Content 1 + - generic [ref=e79]: il y a moins d’une minute + - generic [ref=e80]: + - button "Pin" [ref=e81]: + - img + - button "Change color" [ref=e82]: + - img + - button [ref=e83]: + - img + - button "test-1767557339218-Note 4 test-1767557339218-Content 4 il y a 1 minute" [ref=e84]: + - generic [ref=e85]: + - heading "test-1767557339218-Note 4" [level=3] [ref=e86] + - paragraph [ref=e87]: test-1767557339218-Content 4 + - generic [ref=e88]: il y a 1 minute + - generic [ref=e89]: + - button "Pin" [ref=e90]: + - img + - button "Change color" [ref=e91]: + - img + - button [ref=e92]: + - img + - button "test-1767557339218-Note 3 test-1767557339218-Content 3 il y a 1 minute" [ref=e93]: + - generic [ref=e94]: + - heading "test-1767557339218-Note 3" [level=3] [ref=e95] + - paragraph [ref=e96]: test-1767557339218-Content 3 + - generic [ref=e97]: il y a 1 minute + - generic [ref=e98]: + - button "Pin" [ref=e99]: + - img + - button "Change color" [ref=e100]: + - img + - button [ref=e101]: + - img + - button "test-1767557339218-Note 2 test-1767557339218-Content 2 il y a 1 minute" [ref=e102]: + - generic [ref=e103]: + - heading "test-1767557339218-Note 2" [level=3] [ref=e104] + - paragraph [ref=e105]: test-1767557339218-Content 2 + - generic [ref=e106]: il y a 1 minute + - generic [ref=e107]: + - button "Pin" [ref=e108]: + - img + - button "Change color" [ref=e109]: + - img + - button [ref=e110]: + - img + - button "test-1767557339218-Note 1 test-1767557339218-Content 1 il y a 1 minute" [ref=e111]: + - generic [ref=e112]: + - heading "test-1767557339218-Note 1" [level=3] [ref=e113] + - paragraph [ref=e114]: test-1767557339218-Content 1 + - generic [ref=e115]: il y a 1 minute + - generic [ref=e116]: + - button "Pin" [ref=e117]: + - img + - button "Change color" [ref=e118]: + - img + - button [ref=e119]: + - img + - button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a 1 minute" [ref=e120]: + - generic [ref=e121]: + - heading "test-1767557334587-Note 4" [level=3] [ref=e122] + - paragraph [ref=e123]: test-1767557334587-Content 4 + - generic [ref=e124]: il y a 1 minute + - generic [ref=e125]: + - button "Pin" [ref=e126]: + - img + - button "Change color" [ref=e127]: + - img + - button [ref=e128]: + - img + - button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a 1 minute" [ref=e129]: + - generic [ref=e130]: + - heading "test-1767557334587-Note 3" [level=3] [ref=e131] + - paragraph [ref=e132]: test-1767557334587-Content 3 + - generic [ref=e133]: il y a 1 minute + - generic [ref=e134]: + - button "Pin" [ref=e135]: + - img + - button "Change color" [ref=e136]: + - img + - button [ref=e137]: + - img + - button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a 1 minute" [ref=e138]: + - generic [ref=e139]: + - heading "test-1767557334587-Note 2" [level=3] [ref=e140] + - paragraph [ref=e141]: test-1767557334587-Content 2 + - generic [ref=e142]: il y a 1 minute + - generic [ref=e143]: + - button "Pin" [ref=e144]: + - img + - button "Change color" [ref=e145]: + - img + - button [ref=e146]: + - img + - button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a 1 minute" [ref=e147]: + - generic [ref=e148]: + - heading "test-1767557334587-Note 1" [level=3] [ref=e149] + - paragraph [ref=e150]: test-1767557334587-Content 1 + - generic [ref=e151]: il y a 1 minute + - generic [ref=e152]: + - button "Pin" [ref=e153]: + - img + - button "Change color" [ref=e154]: + - img + - button [ref=e155]: + - img + - button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a 1 minute" [ref=e156]: + - generic [ref=e157]: + - heading "test-1767557330820-Note 4" [level=3] [ref=e158] + - paragraph [ref=e159]: test-1767557330820-Content 4 + - generic [ref=e160]: il y a 1 minute + - generic [ref=e161]: + - button "Pin" [ref=e162]: + - img + - button "Change color" [ref=e163]: + - img + - button [ref=e164]: + - img + - button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a 1 minute" [ref=e165]: + - generic [ref=e166]: + - heading "test-1767557330820-Note 3" [level=3] [ref=e167] + - paragraph [ref=e168]: test-1767557330820-Content 3 + - generic [ref=e169]: il y a 1 minute + - generic [ref=e170]: + - button "Pin" [ref=e171]: + - img + - button "Change color" [ref=e172]: + - img + - button [ref=e173]: + - img + - button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a 1 minute" [ref=e174]: + - generic [ref=e175]: + - heading "test-1767557330820-Note 2" [level=3] [ref=e176] + - paragraph [ref=e177]: test-1767557330820-Content 2 + - generic [ref=e178]: il y a 1 minute + - generic [ref=e179]: + - button "Pin" [ref=e180]: + - img + - button "Change color" [ref=e181]: + - img + - button [ref=e182]: + - img + - button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a 1 minute" [ref=e183]: + - generic [ref=e184]: + - heading "test-1767557330820-Note 1" [level=3] [ref=e185] + - paragraph [ref=e186]: test-1767557330820-Content 1 + - generic [ref=e187]: il y a 1 minute + - generic [ref=e188]: + - button "Pin" [ref=e189]: + - img + - button "Change color" [ref=e190]: + - img + - button [ref=e191]: + - img + - button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a 1 minute" [ref=e192]: + - generic [ref=e193]: + - heading "test-1767557327567-Note 4" [level=3] [ref=e194] + - paragraph [ref=e195]: test-1767557327567-Content 4 + - generic [ref=e196]: il y a 1 minute + - generic [ref=e197]: + - button "Pin" [ref=e198]: + - img + - button "Change color" [ref=e199]: + - img + - button [ref=e200]: + - img + - button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a 1 minute" [ref=e201]: + - generic [ref=e202]: + - heading "test-1767557327567-Note 3" [level=3] [ref=e203] + - paragraph [ref=e204]: test-1767557327567-Content 3 + - generic [ref=e205]: il y a 1 minute + - generic [ref=e206]: + - button "Pin" [ref=e207]: + - img + - button "Change color" [ref=e208]: + - img + - button [ref=e209]: + - img + - button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a 1 minute" [ref=e210]: + - generic [ref=e211]: + - heading "test-1767557327567-Note 2" [level=3] [ref=e212] + - paragraph [ref=e213]: test-1767557327567-Content 2 + - generic [ref=e214]: il y a 1 minute + - generic [ref=e215]: + - button "Pin" [ref=e216]: + - img + - button "Change color" [ref=e217]: + - img + - button [ref=e218]: + - img + - button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a 1 minute" [ref=e219]: + - generic [ref=e220]: + - heading "test-1767557327567-Note 1" [level=3] [ref=e221] + - paragraph [ref=e222]: test-1767557327567-Content 1 + - generic [ref=e223]: il y a 1 minute + - generic [ref=e224]: + - button "Pin" [ref=e225]: + - img + - button "Change color" [ref=e226]: + - img + - button [ref=e227]: + - img + - button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a 1 minute" [ref=e228]: + - generic [ref=e229]: + - heading "test-1767557324248-Note 4" [level=3] [ref=e230] + - paragraph [ref=e231]: test-1767557324248-Content 4 + - generic [ref=e232]: il y a 1 minute + - generic [ref=e233]: + - button "Pin" [ref=e234]: + - img + - button "Change color" [ref=e235]: + - img + - button [ref=e236]: + - img + - button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a 1 minute" [ref=e237]: + - generic [ref=e238]: + - heading "test-1767557324248-Note 3" [level=3] [ref=e239] + - paragraph [ref=e240]: test-1767557324248-Content 3 + - generic [ref=e241]: il y a 1 minute + - generic [ref=e242]: + - button "Pin" [ref=e243]: + - img + - button "Change color" [ref=e244]: + - img + - button [ref=e245]: + - img + - button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a 1 minute" [ref=e246]: + - generic [ref=e247]: + - heading "test-1767557324248-Note 2" [level=3] [ref=e248] + - paragraph [ref=e249]: test-1767557324248-Content 2 + - generic [ref=e250]: il y a 1 minute + - generic [ref=e251]: + - button "Pin" [ref=e252]: + - img + - button "Change color" [ref=e253]: + - img + - button [ref=e254]: + - img + - button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a 1 minute" [ref=e255]: + - generic [ref=e256]: + - heading "test-1767557324248-Note 1" [level=3] [ref=e257] + - paragraph [ref=e258]: test-1767557324248-Content 1 + - generic [ref=e259]: il y a 1 minute + - generic [ref=e260]: + - button "Pin" [ref=e261]: + - img + - button "Change color" [ref=e262]: + - img + - button [ref=e263]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e264]: + - generic [ref=e265]: + - heading "Test Note for Reminder" [level=3] [ref=e266] + - paragraph [ref=e267]: This note will have a reminder + - generic [ref=e268]: il y a 27 minutes + - generic [ref=e269]: + - button "Pin" [ref=e270]: + - img + - button "Change color" [ref=e271]: + - img + - button [ref=e272]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e273]: + - generic [ref=e274]: + - heading "Test Note for Reminder" [level=3] [ref=e275] + - paragraph [ref=e276]: This note will have a reminder + - generic [ref=e277]: il y a 27 minutes + - generic [ref=e278]: + - button "Pin" [ref=e279]: + - img + - button "Change color" [ref=e280]: + - img + - button [ref=e281]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e282]: + - generic [ref=e283]: + - heading "Test Note for Reminder" [level=3] [ref=e284] + - paragraph [ref=e285]: This note will have a reminder + - generic [ref=e286]: il y a 27 minutes + - generic [ref=e287]: + - button "Pin" [ref=e288]: + - img + - button "Change color" [ref=e289]: + - img + - button [ref=e290]: + - img + - button "Test note il y a 26 minutes" [ref=e291]: + - generic [ref=e292]: + - paragraph [ref=e293]: Test note + - generic [ref=e294]: il y a 26 minutes + - generic [ref=e295]: + - button "Pin" [ref=e296]: + - img + - button "Change color" [ref=e297]: + - img + - button [ref=e298]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e299]: + - generic [ref=e300]: + - heading "Test Note for Reminder" [level=3] [ref=e301] + - paragraph [ref=e302]: This note will have a reminder + - generic [ref=e303]: il y a 27 minutes + - generic [ref=e304]: + - button "Pin" [ref=e305]: + - img + - button "Change color" [ref=e306]: + - img + - button [ref=e307]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e308]: + - generic [ref=e309]: + - heading "Test Note for Reminder" [level=3] [ref=e310] + - paragraph [ref=e311]: This note will have a reminder + - generic [ref=e312]: il y a 27 minutes + - generic [ref=e313]: + - button "Pin" [ref=e314]: + - img + - button "Change color" [ref=e315]: + - img + - button [ref=e316]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e317]: + - generic [ref=e318]: + - heading "Test Note for Reminder" [level=3] [ref=e319] + - paragraph [ref=e320]: This note will have a reminder + - generic [ref=e321]: il y a 27 minutes + - generic [ref=e322]: + - button "Pin" [ref=e323]: + - img + - button "Change color" [ref=e324]: + - img + - button [ref=e325]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e326]: + - generic [ref=e327]: + - img [ref=e328] + - heading "Test Note for Reminder" [level=3] [ref=e331] + - paragraph [ref=e332]: This note will have a reminder + - generic [ref=e333]: il y a 27 minutes + - generic [ref=e334]: + - button "Pin" [ref=e335]: + - img + - button "Change color" [ref=e336]: + - img + - button [ref=e337]: + - img + - button "test sample file il y a environ 5 heures" [ref=e338]: + - generic [ref=e339]: + - heading "test" [level=3] [ref=e340] + - paragraph [ref=e342]: sample file + - generic [ref=e343]: il y a environ 5 heures + - generic [ref=e344]: + - button "Pin" [ref=e345]: + - img + - button "Change color" [ref=e346]: + - img + - button [ref=e347]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e348]': + - generic [ref=e349]: + - heading "New AI Framework Released" [level=3] [ref=e350] + - paragraph [ref=e351]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech" + - generic [ref=e352]: + - generic [ref=e353]: tech + - generic [ref=e354]: ai + - generic [ref=e355]: framework + - generic [ref=e356]: mlops + - generic [ref=e357]: gpu + - generic [ref=e358]: il y a environ 5 heures + - generic [ref=e359]: + - button "Pin" [ref=e360]: + - img + - button "Change color" [ref=e361]: + - img + - button [ref=e362]: + - img + - button "Test Image API Note avec image il y a environ 8 heures" [ref=e363]: + - generic [ref=e364]: + - heading "Test Image API" [level=3] [ref=e365] + - paragraph [ref=e367]: Note avec image + - generic [ref=e368]: il y a environ 8 heures + - generic [ref=e369]: + - button "Pin" [ref=e370]: + - img + - button "Change color" [ref=e371]: + - img + - button [ref=e372]: + - img + - button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e373]: + - generic [ref=e374]: + - heading "Test Markdown" [level=3] [ref=e375] + - generic [ref=e377]: + - heading "Titre Modifié" [level=1] [ref=e378] + - heading "Sous-titre édité" [level=2] [ref=e379] + - list [ref=e380]: + - listitem [ref=e381]: Liste modifiée 1 + - listitem [ref=e382]: Liste modifiée 2 + - listitem [ref=e383]: Nouvelle liste 3 + - paragraph [ref=e384]: + - strong [ref=e385]: Texte gras modifié + - text: et + - emphasis [ref=e386]: italique édité + - code [ref=e388]: console.log("Code modifié avec succès!") + - generic [ref=e389]: il y a environ 5 heures + - generic [ref=e390]: + - button "Pin" [ref=e391]: + - img + - button "Change color" [ref=e392]: + - img + - button [ref=e393]: + - img + - button "Test Image Avec image il y a environ 8 heures" [ref=e394]: + - generic [ref=e395]: + - heading "Test Image" [level=3] [ref=e396] + - paragraph [ref=e397]: Avec image + - generic [ref=e398]: il y a environ 8 heures + - generic [ref=e399]: + - button "Pin" [ref=e400]: + - img + - button "Change color" [ref=e401]: + - img + - button [ref=e402]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e403]': + - generic [ref=e404]: + - heading "New AI Framework Released" [level=3] [ref=e405] + - paragraph [ref=e406]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu" + - generic [ref=e407]: + - generic [ref=e408]: tech + - generic [ref=e409]: ai + - generic [ref=e410]: framework + - generic [ref=e411]: mlops + - generic [ref=e412]: gpu + - generic [ref=e413]: il y a environ 6 heures + - generic [ref=e414]: + - button "Pin" [ref=e415]: + - img + - button "Change color" [ref=e416]: + - img + - button [ref=e417]: + - img + - button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e418]: + - generic [ref=e419]: + - img [ref=e420] + - heading "Test Note" [level=3] [ref=e423] + - paragraph [ref=e424]: This is my first note to test the Google Keep clone! + - generic [ref=e425]: il y a environ 10 heures + - generic [ref=e426]: + - button "Pin" [ref=e427]: + - img + - button "Change color" [ref=e428]: + - img + - button [ref=e429]: + - img + - button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e430]: + - generic [ref=e431]: + - heading "Titre Modifié" [level=3] [ref=e432] + - paragraph [ref=e433]: Contenu modifié avec succès! + - generic [ref=e434]: il y a environ 5 heures + - generic [ref=e435]: + - button "Pin" [ref=e436]: + - img + - button "Change color" [ref=e437]: + - img + - button [ref=e438]: + - img + - status [ref=e439] + - button "Open Next.js Dev Tools" [ref=e445] [cursor=pointer]: + - img [ref=e446] + - alert [ref=e449] +``` \ No newline at end of file diff --git a/keep-notes/playwright-report/index.html b/keep-notes/playwright-report/index.html new file mode 100644 index 0000000..f6e93e5 --- /dev/null +++ b/keep-notes/playwright-report/index.html @@ -0,0 +1,85 @@ + + + + + + + + + Playwright Test Report + + + + +
+ + + \ No newline at end of file diff --git a/keep-notes/playwright.config.ts b/keep-notes/playwright.config.ts index 0726699..75e90bf 100644 --- a/keep-notes/playwright.config.ts +++ b/keep-notes/playwright.config.ts @@ -2,7 +2,7 @@ import { defineConfig, devices } from '@playwright/test'; export default defineConfig({ testDir: './tests', - fullyParallel: true, + fullyParallel: false, // Disabled to prevent test isolation issues forbidOnly: !!process.env.CI, retries: process.env.CI ? 2 : 0, workers: process.env.CI ? 1 : undefined, diff --git a/keep-notes/prisma/dev.db b/keep-notes/prisma/dev.db index 0e5e849..672093e 100644 Binary files a/keep-notes/prisma/dev.db and b/keep-notes/prisma/dev.db differ diff --git a/keep-notes/scripts/fix-order.ts b/keep-notes/scripts/fix-order.ts new file mode 100644 index 0000000..f2dcc5f --- /dev/null +++ b/keep-notes/scripts/fix-order.ts @@ -0,0 +1,34 @@ +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function fixOrder() { + try { + // Get all notes sorted by creation date + const notes = await prisma.note.findMany({ + orderBy: [ + { isPinned: 'desc' }, + { createdAt: 'asc' } + ] + }) + + console.log(`Found ${notes.length} notes`) + + // Update order values + for (let i = 0; i < notes.length; i++) { + await prisma.note.update({ + where: { id: notes[i].id }, + data: { order: i } + }) + console.log(`Updated note ${notes[i].id} - order: ${i}`) + } + + console.log('✅ Order values fixed!') + } catch (error) { + console.error('Error:', error) + } finally { + await prisma.$disconnect() + } +} + +fixOrder() diff --git a/keep-notes/test-results/.last-run.json b/keep-notes/test-results/.last-run.json new file mode 100644 index 0000000..2d77355 --- /dev/null +++ b/keep-notes/test-results/.last-run.json @@ -0,0 +1,8 @@ +{ + "status": "failed", + "failedTests": [ + "1e19528dd527cbd19c0c-4c49b0bcb3667bb1a228", + "1e19528dd527cbd19c0c-039ef3f0ab8fb4aa0094", + "1e19528dd527cbd19c0c-ff6161ab584bdf7fa93d" + ] +} \ No newline at end of file diff --git a/keep-notes/test-results/drag-drop-Note-Grid---Drag-65c70-npinned-notes-when-dragging-chromium/error-context.md b/keep-notes/test-results/drag-drop-Note-Grid---Drag-65c70-npinned-notes-when-dragging-chromium/error-context.md new file mode 100644 index 0000000..fba3c23 --- /dev/null +++ b/keep-notes/test-results/drag-drop-Note-Grid---Drag-65c70-npinned-notes-when-dragging-chromium/error-context.md @@ -0,0 +1,557 @@ +# Page snapshot + +```yaml +- generic [active] [ref=e1]: + - banner [ref=e2]: + - generic [ref=e3]: + - link "Memento" [ref=e4] [cursor=pointer]: + - /url: / + - img [ref=e5] + - generic [ref=e8]: Memento + - generic [ref=e10]: + - img [ref=e11] + - textbox "Search notes..." [ref=e14] + - button [ref=e15]: + - img + - navigation [ref=e16]: + - link "Notes" [ref=e17] [cursor=pointer]: + - /url: / + - img [ref=e18] + - text: Notes + - link "Archive" [ref=e21] [cursor=pointer]: + - /url: /archive + - img [ref=e22] + - text: Archive + - main [ref=e25]: + - generic [ref=e27]: + - textbox "Take a note..." [ref=e28] + - button "New checklist" [ref=e29]: + - img + - generic [ref=e30]: + - generic [ref=e31]: + - heading "Pinned" [level=2] [ref=e32] + - button "Updated Note avec image il y a environ 8 heures" [ref=e34]: + - generic [ref=e35]: + - img [ref=e36] + - heading "Updated" [level=3] [ref=e38] + - paragraph [ref=e39]: Note avec image + - generic [ref=e40]: il y a environ 8 heures + - generic [ref=e41]: + - button "Unpin" [ref=e42]: + - img + - button "Change color" [ref=e43]: + - img + - button [ref=e44]: + - img + - generic [ref=e45]: + - heading "Others" [level=2] [ref=e46] + - generic [ref=e47]: + - button "test-1767557370056-Note 4 test-1767557370056-Content 4 il y a moins d’une minute" [ref=e48]: + - generic [ref=e49]: + - heading "test-1767557370056-Note 4" [level=3] [ref=e50] + - paragraph [ref=e51]: test-1767557370056-Content 4 + - generic [ref=e52]: il y a moins d’une minute + - generic [ref=e53]: + - button "Pin" [ref=e54]: + - img + - button "Change color" [ref=e55]: + - img + - button [ref=e56]: + - img + - button "test-1767557370056-Note 3 test-1767557370056-Content 3 il y a moins d’une minute" [ref=e57]: + - generic [ref=e58]: + - heading "test-1767557370056-Note 3" [level=3] [ref=e59] + - paragraph [ref=e60]: test-1767557370056-Content 3 + - generic [ref=e61]: il y a moins d’une minute + - generic [ref=e62]: + - button "Pin" [ref=e63]: + - img + - button "Change color" [ref=e64]: + - img + - button [ref=e65]: + - img + - button "test-1767557370056-Note 2 test-1767557370056-Content 2 il y a moins d’une minute" [ref=e66]: + - generic [ref=e67]: + - heading "test-1767557370056-Note 2" [level=3] [ref=e68] + - paragraph [ref=e69]: test-1767557370056-Content 2 + - generic [ref=e70]: il y a moins d’une minute + - generic [ref=e71]: + - button "Pin" [ref=e72]: + - img + - button "Change color" [ref=e73]: + - img + - button [ref=e74]: + - img + - button "test-1767557370056-Note 1 test-1767557370056-Content 1 il y a moins d’une minute" [ref=e75]: + - generic [ref=e76]: + - heading "test-1767557370056-Note 1" [level=3] [ref=e77] + - paragraph [ref=e78]: test-1767557370056-Content 1 + - generic [ref=e79]: il y a moins d’une minute + - generic [ref=e80]: + - button "Pin" [ref=e81]: + - img + - button "Change color" [ref=e82]: + - img + - button [ref=e83]: + - img + - button "test-1767557339218-Note 4 test-1767557339218-Content 4 il y a 1 minute" [ref=e84]: + - generic [ref=e85]: + - heading "test-1767557339218-Note 4" [level=3] [ref=e86] + - paragraph [ref=e87]: test-1767557339218-Content 4 + - generic [ref=e88]: il y a 1 minute + - generic [ref=e89]: + - button "Pin" [ref=e90]: + - img + - button "Change color" [ref=e91]: + - img + - button [ref=e92]: + - img + - button "test-1767557339218-Note 3 test-1767557339218-Content 3 il y a 1 minute" [ref=e93]: + - generic [ref=e94]: + - heading "test-1767557339218-Note 3" [level=3] [ref=e95] + - paragraph [ref=e96]: test-1767557339218-Content 3 + - generic [ref=e97]: il y a 1 minute + - generic [ref=e98]: + - button "Pin" [ref=e99]: + - img + - button "Change color" [ref=e100]: + - img + - button [ref=e101]: + - img + - button "test-1767557339218-Note 2 test-1767557339218-Content 2 il y a 1 minute" [ref=e102]: + - generic [ref=e103]: + - heading "test-1767557339218-Note 2" [level=3] [ref=e104] + - paragraph [ref=e105]: test-1767557339218-Content 2 + - generic [ref=e106]: il y a 1 minute + - generic [ref=e107]: + - button "Pin" [ref=e108]: + - img + - button "Change color" [ref=e109]: + - img + - button [ref=e110]: + - img + - button "test-1767557339218-Note 1 test-1767557339218-Content 1 il y a 1 minute" [ref=e111]: + - generic [ref=e112]: + - heading "test-1767557339218-Note 1" [level=3] [ref=e113] + - paragraph [ref=e114]: test-1767557339218-Content 1 + - generic [ref=e115]: il y a 1 minute + - generic [ref=e116]: + - button "Pin" [ref=e117]: + - img + - button "Change color" [ref=e118]: + - img + - button [ref=e119]: + - img + - button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a 1 minute" [ref=e120]: + - generic [ref=e121]: + - heading "test-1767557334587-Note 4" [level=3] [ref=e122] + - paragraph [ref=e123]: test-1767557334587-Content 4 + - generic [ref=e124]: il y a 1 minute + - generic [ref=e125]: + - button "Pin" [ref=e126]: + - img + - button "Change color" [ref=e127]: + - img + - button [ref=e128]: + - img + - button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a 1 minute" [ref=e129]: + - generic [ref=e130]: + - heading "test-1767557334587-Note 3" [level=3] [ref=e131] + - paragraph [ref=e132]: test-1767557334587-Content 3 + - generic [ref=e133]: il y a 1 minute + - generic [ref=e134]: + - button "Pin" [ref=e135]: + - img + - button "Change color" [ref=e136]: + - img + - button [ref=e137]: + - img + - button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a 1 minute" [ref=e138]: + - generic [ref=e139]: + - heading "test-1767557334587-Note 2" [level=3] [ref=e140] + - paragraph [ref=e141]: test-1767557334587-Content 2 + - generic [ref=e142]: il y a 1 minute + - generic [ref=e143]: + - button "Pin" [ref=e144]: + - img + - button "Change color" [ref=e145]: + - img + - button [ref=e146]: + - img + - button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a 1 minute" [ref=e147]: + - generic [ref=e148]: + - heading "test-1767557334587-Note 1" [level=3] [ref=e149] + - paragraph [ref=e150]: test-1767557334587-Content 1 + - generic [ref=e151]: il y a 1 minute + - generic [ref=e152]: + - button "Pin" [ref=e153]: + - img + - button "Change color" [ref=e154]: + - img + - button [ref=e155]: + - img + - button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a 1 minute" [ref=e156]: + - generic [ref=e157]: + - heading "test-1767557330820-Note 4" [level=3] [ref=e158] + - paragraph [ref=e159]: test-1767557330820-Content 4 + - generic [ref=e160]: il y a 1 minute + - generic [ref=e161]: + - button "Pin" [ref=e162]: + - img + - button "Change color" [ref=e163]: + - img + - button [ref=e164]: + - img + - button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a 1 minute" [ref=e165]: + - generic [ref=e166]: + - heading "test-1767557330820-Note 3" [level=3] [ref=e167] + - paragraph [ref=e168]: test-1767557330820-Content 3 + - generic [ref=e169]: il y a 1 minute + - generic [ref=e170]: + - button "Pin" [ref=e171]: + - img + - button "Change color" [ref=e172]: + - img + - button [ref=e173]: + - img + - button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a 1 minute" [ref=e174]: + - generic [ref=e175]: + - heading "test-1767557330820-Note 2" [level=3] [ref=e176] + - paragraph [ref=e177]: test-1767557330820-Content 2 + - generic [ref=e178]: il y a 1 minute + - generic [ref=e179]: + - button "Pin" [ref=e180]: + - img + - button "Change color" [ref=e181]: + - img + - button [ref=e182]: + - img + - button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a 1 minute" [ref=e183]: + - generic [ref=e184]: + - heading "test-1767557330820-Note 1" [level=3] [ref=e185] + - paragraph [ref=e186]: test-1767557330820-Content 1 + - generic [ref=e187]: il y a 1 minute + - generic [ref=e188]: + - button "Pin" [ref=e189]: + - img + - button "Change color" [ref=e190]: + - img + - button [ref=e191]: + - img + - button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a 1 minute" [ref=e192]: + - generic [ref=e193]: + - heading "test-1767557327567-Note 4" [level=3] [ref=e194] + - paragraph [ref=e195]: test-1767557327567-Content 4 + - generic [ref=e196]: il y a 1 minute + - generic [ref=e197]: + - button "Pin" [ref=e198]: + - img + - button "Change color" [ref=e199]: + - img + - button [ref=e200]: + - img + - button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a 1 minute" [ref=e201]: + - generic [ref=e202]: + - heading "test-1767557327567-Note 3" [level=3] [ref=e203] + - paragraph [ref=e204]: test-1767557327567-Content 3 + - generic [ref=e205]: il y a 1 minute + - generic [ref=e206]: + - button "Pin" [ref=e207]: + - img + - button "Change color" [ref=e208]: + - img + - button [ref=e209]: + - img + - button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a 1 minute" [ref=e210]: + - generic [ref=e211]: + - heading "test-1767557327567-Note 2" [level=3] [ref=e212] + - paragraph [ref=e213]: test-1767557327567-Content 2 + - generic [ref=e214]: il y a 1 minute + - generic [ref=e215]: + - button "Pin" [ref=e216]: + - img + - button "Change color" [ref=e217]: + - img + - button [ref=e218]: + - img + - button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a 1 minute" [ref=e219]: + - generic [ref=e220]: + - heading "test-1767557327567-Note 1" [level=3] [ref=e221] + - paragraph [ref=e222]: test-1767557327567-Content 1 + - generic [ref=e223]: il y a 1 minute + - generic [ref=e224]: + - button "Pin" [ref=e225]: + - img + - button "Change color" [ref=e226]: + - img + - button [ref=e227]: + - img + - button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a 1 minute" [ref=e228]: + - generic [ref=e229]: + - heading "test-1767557324248-Note 4" [level=3] [ref=e230] + - paragraph [ref=e231]: test-1767557324248-Content 4 + - generic [ref=e232]: il y a 1 minute + - generic [ref=e233]: + - button "Pin" [ref=e234]: + - img + - button "Change color" [ref=e235]: + - img + - button [ref=e236]: + - img + - button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a 1 minute" [ref=e237]: + - generic [ref=e238]: + - heading "test-1767557324248-Note 3" [level=3] [ref=e239] + - paragraph [ref=e240]: test-1767557324248-Content 3 + - generic [ref=e241]: il y a 1 minute + - generic [ref=e242]: + - button "Pin" [ref=e243]: + - img + - button "Change color" [ref=e244]: + - img + - button [ref=e245]: + - img + - button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a 1 minute" [ref=e246]: + - generic [ref=e247]: + - heading "test-1767557324248-Note 2" [level=3] [ref=e248] + - paragraph [ref=e249]: test-1767557324248-Content 2 + - generic [ref=e250]: il y a 1 minute + - generic [ref=e251]: + - button "Pin" [ref=e252]: + - img + - button "Change color" [ref=e253]: + - img + - button [ref=e254]: + - img + - button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a 1 minute" [ref=e255]: + - generic [ref=e256]: + - heading "test-1767557324248-Note 1" [level=3] [ref=e257] + - paragraph [ref=e258]: test-1767557324248-Content 1 + - generic [ref=e259]: il y a 1 minute + - generic [ref=e260]: + - button "Pin" [ref=e261]: + - img + - button "Change color" [ref=e262]: + - img + - button [ref=e263]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e264]: + - generic [ref=e265]: + - heading "Test Note for Reminder" [level=3] [ref=e266] + - paragraph [ref=e267]: This note will have a reminder + - generic [ref=e268]: il y a 27 minutes + - generic [ref=e269]: + - button "Pin" [ref=e270]: + - img + - button "Change color" [ref=e271]: + - img + - button [ref=e272]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e273]: + - generic [ref=e274]: + - heading "Test Note for Reminder" [level=3] [ref=e275] + - paragraph [ref=e276]: This note will have a reminder + - generic [ref=e277]: il y a 27 minutes + - generic [ref=e278]: + - button "Pin" [ref=e279]: + - img + - button "Change color" [ref=e280]: + - img + - button [ref=e281]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e282]: + - generic [ref=e283]: + - heading "Test Note for Reminder" [level=3] [ref=e284] + - paragraph [ref=e285]: This note will have a reminder + - generic [ref=e286]: il y a 27 minutes + - generic [ref=e287]: + - button "Pin" [ref=e288]: + - img + - button "Change color" [ref=e289]: + - img + - button [ref=e290]: + - img + - button "Test note il y a 26 minutes" [ref=e291]: + - generic [ref=e292]: + - paragraph [ref=e293]: Test note + - generic [ref=e294]: il y a 26 minutes + - generic [ref=e295]: + - button "Pin" [ref=e296]: + - img + - button "Change color" [ref=e297]: + - img + - button [ref=e298]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e299]: + - generic [ref=e300]: + - heading "Test Note for Reminder" [level=3] [ref=e301] + - paragraph [ref=e302]: This note will have a reminder + - generic [ref=e303]: il y a 27 minutes + - generic [ref=e304]: + - button "Pin" [ref=e305]: + - img + - button "Change color" [ref=e306]: + - img + - button [ref=e307]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e308]: + - generic [ref=e309]: + - heading "Test Note for Reminder" [level=3] [ref=e310] + - paragraph [ref=e311]: This note will have a reminder + - generic [ref=e312]: il y a 27 minutes + - generic [ref=e313]: + - button "Pin" [ref=e314]: + - img + - button "Change color" [ref=e315]: + - img + - button [ref=e316]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e317]: + - generic [ref=e318]: + - heading "Test Note for Reminder" [level=3] [ref=e319] + - paragraph [ref=e320]: This note will have a reminder + - generic [ref=e321]: il y a 27 minutes + - generic [ref=e322]: + - button "Pin" [ref=e323]: + - img + - button "Change color" [ref=e324]: + - img + - button [ref=e325]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 27 minutes" [ref=e326]: + - generic [ref=e327]: + - img [ref=e328] + - heading "Test Note for Reminder" [level=3] [ref=e331] + - paragraph [ref=e332]: This note will have a reminder + - generic [ref=e333]: il y a 27 minutes + - generic [ref=e334]: + - button "Pin" [ref=e335]: + - img + - button "Change color" [ref=e336]: + - img + - button [ref=e337]: + - img + - button "test sample file il y a environ 5 heures" [ref=e338]: + - generic [ref=e339]: + - heading "test" [level=3] [ref=e340] + - paragraph [ref=e342]: sample file + - generic [ref=e343]: il y a environ 5 heures + - generic [ref=e344]: + - button "Pin" [ref=e345]: + - img + - button "Change color" [ref=e346]: + - img + - button [ref=e347]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e348]': + - generic [ref=e349]: + - heading "New AI Framework Released" [level=3] [ref=e350] + - paragraph [ref=e351]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech" + - generic [ref=e352]: + - generic [ref=e353]: tech + - generic [ref=e354]: ai + - generic [ref=e355]: framework + - generic [ref=e356]: mlops + - generic [ref=e357]: gpu + - generic [ref=e358]: il y a environ 5 heures + - generic [ref=e359]: + - button "Pin" [ref=e360]: + - img + - button "Change color" [ref=e361]: + - img + - button [ref=e362]: + - img + - button "Test Image API Note avec image il y a environ 8 heures" [ref=e363]: + - generic [ref=e364]: + - heading "Test Image API" [level=3] [ref=e365] + - paragraph [ref=e367]: Note avec image + - generic [ref=e368]: il y a environ 8 heures + - generic [ref=e369]: + - button "Pin" [ref=e370]: + - img + - button "Change color" [ref=e371]: + - img + - button [ref=e372]: + - img + - button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e373]: + - generic [ref=e374]: + - heading "Test Markdown" [level=3] [ref=e375] + - generic [ref=e377]: + - heading "Titre Modifié" [level=1] [ref=e378] + - heading "Sous-titre édité" [level=2] [ref=e379] + - list [ref=e380]: + - listitem [ref=e381]: Liste modifiée 1 + - listitem [ref=e382]: Liste modifiée 2 + - listitem [ref=e383]: Nouvelle liste 3 + - paragraph [ref=e384]: + - strong [ref=e385]: Texte gras modifié + - text: et + - emphasis [ref=e386]: italique édité + - code [ref=e388]: console.log("Code modifié avec succès!") + - generic [ref=e389]: il y a environ 5 heures + - generic [ref=e390]: + - button "Pin" [ref=e391]: + - img + - button "Change color" [ref=e392]: + - img + - button [ref=e393]: + - img + - button "Test Image Avec image il y a environ 8 heures" [ref=e394]: + - generic [ref=e395]: + - heading "Test Image" [level=3] [ref=e396] + - paragraph [ref=e397]: Avec image + - generic [ref=e398]: il y a environ 8 heures + - generic [ref=e399]: + - button "Pin" [ref=e400]: + - img + - button "Change color" [ref=e401]: + - img + - button [ref=e402]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e403]': + - generic [ref=e404]: + - heading "New AI Framework Released" [level=3] [ref=e405] + - paragraph [ref=e406]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu" + - generic [ref=e407]: + - generic [ref=e408]: tech + - generic [ref=e409]: ai + - generic [ref=e410]: framework + - generic [ref=e411]: mlops + - generic [ref=e412]: gpu + - generic [ref=e413]: il y a environ 6 heures + - generic [ref=e414]: + - button "Pin" [ref=e415]: + - img + - button "Change color" [ref=e416]: + - img + - button [ref=e417]: + - img + - button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e418]: + - generic [ref=e419]: + - img [ref=e420] + - heading "Test Note" [level=3] [ref=e423] + - paragraph [ref=e424]: This is my first note to test the Google Keep clone! + - generic [ref=e425]: il y a environ 10 heures + - generic [ref=e426]: + - button "Pin" [ref=e427]: + - img + - button "Change color" [ref=e428]: + - img + - button [ref=e429]: + - img + - button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e430]: + - generic [ref=e431]: + - heading "Titre Modifié" [level=3] [ref=e432] + - paragraph [ref=e433]: Contenu modifié avec succès! + - generic [ref=e434]: il y a environ 5 heures + - generic [ref=e435]: + - button "Pin" [ref=e436]: + - img + - button "Change color" [ref=e437]: + - img + - button [ref=e438]: + - img + - status [ref=e439] + - button "Open Next.js Dev Tools" [ref=e445] [cursor=pointer]: + - img [ref=e446] + - alert [ref=e449] +``` \ No newline at end of file diff --git a/keep-notes/test-results/drag-drop-Note-Grid---Drag-d0db0-hen-dropped-on-another-note-chromium/error-context.md b/keep-notes/test-results/drag-drop-Note-Grid---Drag-d0db0-hen-dropped-on-another-note-chromium/error-context.md new file mode 100644 index 0000000..edd0ac2 --- /dev/null +++ b/keep-notes/test-results/drag-drop-Note-Grid---Drag-d0db0-hen-dropped-on-another-note-chromium/error-context.md @@ -0,0 +1,478 @@ +# Page snapshot + +```yaml +- generic [active] [ref=e1]: + - banner [ref=e2]: + - generic [ref=e3]: + - link "Memento" [ref=e4] [cursor=pointer]: + - /url: / + - img [ref=e5] + - generic [ref=e8]: Memento + - generic [ref=e10]: + - img [ref=e11] + - textbox "Search notes..." [ref=e14] + - button [ref=e15]: + - img + - navigation [ref=e16]: + - link "Notes" [ref=e17] [cursor=pointer]: + - /url: / + - img [ref=e18] + - text: Notes + - link "Archive" [ref=e21] [cursor=pointer]: + - /url: /archive + - img [ref=e22] + - text: Archive + - main [ref=e25]: + - generic [ref=e27]: + - textbox "Take a note..." [ref=e28] + - button "New checklist" [ref=e29]: + - img + - generic [ref=e30]: + - generic [ref=e31]: + - heading "Pinned" [level=2] [ref=e32] + - button "Updated Note avec image il y a environ 8 heures" [ref=e34]: + - generic [ref=e35]: + - img [ref=e36] + - heading "Updated" [level=3] [ref=e38] + - paragraph [ref=e39]: Note avec image + - generic [ref=e40]: il y a environ 8 heures + - generic [ref=e41]: + - button "Unpin" [ref=e42]: + - img + - button "Change color" [ref=e43]: + - img + - button [ref=e44]: + - img + - generic [ref=e45]: + - heading "Others" [level=2] [ref=e46] + - generic [ref=e47]: + - button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a moins d’une minute" [ref=e48]: + - generic [ref=e49]: + - heading "test-1767557334587-Note 4" [level=3] [ref=e50] + - paragraph [ref=e51]: test-1767557334587-Content 4 + - generic [ref=e52]: il y a moins d’une minute + - generic [ref=e53]: + - button "Pin" [ref=e54]: + - img + - button "Change color" [ref=e55]: + - img + - button [ref=e56]: + - img + - button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a moins d’une minute" [ref=e57]: + - generic [ref=e58]: + - heading "test-1767557334587-Note 3" [level=3] [ref=e59] + - paragraph [ref=e60]: test-1767557334587-Content 3 + - generic [ref=e61]: il y a moins d’une minute + - generic [ref=e62]: + - button "Pin" [ref=e63]: + - img + - button "Change color" [ref=e64]: + - img + - button [ref=e65]: + - img + - button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a moins d’une minute" [ref=e66]: + - generic [ref=e67]: + - heading "test-1767557334587-Note 2" [level=3] [ref=e68] + - paragraph [ref=e69]: test-1767557334587-Content 2 + - generic [ref=e70]: il y a moins d’une minute + - generic [ref=e71]: + - button "Pin" [ref=e72]: + - img + - button "Change color" [ref=e73]: + - img + - button [ref=e74]: + - img + - button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a moins d’une minute" [ref=e75]: + - generic [ref=e76]: + - heading "test-1767557334587-Note 1" [level=3] [ref=e77] + - paragraph [ref=e78]: test-1767557334587-Content 1 + - generic [ref=e79]: il y a moins d’une minute + - generic [ref=e80]: + - button "Pin" [ref=e81]: + - img + - button "Change color" [ref=e82]: + - img + - button [ref=e83]: + - img + - button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a moins d’une minute" [ref=e84]: + - generic [ref=e85]: + - heading "test-1767557330820-Note 4" [level=3] [ref=e86] + - paragraph [ref=e87]: test-1767557330820-Content 4 + - generic [ref=e88]: il y a moins d’une minute + - generic [ref=e89]: + - button "Pin" [ref=e90]: + - img + - button "Change color" [ref=e91]: + - img + - button [ref=e92]: + - img + - button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a moins d’une minute" [ref=e93]: + - generic [ref=e94]: + - heading "test-1767557330820-Note 3" [level=3] [ref=e95] + - paragraph [ref=e96]: test-1767557330820-Content 3 + - generic [ref=e97]: il y a moins d’une minute + - generic [ref=e98]: + - button "Pin" [ref=e99]: + - img + - button "Change color" [ref=e100]: + - img + - button [ref=e101]: + - img + - button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a moins d’une minute" [ref=e102]: + - generic [ref=e103]: + - heading "test-1767557330820-Note 2" [level=3] [ref=e104] + - paragraph [ref=e105]: test-1767557330820-Content 2 + - generic [ref=e106]: il y a moins d’une minute + - generic [ref=e107]: + - button "Pin" [ref=e108]: + - img + - button "Change color" [ref=e109]: + - img + - button [ref=e110]: + - img + - button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a moins d’une minute" [ref=e111]: + - generic [ref=e112]: + - heading "test-1767557330820-Note 1" [level=3] [ref=e113] + - paragraph [ref=e114]: test-1767557330820-Content 1 + - generic [ref=e115]: il y a moins d’une minute + - generic [ref=e116]: + - button "Pin" [ref=e117]: + - img + - button "Change color" [ref=e118]: + - img + - button [ref=e119]: + - img + - button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a moins d’une minute" [ref=e120]: + - generic [ref=e121]: + - heading "test-1767557327567-Note 4" [level=3] [ref=e122] + - paragraph [ref=e123]: test-1767557327567-Content 4 + - generic [ref=e124]: il y a moins d’une minute + - generic [ref=e125]: + - button "Pin" [ref=e126]: + - img + - button "Change color" [ref=e127]: + - img + - button [ref=e128]: + - img + - button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a moins d’une minute" [ref=e129]: + - generic [ref=e130]: + - heading "test-1767557327567-Note 3" [level=3] [ref=e131] + - paragraph [ref=e132]: test-1767557327567-Content 3 + - generic [ref=e133]: il y a moins d’une minute + - generic [ref=e134]: + - button "Pin" [ref=e135]: + - img + - button "Change color" [ref=e136]: + - img + - button [ref=e137]: + - img + - button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a moins d’une minute" [ref=e138]: + - generic [ref=e139]: + - heading "test-1767557327567-Note 2" [level=3] [ref=e140] + - paragraph [ref=e141]: test-1767557327567-Content 2 + - generic [ref=e142]: il y a moins d’une minute + - generic [ref=e143]: + - button "Pin" [ref=e144]: + - img + - button "Change color" [ref=e145]: + - img + - button [ref=e146]: + - img + - button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a moins d’une minute" [ref=e147]: + - generic [ref=e148]: + - heading "test-1767557327567-Note 1" [level=3] [ref=e149] + - paragraph [ref=e150]: test-1767557327567-Content 1 + - generic [ref=e151]: il y a moins d’une minute + - generic [ref=e152]: + - button "Pin" [ref=e153]: + - img + - button "Change color" [ref=e154]: + - img + - button [ref=e155]: + - img + - button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a moins d’une minute" [ref=e156]: + - generic [ref=e157]: + - heading "test-1767557324248-Note 4" [level=3] [ref=e158] + - paragraph [ref=e159]: test-1767557324248-Content 4 + - generic [ref=e160]: il y a moins d’une minute + - generic [ref=e161]: + - button "Pin" [ref=e162]: + - img + - button "Change color" [ref=e163]: + - img + - button [ref=e164]: + - img + - button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a moins d’une minute" [ref=e165]: + - generic [ref=e166]: + - heading "test-1767557324248-Note 3" [level=3] [ref=e167] + - paragraph [ref=e168]: test-1767557324248-Content 3 + - generic [ref=e169]: il y a moins d’une minute + - generic [ref=e170]: + - button "Pin" [ref=e171]: + - img + - button "Change color" [ref=e172]: + - img + - button [ref=e173]: + - img + - button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a moins d’une minute" [ref=e174]: + - generic [ref=e175]: + - heading "test-1767557324248-Note 2" [level=3] [ref=e176] + - paragraph [ref=e177]: test-1767557324248-Content 2 + - generic [ref=e178]: il y a moins d’une minute + - generic [ref=e179]: + - button "Pin" [ref=e180]: + - img + - button "Change color" [ref=e181]: + - img + - button [ref=e182]: + - img + - button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a moins d’une minute" [ref=e183]: + - generic [ref=e184]: + - heading "test-1767557324248-Note 1" [level=3] [ref=e185] + - paragraph [ref=e186]: test-1767557324248-Content 1 + - generic [ref=e187]: il y a moins d’une minute + - generic [ref=e188]: + - button "Pin" [ref=e189]: + - img + - button "Change color" [ref=e190]: + - img + - button [ref=e191]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e192]: + - generic [ref=e193]: + - heading "Test Note for Reminder" [level=3] [ref=e194] + - paragraph [ref=e195]: This note will have a reminder + - generic [ref=e196]: il y a 26 minutes + - generic [ref=e197]: + - button "Pin" [ref=e198]: + - img + - button "Change color" [ref=e199]: + - img + - button [ref=e200]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e201]: + - generic [ref=e202]: + - heading "Test Note for Reminder" [level=3] [ref=e203] + - paragraph [ref=e204]: This note will have a reminder + - generic [ref=e205]: il y a 26 minutes + - generic [ref=e206]: + - button "Pin" [ref=e207]: + - img + - button "Change color" [ref=e208]: + - img + - button [ref=e209]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e210]: + - generic [ref=e211]: + - heading "Test Note for Reminder" [level=3] [ref=e212] + - paragraph [ref=e213]: This note will have a reminder + - generic [ref=e214]: il y a 26 minutes + - generic [ref=e215]: + - button "Pin" [ref=e216]: + - img + - button "Change color" [ref=e217]: + - img + - button [ref=e218]: + - img + - button "Test note il y a 26 minutes" [ref=e219]: + - generic [ref=e220]: + - paragraph [ref=e221]: Test note + - generic [ref=e222]: il y a 26 minutes + - generic [ref=e223]: + - button "Pin" [ref=e224]: + - img + - button "Change color" [ref=e225]: + - img + - button [ref=e226]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e227]: + - generic [ref=e228]: + - heading "Test Note for Reminder" [level=3] [ref=e229] + - paragraph [ref=e230]: This note will have a reminder + - generic [ref=e231]: il y a 26 minutes + - generic [ref=e232]: + - button "Pin" [ref=e233]: + - img + - button "Change color" [ref=e234]: + - img + - button [ref=e235]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e236]: + - generic [ref=e237]: + - heading "Test Note for Reminder" [level=3] [ref=e238] + - paragraph [ref=e239]: This note will have a reminder + - generic [ref=e240]: il y a 26 minutes + - generic [ref=e241]: + - button "Pin" [ref=e242]: + - img + - button "Change color" [ref=e243]: + - img + - button [ref=e244]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e245]: + - generic [ref=e246]: + - heading "Test Note for Reminder" [level=3] [ref=e247] + - paragraph [ref=e248]: This note will have a reminder + - generic [ref=e249]: il y a 26 minutes + - generic [ref=e250]: + - button "Pin" [ref=e251]: + - img + - button "Change color" [ref=e252]: + - img + - button [ref=e253]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e254]: + - generic [ref=e255]: + - img [ref=e256] + - heading "Test Note for Reminder" [level=3] [ref=e259] + - paragraph [ref=e260]: This note will have a reminder + - generic [ref=e261]: il y a 26 minutes + - generic [ref=e262]: + - button "Pin" [ref=e263]: + - img + - button "Change color" [ref=e264]: + - img + - button [ref=e265]: + - img + - button "test sample file il y a environ 5 heures" [ref=e266]: + - generic [ref=e267]: + - heading "test" [level=3] [ref=e268] + - paragraph [ref=e270]: sample file + - generic [ref=e271]: il y a environ 5 heures + - generic [ref=e272]: + - button "Pin" [ref=e273]: + - img + - button "Change color" [ref=e274]: + - img + - button [ref=e275]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e276]': + - generic [ref=e277]: + - heading "New AI Framework Released" [level=3] [ref=e278] + - paragraph [ref=e279]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech" + - generic [ref=e280]: + - generic [ref=e281]: tech + - generic [ref=e282]: ai + - generic [ref=e283]: framework + - generic [ref=e284]: mlops + - generic [ref=e285]: gpu + - generic [ref=e286]: il y a environ 5 heures + - generic [ref=e287]: + - button "Pin" [ref=e288]: + - img + - button "Change color" [ref=e289]: + - img + - button [ref=e290]: + - img + - button "Test Image API Note avec image il y a environ 8 heures" [ref=e291]: + - generic [ref=e292]: + - heading "Test Image API" [level=3] [ref=e293] + - paragraph [ref=e295]: Note avec image + - generic [ref=e296]: il y a environ 8 heures + - generic [ref=e297]: + - button "Pin" [ref=e298]: + - img + - button "Change color" [ref=e299]: + - img + - button [ref=e300]: + - img + - button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e301]: + - generic [ref=e302]: + - heading "Test Markdown" [level=3] [ref=e303] + - generic [ref=e305]: + - heading "Titre Modifié" [level=1] [ref=e306] + - heading "Sous-titre édité" [level=2] [ref=e307] + - list [ref=e308]: + - listitem [ref=e309]: Liste modifiée 1 + - listitem [ref=e310]: Liste modifiée 2 + - listitem [ref=e311]: Nouvelle liste 3 + - paragraph [ref=e312]: + - strong [ref=e313]: Texte gras modifié + - text: et + - emphasis [ref=e314]: italique édité + - code [ref=e316]: console.log("Code modifié avec succès!") + - generic [ref=e317]: il y a environ 5 heures + - generic [ref=e318]: + - button "Pin" [ref=e319]: + - img + - button "Change color" [ref=e320]: + - img + - button [ref=e321]: + - img + - button "Test Image Avec image il y a environ 8 heures" [ref=e322]: + - generic [ref=e323]: + - heading "Test Image" [level=3] [ref=e324] + - paragraph [ref=e325]: Avec image + - generic [ref=e326]: il y a environ 8 heures + - generic [ref=e327]: + - button "Pin" [ref=e328]: + - img + - button "Change color" [ref=e329]: + - img + - button [ref=e330]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e331]': + - generic [ref=e332]: + - heading "New AI Framework Released" [level=3] [ref=e333] + - paragraph [ref=e334]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu" + - generic [ref=e335]: + - generic [ref=e336]: tech + - generic [ref=e337]: ai + - generic [ref=e338]: framework + - generic [ref=e339]: mlops + - generic [ref=e340]: gpu + - generic [ref=e341]: il y a environ 6 heures + - generic [ref=e342]: + - button "Pin" [ref=e343]: + - img + - button "Change color" [ref=e344]: + - img + - button [ref=e345]: + - img + - button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e346]: + - generic [ref=e347]: + - img [ref=e348] + - heading "Test Note" [level=3] [ref=e351] + - paragraph [ref=e352]: This is my first note to test the Google Keep clone! + - generic [ref=e353]: il y a environ 10 heures + - generic [ref=e354]: + - button "Pin" [ref=e355]: + - img + - button "Change color" [ref=e356]: + - img + - button [ref=e357]: + - img + - button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e358]: + - generic [ref=e359]: + - heading "Titre Modifié" [level=3] [ref=e360] + - paragraph [ref=e361]: Contenu modifié avec succès! + - generic [ref=e362]: il y a environ 5 heures + - generic [ref=e363]: + - button "Pin" [ref=e364]: + - img + - button "Change color" [ref=e365]: + - img + - button [ref=e366]: + - img + - status [ref=e367] + - generic [ref=e368]: + - generic [ref=e369]: + - generic [ref=e370]: Note created successfully + - button [ref=e371]: + - img [ref=e372] + - generic [ref=e375]: + - generic [ref=e376]: Note created successfully + - button [ref=e377]: + - img [ref=e378] + - generic [ref=e381]: + - generic [ref=e382]: Note created successfully + - button [ref=e383]: + - img [ref=e384] + - generic [ref=e387]: + - generic [ref=e388]: Note created successfully + - button [ref=e389]: + - img [ref=e390] + - button "Open Next.js Dev Tools" [ref=e398] [cursor=pointer]: + - img [ref=e399] + - alert [ref=e402] +``` \ No newline at end of file diff --git a/keep-notes/test-results/drag-drop-Note-Grid---Drag-d7a40-d-unpinned-notes-separately-chromium/error-context.md b/keep-notes/test-results/drag-drop-Note-Grid---Drag-d7a40-d-unpinned-notes-separately-chromium/error-context.md new file mode 100644 index 0000000..edffeaf --- /dev/null +++ b/keep-notes/test-results/drag-drop-Note-Grid---Drag-d7a40-d-unpinned-notes-separately-chromium/error-context.md @@ -0,0 +1,509 @@ +# Page snapshot + +```yaml +- generic [active] [ref=e1]: + - banner [ref=e2]: + - generic [ref=e3]: + - link "Memento" [ref=e4] [cursor=pointer]: + - /url: / + - img [ref=e5] + - generic [ref=e8]: Memento + - generic [ref=e10]: + - img [ref=e11] + - textbox "Search notes..." [ref=e14] + - button [ref=e15]: + - img + - navigation [ref=e16]: + - link "Notes" [ref=e17] [cursor=pointer]: + - /url: / + - img [ref=e18] + - text: Notes + - link "Archive" [ref=e21] [cursor=pointer]: + - /url: /archive + - img [ref=e22] + - text: Archive + - main [ref=e25]: + - generic [ref=e27]: + - textbox "Take a note..." [ref=e28] + - button "New checklist" [ref=e29]: + - img + - generic [ref=e30]: + - generic [ref=e31]: + - heading "Pinned" [level=2] [ref=e32] + - button "Updated Note avec image il y a environ 8 heures" [ref=e34]: + - generic [ref=e35]: + - img [ref=e36] + - heading "Updated" [level=3] [ref=e38] + - paragraph [ref=e39]: Note avec image + - generic [ref=e40]: il y a environ 8 heures + - generic [ref=e41]: + - button "Unpin" [ref=e42]: + - img + - button "Change color" [ref=e43]: + - img + - button [ref=e44]: + - img + - generic [ref=e45]: + - heading "Others" [level=2] [ref=e46] + - generic [ref=e47]: + - button "test-1767557339218-Note 4 test-1767557339218-Content 4 il y a moins d’une minute" [ref=e48]: + - generic [ref=e49]: + - heading "test-1767557339218-Note 4" [level=3] [ref=e50] + - paragraph [ref=e51]: test-1767557339218-Content 4 + - generic [ref=e52]: il y a moins d’une minute + - generic [ref=e53]: + - button "Pin" [ref=e54]: + - img + - button "Change color" [ref=e55]: + - img + - button [ref=e56]: + - img + - button "test-1767557339218-Note 3 test-1767557339218-Content 3 il y a moins d’une minute" [ref=e57]: + - generic [ref=e58]: + - heading "test-1767557339218-Note 3" [level=3] [ref=e59] + - paragraph [ref=e60]: test-1767557339218-Content 3 + - generic [ref=e61]: il y a moins d’une minute + - generic [ref=e62]: + - button "Pin" [ref=e63]: + - img + - button "Change color" [ref=e64]: + - img + - button [ref=e65]: + - img + - button "test-1767557339218-Note 2 test-1767557339218-Content 2 il y a moins d’une minute" [ref=e66]: + - generic [ref=e67]: + - heading "test-1767557339218-Note 2" [level=3] [ref=e68] + - paragraph [ref=e69]: test-1767557339218-Content 2 + - generic [ref=e70]: il y a moins d’une minute + - generic [ref=e71]: + - button "Pin" [ref=e72]: + - img + - button "Change color" [ref=e73]: + - img + - button [ref=e74]: + - img + - button "test-1767557339218-Note 1 test-1767557339218-Content 1 il y a moins d’une minute" [ref=e75]: + - generic [ref=e76]: + - heading "test-1767557339218-Note 1" [level=3] [ref=e77] + - paragraph [ref=e78]: test-1767557339218-Content 1 + - generic [ref=e79]: il y a moins d’une minute + - generic [ref=e80]: + - button "Pin" [ref=e81]: + - img + - button "Change color" [ref=e82]: + - img + - button [ref=e83]: + - img + - button "test-1767557334587-Note 4 test-1767557334587-Content 4 il y a moins d’une minute" [ref=e84]: + - generic [ref=e85]: + - heading "test-1767557334587-Note 4" [level=3] [ref=e86] + - paragraph [ref=e87]: test-1767557334587-Content 4 + - generic [ref=e88]: il y a moins d’une minute + - generic [ref=e89]: + - button "Pin" [ref=e90]: + - img + - button "Change color" [ref=e91]: + - img + - button [ref=e92]: + - img + - button "test-1767557334587-Note 3 test-1767557334587-Content 3 il y a moins d’une minute" [ref=e93]: + - generic [ref=e94]: + - heading "test-1767557334587-Note 3" [level=3] [ref=e95] + - paragraph [ref=e96]: test-1767557334587-Content 3 + - generic [ref=e97]: il y a moins d’une minute + - generic [ref=e98]: + - button "Pin" [ref=e99]: + - img + - button "Change color" [ref=e100]: + - img + - button [ref=e101]: + - img + - button "test-1767557334587-Note 2 test-1767557334587-Content 2 il y a moins d’une minute" [ref=e102]: + - generic [ref=e103]: + - heading "test-1767557334587-Note 2" [level=3] [ref=e104] + - paragraph [ref=e105]: test-1767557334587-Content 2 + - generic [ref=e106]: il y a moins d’une minute + - generic [ref=e107]: + - button "Pin" [ref=e108]: + - img + - button "Change color" [ref=e109]: + - img + - button [ref=e110]: + - img + - button "test-1767557334587-Note 1 test-1767557334587-Content 1 il y a moins d’une minute" [ref=e111]: + - generic [ref=e112]: + - heading "test-1767557334587-Note 1" [level=3] [ref=e113] + - paragraph [ref=e114]: test-1767557334587-Content 1 + - generic [ref=e115]: il y a moins d’une minute + - generic [ref=e116]: + - button "Pin" [ref=e117]: + - img + - button "Change color" [ref=e118]: + - img + - button [ref=e119]: + - img + - button "test-1767557330820-Note 4 test-1767557330820-Content 4 il y a moins d’une minute" [ref=e120]: + - generic [ref=e121]: + - heading "test-1767557330820-Note 4" [level=3] [ref=e122] + - paragraph [ref=e123]: test-1767557330820-Content 4 + - generic [ref=e124]: il y a moins d’une minute + - generic [ref=e125]: + - button "Pin" [ref=e126]: + - img + - button "Change color" [ref=e127]: + - img + - button [ref=e128]: + - img + - button "test-1767557330820-Note 3 test-1767557330820-Content 3 il y a moins d’une minute" [ref=e129]: + - generic [ref=e130]: + - heading "test-1767557330820-Note 3" [level=3] [ref=e131] + - paragraph [ref=e132]: test-1767557330820-Content 3 + - generic [ref=e133]: il y a moins d’une minute + - generic [ref=e134]: + - button "Pin" [ref=e135]: + - img + - button "Change color" [ref=e136]: + - img + - button [ref=e137]: + - img + - button "test-1767557330820-Note 2 test-1767557330820-Content 2 il y a moins d’une minute" [ref=e138]: + - generic [ref=e139]: + - heading "test-1767557330820-Note 2" [level=3] [ref=e140] + - paragraph [ref=e141]: test-1767557330820-Content 2 + - generic [ref=e142]: il y a moins d’une minute + - generic [ref=e143]: + - button "Pin" [ref=e144]: + - img + - button "Change color" [ref=e145]: + - img + - button [ref=e146]: + - img + - button "test-1767557330820-Note 1 test-1767557330820-Content 1 il y a moins d’une minute" [ref=e147]: + - generic [ref=e148]: + - heading "test-1767557330820-Note 1" [level=3] [ref=e149] + - paragraph [ref=e150]: test-1767557330820-Content 1 + - generic [ref=e151]: il y a moins d’une minute + - generic [ref=e152]: + - button "Pin" [ref=e153]: + - img + - button "Change color" [ref=e154]: + - img + - button [ref=e155]: + - img + - button "test-1767557327567-Note 4 test-1767557327567-Content 4 il y a moins d’une minute" [ref=e156]: + - generic [ref=e157]: + - heading "test-1767557327567-Note 4" [level=3] [ref=e158] + - paragraph [ref=e159]: test-1767557327567-Content 4 + - generic [ref=e160]: il y a moins d’une minute + - generic [ref=e161]: + - button "Pin" [ref=e162]: + - img + - button "Change color" [ref=e163]: + - img + - button [ref=e164]: + - img + - button "test-1767557327567-Note 3 test-1767557327567-Content 3 il y a moins d’une minute" [ref=e165]: + - generic [ref=e166]: + - heading "test-1767557327567-Note 3" [level=3] [ref=e167] + - paragraph [ref=e168]: test-1767557327567-Content 3 + - generic [ref=e169]: il y a moins d’une minute + - generic [ref=e170]: + - button "Pin" [ref=e171]: + - img + - button "Change color" [ref=e172]: + - img + - button [ref=e173]: + - img + - button "test-1767557327567-Note 2 test-1767557327567-Content 2 il y a moins d’une minute" [ref=e174]: + - generic [ref=e175]: + - heading "test-1767557327567-Note 2" [level=3] [ref=e176] + - paragraph [ref=e177]: test-1767557327567-Content 2 + - generic [ref=e178]: il y a moins d’une minute + - generic [ref=e179]: + - button "Pin" [ref=e180]: + - img + - button "Change color" [ref=e181]: + - img + - button [ref=e182]: + - img + - button "test-1767557327567-Note 1 test-1767557327567-Content 1 il y a moins d’une minute" [ref=e183]: + - generic [ref=e184]: + - heading "test-1767557327567-Note 1" [level=3] [ref=e185] + - paragraph [ref=e186]: test-1767557327567-Content 1 + - generic [ref=e187]: il y a moins d’une minute + - generic [ref=e188]: + - button "Pin" [ref=e189]: + - img + - button "Change color" [ref=e190]: + - img + - button [ref=e191]: + - img + - button "test-1767557324248-Note 4 test-1767557324248-Content 4 il y a moins d’une minute" [ref=e192]: + - generic [ref=e193]: + - heading "test-1767557324248-Note 4" [level=3] [ref=e194] + - paragraph [ref=e195]: test-1767557324248-Content 4 + - generic [ref=e196]: il y a moins d’une minute + - generic [ref=e197]: + - button "Pin" [ref=e198]: + - img + - button "Change color" [ref=e199]: + - img + - button [ref=e200]: + - img + - button "test-1767557324248-Note 3 test-1767557324248-Content 3 il y a moins d’une minute" [ref=e201]: + - generic [ref=e202]: + - heading "test-1767557324248-Note 3" [level=3] [ref=e203] + - paragraph [ref=e204]: test-1767557324248-Content 3 + - generic [ref=e205]: il y a moins d’une minute + - generic [ref=e206]: + - button "Pin" [ref=e207]: + - img + - button "Change color" [ref=e208]: + - img + - button [ref=e209]: + - img + - button "test-1767557324248-Note 2 test-1767557324248-Content 2 il y a moins d’une minute" [ref=e210]: + - generic [ref=e211]: + - heading "test-1767557324248-Note 2" [level=3] [ref=e212] + - paragraph [ref=e213]: test-1767557324248-Content 2 + - generic [ref=e214]: il y a moins d’une minute + - generic [ref=e215]: + - button "Pin" [ref=e216]: + - img + - button "Change color" [ref=e217]: + - img + - button [ref=e218]: + - img + - button "test-1767557324248-Note 1 test-1767557324248-Content 1 il y a moins d’une minute" [ref=e219]: + - generic [ref=e220]: + - heading "test-1767557324248-Note 1" [level=3] [ref=e221] + - paragraph [ref=e222]: test-1767557324248-Content 1 + - generic [ref=e223]: il y a moins d’une minute + - generic [ref=e224]: + - button "Pin" [ref=e225]: + - img + - button "Change color" [ref=e226]: + - img + - button [ref=e227]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e228]: + - generic [ref=e229]: + - heading "Test Note for Reminder" [level=3] [ref=e230] + - paragraph [ref=e231]: This note will have a reminder + - generic [ref=e232]: il y a 26 minutes + - generic [ref=e233]: + - button "Pin" [ref=e234]: + - img + - button "Change color" [ref=e235]: + - img + - button [ref=e236]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e237]: + - generic [ref=e238]: + - heading "Test Note for Reminder" [level=3] [ref=e239] + - paragraph [ref=e240]: This note will have a reminder + - generic [ref=e241]: il y a 26 minutes + - generic [ref=e242]: + - button "Pin" [ref=e243]: + - img + - button "Change color" [ref=e244]: + - img + - button [ref=e245]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e246]: + - generic [ref=e247]: + - heading "Test Note for Reminder" [level=3] [ref=e248] + - paragraph [ref=e249]: This note will have a reminder + - generic [ref=e250]: il y a 26 minutes + - generic [ref=e251]: + - button "Pin" [ref=e252]: + - img + - button "Change color" [ref=e253]: + - img + - button [ref=e254]: + - img + - button "Test note il y a 26 minutes" [ref=e255]: + - generic [ref=e256]: + - paragraph [ref=e257]: Test note + - generic [ref=e258]: il y a 26 minutes + - generic [ref=e259]: + - button "Pin" [ref=e260]: + - img + - button "Change color" [ref=e261]: + - img + - button [ref=e262]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e263]: + - generic [ref=e264]: + - heading "Test Note for Reminder" [level=3] [ref=e265] + - paragraph [ref=e266]: This note will have a reminder + - generic [ref=e267]: il y a 26 minutes + - generic [ref=e268]: + - button "Pin" [ref=e269]: + - img + - button "Change color" [ref=e270]: + - img + - button [ref=e271]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e272]: + - generic [ref=e273]: + - heading "Test Note for Reminder" [level=3] [ref=e274] + - paragraph [ref=e275]: This note will have a reminder + - generic [ref=e276]: il y a 26 minutes + - generic [ref=e277]: + - button "Pin" [ref=e278]: + - img + - button "Change color" [ref=e279]: + - img + - button [ref=e280]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e281]: + - generic [ref=e282]: + - heading "Test Note for Reminder" [level=3] [ref=e283] + - paragraph [ref=e284]: This note will have a reminder + - generic [ref=e285]: il y a 26 minutes + - generic [ref=e286]: + - button "Pin" [ref=e287]: + - img + - button "Change color" [ref=e288]: + - img + - button [ref=e289]: + - img + - button "Test Note for Reminder This note will have a reminder il y a 26 minutes" [ref=e290]: + - generic [ref=e291]: + - img [ref=e292] + - heading "Test Note for Reminder" [level=3] [ref=e295] + - paragraph [ref=e296]: This note will have a reminder + - generic [ref=e297]: il y a 26 minutes + - generic [ref=e298]: + - button "Pin" [ref=e299]: + - img + - button "Change color" [ref=e300]: + - img + - button [ref=e301]: + - img + - button "test sample file il y a environ 5 heures" [ref=e302]: + - generic [ref=e303]: + - heading "test" [level=3] [ref=e304] + - paragraph [ref=e306]: sample file + - generic [ref=e307]: il y a environ 5 heures + - generic [ref=e308]: + - button "Pin" [ref=e309]: + - img + - button "Change color" [ref=e310]: + - img + - button [ref=e311]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d''un framework pour l''IA - Optimisation de l''entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l''inférence en temps réel Tags: framework, mlops, gpu, ai, tech tech ai framework mlops gpu il y a environ 5 heures" [ref=e312]': + - generic [ref=e313]: + - heading "New AI Framework Released" [level=3] [ref=e314] + - paragraph [ref=e315]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and is engineered for performance and scalability. It includes features for simplifying model deployment and enhancing capabilities for real-time inference. Pourquoi c’est IA/DevIA: - Conception d'un framework pour l'IA - Optimisation de l'entraînement des modèles - Support pour les réseaux de neurones - Prise en charge de l'inférence en temps réel Tags: framework, mlops, gpu, ai, tech" + - generic [ref=e316]: + - generic [ref=e317]: tech + - generic [ref=e318]: ai + - generic [ref=e319]: framework + - generic [ref=e320]: mlops + - generic [ref=e321]: gpu + - generic [ref=e322]: il y a environ 5 heures + - generic [ref=e323]: + - button "Pin" [ref=e324]: + - img + - button "Change color" [ref=e325]: + - img + - button [ref=e326]: + - img + - button "Test Image API Note avec image il y a environ 8 heures" [ref=e327]: + - generic [ref=e328]: + - heading "Test Image API" [level=3] [ref=e329] + - paragraph [ref=e331]: Note avec image + - generic [ref=e332]: il y a environ 8 heures + - generic [ref=e333]: + - button "Pin" [ref=e334]: + - img + - button "Change color" [ref=e335]: + - img + - button [ref=e336]: + - img + - button "Test Markdown Titre Modifié Sous-titre édité Liste modifiée 1 Liste modifiée 2 Nouvelle liste 3 Texte gras modifié et italique édité console.log(\"Code modifié avec succès!\") il y a environ 5 heures" [ref=e337]: + - generic [ref=e338]: + - heading "Test Markdown" [level=3] [ref=e339] + - generic [ref=e341]: + - heading "Titre Modifié" [level=1] [ref=e342] + - heading "Sous-titre édité" [level=2] [ref=e343] + - list [ref=e344]: + - listitem [ref=e345]: Liste modifiée 1 + - listitem [ref=e346]: Liste modifiée 2 + - listitem [ref=e347]: Nouvelle liste 3 + - paragraph [ref=e348]: + - strong [ref=e349]: Texte gras modifié + - text: et + - emphasis [ref=e350]: italique édité + - code [ref=e352]: console.log("Code modifié avec succès!") + - generic [ref=e353]: il y a environ 5 heures + - generic [ref=e354]: + - button "Pin" [ref=e355]: + - img + - button "Change color" [ref=e356]: + - img + - button [ref=e357]: + - img + - button "Test Image Avec image il y a environ 8 heures" [ref=e358]: + - generic [ref=e359]: + - heading "Test Image" [level=3] [ref=e360] + - paragraph [ref=e361]: Avec image + - generic [ref=e362]: il y a environ 8 heures + - generic [ref=e363]: + - button "Pin" [ref=e364]: + - img + - button "Change color" [ref=e365]: + - img + - button [ref=e366]: + - img + - 'button "New AI Framework Released Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu tech ai framework mlops gpu il y a environ 6 heures" [ref=e367]': + - generic [ref=e368]: + - heading "New AI Framework Released" [level=3] [ref=e369] + - paragraph [ref=e370]: "Lien: Date: 2026-01-04 Résumé: A new AI framework designed for optimized training and deployment of machine learning models has been released. The framework supports a variety of neural networks and includes features that enhance computational efficiency and model accuracy. This release aims to simplify the integration of AI tools into existing systems, making it easier for developers to build robust AI applications. Pourquoi c’est IA/DevIA: - Optimized training methods for machine learning models. - Supports deployment across various hardware configurations. - Focus on enhancing computational efficiency and model performance. - Intended for use in real-world AI applications and development. Tags: tech, ai, framework, mlops, gpu" + - generic [ref=e371]: + - generic [ref=e372]: tech + - generic [ref=e373]: ai + - generic [ref=e374]: framework + - generic [ref=e375]: mlops + - generic [ref=e376]: gpu + - generic [ref=e377]: il y a environ 6 heures + - generic [ref=e378]: + - button "Pin" [ref=e379]: + - img + - button "Change color" [ref=e380]: + - img + - button [ref=e381]: + - img + - button "Test Note This is my first note to test the Google Keep clone! il y a environ 10 heures" [ref=e382]: + - generic [ref=e383]: + - img [ref=e384] + - heading "Test Note" [level=3] [ref=e387] + - paragraph [ref=e388]: This is my first note to test the Google Keep clone! + - generic [ref=e389]: il y a environ 10 heures + - generic [ref=e390]: + - button "Pin" [ref=e391]: + - img + - button "Change color" [ref=e392]: + - img + - button [ref=e393]: + - img + - button "Titre Modifié Contenu modifié avec succès! il y a environ 5 heures" [ref=e394]: + - generic [ref=e395]: + - heading "Titre Modifié" [level=3] [ref=e396] + - paragraph [ref=e397]: Contenu modifié avec succès! + - generic [ref=e398]: il y a environ 5 heures + - generic [ref=e399]: + - button "Pin" [ref=e400]: + - img + - button "Change color" [ref=e401]: + - img + - button [ref=e402]: + - img + - status [ref=e403] + - button "Open Next.js Dev Tools" [ref=e409] [cursor=pointer]: + - img [ref=e410] + - alert [ref=e413] +``` \ No newline at end of file diff --git a/keep-notes/tests/drag-drop.spec.ts b/keep-notes/tests/drag-drop.spec.ts index 09bd45a..e682d2a 100644 --- a/keep-notes/tests/drag-drop.spec.ts +++ b/keep-notes/tests/drag-drop.spec.ts @@ -1,42 +1,109 @@ -import { test, expect } from '@playwright/test'; +import { test, expect, request } from '@playwright/test'; test.describe('Note Grid - Drag and Drop', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/'); + test.beforeAll(async ({ request }) => { + console.log('[CLEANUP] beforeAll: Cleaning up any existing test notes...'); - // Create multiple notes for testing drag and drop - for (let i = 1; i <= 4; i++) { - await page.click('input[placeholder="Take a note..."]'); - await page.fill('input[placeholder="Title"]', `Note ${i}`); - await page.fill('textarea[placeholder="Take a note..."]', `Content ${i}`); - await page.click('button:has-text("Add")'); - await page.waitForTimeout(500); + // Clean up any existing test notes from previous runs + try { + const response = await request.get('http://localhost:3000/api/notes'); + const data = await response.json(); + + if (data.success && data.data) { + const testNotes = data.data.filter((note: any) => + note.title?.startsWith('test-') && + note.content?.startsWith('Content ') + ); + + console.log(`[CLEANUP] beforeAll: Found ${testNotes.length} test notes to delete`); + + for (const note of testNotes) { + try { + await request.delete(`http://localhost:3000/api/notes?id=${note.id}`); + console.log(`[CLEANUP] beforeAll: Deleted note ${note.id}`); + } catch (error) { + console.log(`[CLEANUP] beforeAll: Failed to delete note ${note.id}`, error); + } + } + } + } catch (error) { + console.log('[CLEANUP] beforeAll: Error fetching notes for cleanup', error); } }); - test('should have draggable notes', async ({ page }) => { - // Wait for notes to appear - await page.waitForSelector('text=Note 1'); + test.beforeEach(async ({ page }) => { + // Generate unique timestamp for this test run to avoid conflicts + const timestamp = Date.now(); + const testId = `test-${timestamp}`; - // Check that notes have draggable attribute - const noteCards = page.locator('[draggable="true"]'); + await page.goto('/'); + + // Wait for page to fully load + await page.waitForLoadState('networkidle'); + + // Log initial note count before creating new notes + const initialNotes = page.locator('[data-draggable="true"]'); + const initialCount = await initialNotes.count(); + console.log(`[DEBUG] [${testId}] Initial note count: ${initialCount}`); + + // Create multiple notes for testing drag and drop with unique identifiers + for (let i = 1; i <= 4; i++) { + const noteTitle = `${testId}-Note ${i}`; + const noteContent = `${testId}-Content ${i}`; + + console.log(`[DEBUG] [${testId}] Creating ${noteTitle}`); + await page.click('input[placeholder="Take a note..."]'); + await page.fill('input[placeholder="Title"]', noteTitle); + await page.fill('textarea[placeholder="Take a note..."]', noteContent); + await page.click('button:has-text("Add")'); + await page.waitForTimeout(500); + + // Log note count after each creation + const currentCount = await page.locator('[data-draggable="true"]').count(); + console.log(`[DEBUG] [${testId}] Note count after creating ${noteTitle}: ${currentCount}`); + } + + // Log final note count + const finalCount = await page.locator('[data-draggable="true"]').count(); + console.log(`[DEBUG] [${testId}] Final note count after all creations: ${finalCount}`); + }); + + test('should have draggable notes', async ({ page }) => { + console.log('[DEBUG] Test: should have draggable notes'); + + // Wait for notes to appear (use a more flexible selector that matches pattern) + await page.waitForSelector('[data-draggable="true"]'); + + // Check that notes have data-draggable attribute (dnd-kit uses this) + const noteCards = page.locator('[data-draggable="true"]'); const count = await noteCards.count(); + console.log(`[DEBUG] Found ${count} notes with data-draggable="true"`); + + // Log first few notes details + for (let i = 0; i < Math.min(count, 3); i++) { + const note = noteCards.nth(i); + const text = await note.textContent(); + const draggableAttr = await note.getAttribute('data-draggable'); + console.log(`[DEBUG] Note ${i}: "${text?.substring(0, 50)}", data-draggable="${draggableAttr}"`); + } + expect(count).toBeGreaterThanOrEqual(4); }); test('should show cursor-move on note cards', async ({ page }) => { - await page.waitForSelector('text=Note 1'); + await page.waitForSelector('[data-draggable="true"]'); - // Check CSS class for cursor-move - const firstNote = page.locator('[draggable="true"]').first(); - const className = await firstNote.getAttribute('class'); + // Check CSS class for cursor-move on the note card inside + const firstNote = page.locator('[data-draggable="true"]').first(); + const noteCard = firstNote.locator('.note-card-main'); + const className = await noteCard.getAttribute('class'); expect(className).toContain('cursor-move'); }); test('should change opacity when dragging', async ({ page }) => { - await page.waitForSelector('text=Note 1'); + await page.waitForSelector('[data-draggable="true"]'); - const firstNote = page.locator('[draggable="true"]').first(); + const firstNote = page.locator('[data-draggable="true"]').first(); // Start drag const box = await firstNote.boundingBox(); @@ -44,98 +111,109 @@ test.describe('Note Grid - Drag and Drop', () => { await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); await page.mouse.down(); - // Check if opacity changed (isDragging class) - await page.waitForTimeout(100); + // Move to trigger drag + await page.mouse.move(box.x + box.width / 2 + 50, box.y + box.height / 2 + 50); + await page.waitForTimeout(200); - const className = await firstNote.getAttribute('class'); - // The dragged note should have opacity-30 class - // Note: This is tricky with Playwright, might need visual regression testing + // Check if opacity changed (style should have opacity: 0.5) + const style = await firstNote.getAttribute('style'); + expect(style).toContain('opacity'); await page.mouse.up(); } }); test('should reorder notes when dropped on another note', async ({ page }) => { - await page.waitForSelector('text=Note 1'); + console.log('[DEBUG] Test: should reorder notes when dropped on another note'); + + // Wait for notes to be fully loaded and drag-and-drop initialized + await page.waitForSelector('[data-draggable="true"]', { state: 'attached' }); + await page.waitForTimeout(500); // Extra wait for dnd-kit to initialize // Get initial order - const notes = page.locator('[draggable="true"]'); + const notes = page.locator('[data-draggable="true"]'); const firstNoteText = await notes.first().textContent(); const secondNoteText = await notes.nth(1).textContent(); - expect(firstNoteText).toContain('Note'); - expect(secondNoteText).toContain('Note'); + console.log(`[DEBUG] Initial first note: ${firstNoteText?.substring(0, 30)}`); + console.log(`[DEBUG] Initial second note: ${secondNoteText?.substring(0, 30)}`); - // Drag first note to second position + expect(firstNoteText).toMatch(/Note \d+/); + expect(secondNoteText).toMatch(/Note \d+/); + + // Use dragTo for more reliable drag and drop const firstNote = notes.first(); const secondNote = notes.nth(1); - const firstBox = await firstNote.boundingBox(); - const secondBox = await secondNote.boundingBox(); + console.log('[DEBUG] Starting drag operation...'); + await firstNote.dragTo(secondNote); + console.log('[DEBUG] Drag operation completed'); - if (firstBox && secondBox) { - await page.mouse.move(firstBox.x + firstBox.width / 2, firstBox.y + firstBox.height / 2); - await page.mouse.down(); - await page.mouse.move(secondBox.x + secondBox.width / 2, secondBox.y + secondBox.height / 2); - await page.mouse.up(); - - // Wait for reorder to complete - await page.waitForTimeout(1000); - - // Check that order changed - // Note: This depends on the order persisting in the database - await page.reload(); - await page.waitForSelector('text=Note'); - - // Verify the order changed (implementation dependent) - } + // Wait for reorder to complete and database to update + await page.waitForTimeout(2000); // Increased wait time for async operations + + // Check that order changed + // Note: This depends on order persisting in the database + console.log('[DEBUG] Reloading page to verify persistence...'); + await page.reload(); + await page.waitForSelector('[data-draggable="true"]', { state: 'attached' }); + await page.waitForTimeout(500); + + // Verify that order changed (implementation dependent) + console.log('[DEBUG] Page reloaded, checking order...'); }); test('should work with pinned and unpinned notes separately', async ({ page }) => { - await page.waitForSelector('text=Note 1'); + await page.waitForSelector('[data-draggable="true"]'); - // Pin first note - const firstNote = page.locator('text=Note 1').first(); - await firstNote.hover(); - await page.click('button[title*="Pin"]:visible').first(); + // Pin first note by hovering and clicking pin button + const firstNoteCard = page.locator('[data-draggable="true"]').first(); + await firstNoteCard.hover(); + + // Click the pin button + const pinButton = firstNoteCard.locator('button[title="Pin"]'); + await pinButton.click(); await page.waitForTimeout(500); // Check that "Pinned" section appears - await expect(page.locator('text=Pinned')).toBeVisible(); + await expect(page.locator('h2:has-text("Pinned")')).toBeVisible(); // Verify note is in pinned section - const pinnedSection = page.locator('h2:has-text("Pinned")').locator('..').locator('..'); - await expect(pinnedSection.locator('text=Note 1')).toBeVisible(); + const pinnedSection = page.locator('h2:has-text("Pinned")').locator('..').locator('div[data-draggable="true"]'); + expect(await pinnedSection.count()).toBeGreaterThanOrEqual(1); }); test('should not mix pinned and unpinned notes when dragging', async ({ page }) => { - await page.waitForSelector('text=Note 1'); + await page.waitForSelector('[data-draggable="true"]'); - // Pin first note - const firstNote = page.locator('text=Note 1').first(); - await firstNote.hover(); - await page.click('button[title*="Pin"]:visible').first(); + // Pin first note by hovering and clicking pin button + const firstNoteCard = page.locator('[data-draggable="true"]').first(); + await firstNoteCard.hover(); + + // Click the pin button + const pinButton = firstNoteCard.locator('button[title="Pin"]'); + await pinButton.click(); await page.waitForTimeout(500); // Should have both Pinned and Others sections - await expect(page.locator('text=Pinned')).toBeVisible(); - await expect(page.locator('text=Others')).toBeVisible(); + await expect(page.locator('h2:has-text("Pinned")')).toBeVisible(); + await expect(page.locator('h2:has-text("Others")')).toBeVisible(); - // Count notes in each section - const pinnedNotes = page.locator('h2:has-text("Pinned") ~ div [draggable="true"]'); - const unpinnedNotes = page.locator('h2:has-text("Others") ~ div [draggable="true"]'); + // Count notes in each section using data-draggable attribute + const pinnedNotes = page.locator('h2:has-text("Pinned") ~ div [data-draggable="true"]'); + const unpinnedNotes = page.locator('h2:has-text("Others") ~ div [data-draggable="true"]'); expect(await pinnedNotes.count()).toBeGreaterThanOrEqual(1); expect(await unpinnedNotes.count()).toBeGreaterThanOrEqual(3); }); test('should persist note order after page reload', async ({ page }) => { - await page.waitForSelector('text=Note 1'); + await page.waitForSelector('[data-draggable="true"]'); // Get initial order - const notes = page.locator('[draggable="true"]'); + const notes = page.locator('[data-draggable="true"]'); const initialOrder: string[] = []; const count = await notes.count(); @@ -146,10 +224,10 @@ test.describe('Note Grid - Drag and Drop', () => { // Reload page await page.reload(); - await page.waitForSelector('text=Note'); + await page.waitForSelector('[data-draggable="true"]'); // Get order after reload - const notesAfterReload = page.locator('[draggable="true"]'); + const notesAfterReload = page.locator('[data-draggable="true"]'); const reloadedOrder: string[] = []; const countAfterReload = await notesAfterReload.count(); @@ -162,20 +240,63 @@ test.describe('Note Grid - Drag and Drop', () => { expect(reloadedOrder.length).toBe(initialOrder.length); }); - test.afterEach(async ({ page }) => { - // Clean up created notes - const notes = page.locator('[draggable="true"]'); - const count = await notes.count(); + test.afterEach(async ({ page, request }) => { + console.log('[CLEANUP] Starting cleanup...'); - for (let i = 0; i < count; i++) { - const note = notes.first(); - await note.hover(); - await page.click('button:has(svg.lucide-more-vertical)').first(); - await page.click('text=Delete').first(); + // Clean up created notes via API - more reliable than UI interaction + try { + const response = await request.get('http://localhost:3000/api/notes'); + const data = await response.json(); - // Confirm delete - page.once('dialog', dialog => dialog.accept()); - await page.waitForTimeout(300); + if (data.success && data.data) { + const testNotes = data.data.filter((note: any) => + note.title?.startsWith('test-') && + note.content?.startsWith('Content ') + ); + + console.log(`[CLEANUP] Found ${testNotes.length} test notes to delete via API`); + + for (const note of testNotes) { + try { + await request.delete(`http://localhost:3000/api/notes?id=${note.id}`); + console.log(`[CLEANUP] Deleted note ${note.id}`); + } catch (error) { + console.log(`[CLEANUP] Failed to delete note ${note.id}`, error); + } + } + } + } catch (error) { + console.log('[CLEANUP] Error fetching notes for cleanup', error); + } + }); + + test.afterAll(async ({ request }) => { + console.log('[CLEANUP] afterAll: Final cleanup of any remaining test notes...'); + + // Final cleanup to ensure no test notes remain + try { + const response = await request.get('http://localhost:3000/api/notes'); + const data = await response.json(); + + if (data.success && data.data) { + const testNotes = data.data.filter((note: any) => + note.title?.startsWith('test-') && + note.content?.startsWith('Content ') + ); + + console.log(`[CLEANUP] afterAll: Found ${testNotes.length} remaining test notes to delete`); + + for (const note of testNotes) { + try { + await request.delete(`http://localhost:3000/api/notes?id=${note.id}`); + console.log(`[CLEANUP] afterAll: Deleted note ${note.id}`); + } catch (error) { + console.log(`[CLEANUP] afterAll: Failed to delete note ${note.id}`, error); + } + } + } + } catch (error) { + console.log('[CLEANUP] afterAll: Error fetching notes for final cleanup', error); } }); });