From 8ec419b87e9f5005825464c39d6a1f08155f43fc Mon Sep 17 00:00:00 2001 From: babayaga Date: Thu, 29 Jan 2026 17:57:27 +0100 Subject: [PATCH] ui --- packages/ui/src/App.tsx | 207 ++ packages/ui/src/EmbedApp.tsx | 117 + packages/ui/src/Logger.ts | 181 + packages/ui/src/assets/hero-image.jpg | Bin 0 -> 125311 bytes packages/ui/src/components/GlobalDragDrop.tsx | 4 +- .../ui/src/components/ImageWizard/README.md | 16 +- .../components/ImageWizard/utils/logger.ts | 4 +- packages/ui/src/components/ListLayout.tsx | 4 +- .../ui/src/components/MarkdownRenderer.tsx | 22 +- packages/ui/src/components/PageActions.tsx | 503 +++ packages/ui/src/components/PhotoGrid.tsx | 1 - .../ui/src/components/ResponsiveImage.tsx | 9 +- packages/ui/src/components/VideoCard.tsx | 8 - .../ui/src/components/hmi/GenericCanvas.tsx | 31 +- .../ui/src/components/hmi/LayoutContainer.tsx | 102 +- .../src/components/hmi/SelectionHandler.tsx | 58 + .../ui/src/components/hmi/WidgetPalette.tsx | 43 +- .../playground/PlaygroundHeader.tsx | 183 + .../components/playground/TemplateDialogs.tsx | 96 + .../ui/src/components/sidebar/MobileTOC.tsx | 48 + .../ui/src/components/sidebar/Sidebar.tsx | 20 + .../components/sidebar/TableOfContents.tsx | 108 + .../sidebar/TableOfContentsList.tsx | 145 + .../video/VideoSettingsControls.tsx | 3 +- .../ui/src/components/widgets/HtmlWidget.tsx | 267 ++ .../components/widgets/ImagePickerDialog.tsx | 13 +- .../components/widgets/MarkdownTextWidget.tsx | 4 +- .../components/widgets/PageCreationWizard.tsx | 95 + .../components/widgets/PagePickerDialog.tsx | 182 + .../widgets/WidgetPropertiesForm.tsx | 336 ++ .../widgets/WidgetPropertyPanel.tsx | 107 + .../widgets/WidgetSettingsManager.tsx | 234 +- packages/ui/src/contexts/LayoutContext.tsx | 108 +- packages/ui/src/contexts/WS_Socket.tsx | 179 + packages/ui/src/hooks/useFeedData.ts | 11 +- packages/ui/src/hooks/usePageGenerator.ts | 5 +- packages/ui/src/hooks/usePlaygroundLogic.tsx | 345 ++ packages/ui/src/hooks/useResponsiveImage.ts | 1 - packages/ui/src/hooks/useSelection.tsx | 90 + packages/ui/src/hooks/useWidgetLoader.tsx | 118 + packages/ui/src/i18n.tsx | 20 +- packages/ui/src/i18n/de.json | 458 +++ packages/ui/src/i18n/en.json | 458 +++ packages/ui/src/i18n/es.json | 458 +++ packages/ui/src/i18n/fr.json | 458 +++ packages/ui/src/i18n/image-generation.yaml | 3168 +++++++++++++++++ packages/ui/src/i18n/it.json | 458 +++ packages/ui/src/i18n/nl.json | 458 +++ packages/ui/src/index.css | 330 ++ packages/ui/src/lib/db.ts | 4 +- packages/ui/src/lib/emailExporter.ts | 129 + packages/ui/src/lib/layoutStorage.ts | 56 +- packages/ui/src/lib/layoutTemplates.ts | 100 + packages/ui/src/lib/pageTools.ts | 5 +- packages/ui/src/lib/toc.ts | 103 + packages/ui/src/lib/unifiedLayoutManager.ts | 139 +- packages/ui/src/lib/variables.ts | 75 + packages/ui/src/lib/widgetRegistry.ts | 12 +- packages/ui/src/main-embed.tsx | 13 + packages/ui/src/main.tsx | 21 + packages/ui/src/pages/NewPost.tsx | 93 + packages/ui/src/pages/PlaygroundCanvas.tsx | 247 ++ packages/ui/src/pages/Post.tsx | 4 +- .../pages/Post/renderers/CompactRenderer.tsx | 2 +- packages/ui/src/pages/UserPage.tsx | 726 ++-- packages/ui/src/player/PLAYGROUND_README.md | 151 + .../player/components/SimpleVideoPlayer.tsx | 127 + .../src/player/components/VideoActionBar.tsx | 202 ++ .../ui/src/player/components/VideoFeed.tsx | 304 ++ .../src/player/components/VideoMetadata.tsx | 215 ++ .../ui/src/player/components/VideoPlayer.tsx | 86 + packages/ui/src/player/components/index.ts | 8 + packages/ui/src/player/data/mockData.ts | 229 ++ packages/ui/src/player/hooks/index.ts | 5 + .../ui/src/player/hooks/useInfiniteScroll.ts | 204 ++ packages/ui/src/player/index.ts | 22 + packages/ui/src/player/player.md | 2639 ++++++++++++++ packages/ui/src/player/types/index.ts | 299 ++ packages/ui/src/player/utils/index.ts | 294 ++ packages/ui/src/player/utils/webvtt.ts | 248 ++ packages/ui/src/services/index.ts | 1 + packages/ui/src/services/modbusService.ts | 474 +++ packages/ui/src/services/types.ts | 12 + packages/ui/src/stream-browserify.d.ts | 6 + packages/ui/src/sw.ts | 94 + packages/ui/src/types-global.d.ts | 13 + packages/ui/src/types-server.ts | 172 + packages/ui/src/vite-env.d.ts | 1 + 88 files changed, 17070 insertions(+), 739 deletions(-) create mode 100644 packages/ui/src/App.tsx create mode 100644 packages/ui/src/EmbedApp.tsx create mode 100644 packages/ui/src/Logger.ts create mode 100644 packages/ui/src/assets/hero-image.jpg create mode 100644 packages/ui/src/components/PageActions.tsx create mode 100644 packages/ui/src/components/hmi/SelectionHandler.tsx create mode 100644 packages/ui/src/components/playground/PlaygroundHeader.tsx create mode 100644 packages/ui/src/components/playground/TemplateDialogs.tsx create mode 100644 packages/ui/src/components/sidebar/MobileTOC.tsx create mode 100644 packages/ui/src/components/sidebar/Sidebar.tsx create mode 100644 packages/ui/src/components/sidebar/TableOfContents.tsx create mode 100644 packages/ui/src/components/sidebar/TableOfContentsList.tsx create mode 100644 packages/ui/src/components/widgets/HtmlWidget.tsx create mode 100644 packages/ui/src/components/widgets/PageCreationWizard.tsx create mode 100644 packages/ui/src/components/widgets/PagePickerDialog.tsx create mode 100644 packages/ui/src/components/widgets/WidgetPropertiesForm.tsx create mode 100644 packages/ui/src/components/widgets/WidgetPropertyPanel.tsx create mode 100644 packages/ui/src/contexts/WS_Socket.tsx create mode 100644 packages/ui/src/hooks/usePlaygroundLogic.tsx create mode 100644 packages/ui/src/hooks/useSelection.tsx create mode 100644 packages/ui/src/hooks/useWidgetLoader.tsx create mode 100644 packages/ui/src/i18n/de.json create mode 100644 packages/ui/src/i18n/en.json create mode 100644 packages/ui/src/i18n/es.json create mode 100644 packages/ui/src/i18n/fr.json create mode 100644 packages/ui/src/i18n/image-generation.yaml create mode 100644 packages/ui/src/i18n/it.json create mode 100644 packages/ui/src/i18n/nl.json create mode 100644 packages/ui/src/index.css create mode 100644 packages/ui/src/lib/emailExporter.ts create mode 100644 packages/ui/src/lib/layoutTemplates.ts create mode 100644 packages/ui/src/lib/toc.ts create mode 100644 packages/ui/src/lib/variables.ts create mode 100644 packages/ui/src/main-embed.tsx create mode 100644 packages/ui/src/main.tsx create mode 100644 packages/ui/src/pages/PlaygroundCanvas.tsx create mode 100644 packages/ui/src/player/PLAYGROUND_README.md create mode 100644 packages/ui/src/player/components/SimpleVideoPlayer.tsx create mode 100644 packages/ui/src/player/components/VideoActionBar.tsx create mode 100644 packages/ui/src/player/components/VideoFeed.tsx create mode 100644 packages/ui/src/player/components/VideoMetadata.tsx create mode 100644 packages/ui/src/player/components/VideoPlayer.tsx create mode 100644 packages/ui/src/player/components/index.ts create mode 100644 packages/ui/src/player/data/mockData.ts create mode 100644 packages/ui/src/player/hooks/index.ts create mode 100644 packages/ui/src/player/hooks/useInfiniteScroll.ts create mode 100644 packages/ui/src/player/index.ts create mode 100644 packages/ui/src/player/player.md create mode 100644 packages/ui/src/player/types/index.ts create mode 100644 packages/ui/src/player/utils/index.ts create mode 100644 packages/ui/src/player/utils/webvtt.ts create mode 100644 packages/ui/src/services/index.ts create mode 100644 packages/ui/src/services/modbusService.ts create mode 100644 packages/ui/src/services/types.ts create mode 100644 packages/ui/src/stream-browserify.d.ts create mode 100644 packages/ui/src/sw.ts create mode 100644 packages/ui/src/types-global.d.ts create mode 100644 packages/ui/src/types-server.ts create mode 100644 packages/ui/src/vite-env.d.ts diff --git a/packages/ui/src/App.tsx b/packages/ui/src/App.tsx new file mode 100644 index 00000000..e8625f6d --- /dev/null +++ b/packages/ui/src/App.tsx @@ -0,0 +1,207 @@ +import React from "react"; +import { Toaster } from "@/components/ui/toaster"; +import { Toaster as Sonner } from "@/components/ui/sonner"; +import { TooltipProvider } from "@/components/ui/tooltip"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { BrowserRouter, Routes, Route, useLocation } from "react-router-dom"; +import { AuthProvider, useAuth } from "@/hooks/useAuth"; +import { PostNavigationProvider } from "@/contexts/PostNavigationContext"; +import { OrganizationProvider } from "@/contexts/OrganizationContext"; +import { LogProvider, useLog } from "@/contexts/LogContext"; +import { LayoutProvider } from "@/contexts/LayoutContext"; +import { MediaRefreshProvider } from "@/contexts/MediaRefreshContext"; +import { ProfilesProvider } from "@/contexts/ProfilesContext"; +import { WebSocketProvider } from "@/contexts/WS_Socket"; +import { registerAllWidgets } from "@/lib/registerWidgets"; +import TopNavigation from "@/components/TopNavigation"; +import GlobalDragDrop from "@/components/GlobalDragDrop"; + +// Register all widgets on app boot +registerAllWidgets(); + +import Index from "./pages/Index"; +import Auth from "./pages/Auth"; +import Profile from "./pages/Profile"; +import Post from "./pages/Post"; +import UserProfile from "./pages/UserProfile"; +import UserCollections from "./pages/UserCollections"; +import Collections from "./pages/Collections"; +import NewCollection from "./pages/NewCollection"; +import UserPage from "./pages/UserPage"; +import NewPage from "./pages/NewPage"; +import TagPage from "./pages/TagPage"; +import SearchResults from "./pages/SearchResults"; +import Wizard from "./pages/Wizard"; +import NewPost from "./pages/NewPost"; + +import Organizations from "./pages/Organizations"; +const ProviderSettings = React.lazy(() => import("./pages/ProviderSettings")); +const PlaygroundEditor = React.lazy(() => import("./pages/PlaygroundEditor")); +const PlaygroundEditorLLM = React.lazy(() => import("./pages/PlaygroundEditorLLM")); +const VideoPlayerPlayground = React.lazy(() => import("./pages/VideoPlayerPlayground")); +const VideoFeedPlayground = React.lazy(() => import("./pages/VideoFeedPlayground")); +const VideoPlayerPlaygroundIntern = React.lazy(() => import("./pages/VideoPlayerPlaygroundIntern")); +const NotFound = React.lazy(() => import("./pages/NotFound")); +const AdminPage = React.lazy(() => import("./pages/AdminPage")); +const PlaygroundImages = React.lazy(() => import("./pages/PlaygroundImages")); +const PlaygroundImageEditor = React.lazy(() => import("./pages/PlaygroundImageEditor")); +const VideoGenPlayground = React.lazy(() => import("./pages/VideoGenPlayground")); +const PlaygroundCanvas = React.lazy(() => import("./pages/PlaygroundCanvas")); +import LogsPage from "./components/logging/LogsPage"; + +const queryClient = new QueryClient(); + +const VersionMap = React.lazy(() => import("./pages/VersionMap")); + +// +const AppWrapper = () => { + const location = useLocation(); + + const isFullScreenPage = location.pathname.startsWith('/video-feed'); + + const containerClassName = isFullScreenPage + ? "flex flex-col min-h-svh transition-colors duration-200 bg-background h-full" + : "mx-auto 2xl:max-w-7xl flex flex-col min-h-svh transition-colors duration-200 bg-background h-full"; + + return ( +
+ {!isFullScreenPage && } + + + {/* Top-level routes (no organization context) */} + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + Loading map...
}> + + + } /> + } /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + + {/* Admin Routes */} + Loading...}>} /> + + {/* Organization-scoped routes */} + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + Loading map...}> + + + } /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + + {/* Playground Routes */} + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + Loading...}>} /> + } /> + + {/* Logs */} + } /> + + {/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */} + Loading...}>} /> + + + ); +}; + +import { initFormatDetection } from '@/utils/formatDetection'; + +import { SWRConfig } from 'swr'; +import CacheTest from "./pages/CacheTest"; + +// ... (imports) + +import { FeedCacheProvider } from "@/contexts/FeedCacheContext"; + +// ... (imports) + +const App = () => { + React.useEffect(() => { + initFormatDetection(); + }, []); + + return ( + new Map() }}> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +// Update Routes in AppWrapper to include /test-cache/:id +// ... +// We need to inject the route inside AppWrapper component defined above +// Since ReplaceFileContent works on blocks, I'll target the Routes block in a separate call or try to merge. +// Merging is safer if I can target the App component specifically. +// But the Routes are in AppWrapper. +// Let's split this into two edits. + + +export default App; diff --git a/packages/ui/src/EmbedApp.tsx b/packages/ui/src/EmbedApp.tsx new file mode 100644 index 00000000..4d2ca524 --- /dev/null +++ b/packages/ui/src/EmbedApp.tsx @@ -0,0 +1,117 @@ +import React from 'react'; +import { EmbedRenderer } from './pages/Post/renderers/EmbedRenderer'; +import UserPage from './pages/UserPage'; +import { Toaster } from "@/components/ui/sonner"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { MemoryRouter } from 'react-router-dom'; +import { LayoutProvider } from './contexts/LayoutContext'; +import { AuthProvider } from '@/hooks/useAuth'; +import { LogProvider } from '@/contexts/LogContext'; + +interface EmbedAppProps { + initialState: any; +} + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + refetchOnWindowFocus: false, + }, + }, +}); + +const EmbedApp: React.FC = ({ initialState }) => { + const { post, mediaItems, authorProfile, page } = initialState; + + if (!post && !mediaItems && !page) { + return ( +
+

Content not found or failed to load.

+
+ ); + } + + if (page) { + return ( + + + + + + + + + + + + + ); + } + + return ( + + + +
+ { }} + onViewModeChange={() => { }} + onExportMarkdown={() => { }} + onDeletePost={() => { }} + onDeletePicture={() => { }} + onLike={() => { }} + onEditPicture={() => { }} + onMediaSelect={() => { }} + onExpand={() => { + // Open post in new tab + window.open(`/post/${post?.id || mediaItems?.[0]?.id}`, '_blank'); + }} + onDownload={() => { }} + currentImageIndex={0} + videoPlaybackUrl="" + videoPosterUrl="" + versionImages={[]} + handlePrevImage={() => { }} + handleNavigate={(dir) => { }} + navigationData={null} + isEditMode={false} + localPost={null} + setLocalPost={() => { }} + localMediaItems={[]} + setLocalMediaItems={() => { }} + onMoveItem={() => { }} + onEditModeToggle={() => { }} + onSaveChanges={() => { }} + onYouTubeAdd={() => { }} + onTikTokAdd={() => { }} + onAIWizardOpen={() => { }} + onInlineUpload={async () => { }} + onRemoveFromPost={() => { }} + onGalleryPickerOpen={() => { }} + onUnlinkImage={() => { }} + /> + +
+
+
+
+ ); +}; + +export default EmbedApp; diff --git a/packages/ui/src/Logger.ts b/packages/ui/src/Logger.ts new file mode 100644 index 00000000..649cf0fb --- /dev/null +++ b/packages/ui/src/Logger.ts @@ -0,0 +1,181 @@ +import { toast } from 'sonner'; +import React from 'react'; + +export type LogLevel = 'info' | 'warn' | 'error' | 'success' | 'debug'; + +export interface LogEntry { + level: LogLevel; + message: string; + timestamp: number; + data?: any; +} + +export interface LoggerConfig { + enableConsole: boolean; + enableToaster: boolean; + deduplicationWindow: number; // ms +} + +class Logger { + private static instance: Logger; + private config: LoggerConfig; + private recentLogs: Map = new Map(); + + private constructor() { + this.config = { + enableConsole: true, + enableToaster: true, + deduplicationWindow: 5000, // 5 seconds + }; + } + + public static getInstance(): Logger { + if (!Logger.instance) { + Logger.instance = new Logger(); + } + return Logger.instance; + } + + public configure(config: Partial): void { + this.config = { ...this.config, ...config }; + } + + private isDuplicate(message: string): boolean { + const now = Date.now(); + const lastLogTime = this.recentLogs.get(message); + + if (lastLogTime && (now - lastLogTime) < this.config.deduplicationWindow) { + return true; + } + + this.recentLogs.set(message, now); + + // Clean up old entries + for (const [msg, timestamp] of this.recentLogs.entries()) { + if (now - timestamp > this.config.deduplicationWindow) { + this.recentLogs.delete(msg); + } + } + + return false; + } + + private logToConsole(level: LogLevel, message: string, data?: any): void { + if (!this.config.enableConsole) return; + + const timestamp = new Date().toISOString(); + const prefix = `[${timestamp}] [${level.toUpperCase()}]`; + + switch (level) { + case 'error': + console.error(prefix, message, data || ''); + break; + case 'warn': + console.warn(prefix, message, data || ''); + break; + case 'debug': + console.debug(prefix, message, data || ''); + break; + case 'info': + case 'success': + default: + console.log(prefix, message, data || ''); + break; + } + } + + private logToToaster(level: LogLevel, message: string): void { + if (!this.config.enableToaster) return; + + const toastId = toast( + React.createElement( + 'div', + { + onClick: () => toast.dismiss(toastId), + style: { cursor: 'pointer', width: '100%' }, + }, + message + ) + ); + + switch (level) { + case 'error': + toast.error(message, { id: toastId }); + break; + case 'warn': + toast.warning(message, { id: toastId }); + break; + case 'success': + toast.success(message, { id: toastId }); + break; + case 'info': + toast.info(message, { id: toastId }); + break; + case 'debug': + // Don't show debug messages in toaster by default + toast.dismiss(toastId); + break; + } + } + + public log(level: LogLevel, message: string, data?: any): void { + if (this.isDuplicate(message)) { + return; + } + + this.logToConsole(level, message, data); + this.logToToaster(level, message); + } + + public info(message: string, data?: any): void { + this.log('info', message, data); + } + + public warn(message: string, data?: any): void { + this.log('warn', message, data); + } + + public error(message: string, data?: any): void { + this.log('error', message, data); + } + + public success(message: string, data?: any): void { + this.log('success', message, data); + } + + public debug(message: string, data?: any): void { + this.log('debug', message, data); + } + + // Convenience methods for common patterns + public logError(error: unknown, context?: string): void { + const message = context + ? `${context}: ${error instanceof Error ? error.message : String(error)}` + : error instanceof Error ? error.message : String(error); + + this.error(message, error instanceof Error ? error.stack : undefined); + } + + public logApiError(operation: string, error: unknown): void { + this.logError(error, `Error during ${operation}`); + } + + public logWebSocketError(operation: string, error: unknown): void { + this.logError(error, `WebSocket error during ${operation}`); + } + + // Method to temporarily disable toaster (useful for batch operations) + public withoutToaster(fn: () => T): T { + const originalToasterState = this.config.enableToaster; + this.config.enableToaster = false; + try { + return fn(); + } finally { + this.config.enableToaster = originalToasterState; + } + } +} + +// Export singleton instance +export const logger = Logger.getInstance(); +export default logger; \ No newline at end of file diff --git a/packages/ui/src/assets/hero-image.jpg b/packages/ui/src/assets/hero-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c41440d441af658745ff6b4c18b25928fcdcdd9 GIT binary patch literal 125311 zcmbTec|4ST_%=M2u?#92vXty*h%7_0l%*MCtTSV4q9SQ#q%4t?vX@Ert+8a88OBx^ zTdQPgQ;a1^C5n(rXfN;g(*1kh=kxycK96p0E;H9$-)qkEJdX1?kFV9y)d|=J0?q*k z6A*yG1i(Mo>I;}1OiV;XR0J+2Dk>^2E{2dqN=ZscNGix|T#wwMxK(+J;^xgN8v5EQ zYTMK|Z$|AvZ!<8&U@%*?cUqYlS?U{OjG&VUh>MF$N=V8}Ny!_jZdNt=KmJ(lfJuu9 zn~BB>38=vYr3Hkf1y;LYTfue01=c=b|9uDu3JJqSM8(7r65s*N8(@M0LPCPVLU6dS zFnDwf_&rQm8ZM)1Xd|+b=qIWciZqJLEE7|=ZMZ8-8u+YX>>m~{j*#0Vub`-@rHw-C zU`$MRnC&#T+k?f~;~fZOcMnf5@4b{m0fz&RP-*n=6A_UoqfSL9Bqk-FzmUSn%FfBn z%P+XhEU#d(Ih9r1>c%Esb4zPm`}NLyUEMvs_a8ju4-O5FJR5yJ_GWVG?Yrrj_p@`0 zUzV0vzJB}u<0rH(0hrLgWr45%7WV&Hmo!+Hps=uzuqd=H0l|~tQ%G7Eu4*VEV?z}6 z3*D$@6eotX%`9uUE3R%#`Yh`oHh_@Rz`W61gqF6pvj2Yzi~qk`+5cMD|GTa+n52*Z zc=Lp$VY^|A*9jEeK@|e3ydbdx$#WAV;?SYia3s+huBnF3Kq0!WC7?S8{E$#^Y#sLe{LlT{Aut+xn zERqDPV4^qzjt-92a6L^um?n}ma8Lj|ume@jfT7ss1>%l4RH+~X`ZNR&f-VR=&_ITP zroze@6d3e4A0`@2izW4=N^Pvcj}+(g*!3{ zKI9EVto(Grd7?ufYTkCkog@pCRjx-Dd&Rm0gV zcBu_m-U9(}kfTcd1l{E%BoEw2LkX;W1+oiONfK~m2qSs^`N%G0c`A_+(9oHejdXL| z0DW>U++?`Y#>+Pzupq(1XPM|_^e6^gNQc|npk)7Zhm$*!tT6AAmk zw576GD&<)j{V?Y(vuG)y4NRwgnv_~B)0Vc5CZ#$q&S8?BF;ZgAsu)EY%Rmd9iHfqN zvG~m6(RM=4S~-KxsuyUSA{r;tR*_bz=*M!as1NmBmm7AW=yOmp_f1hRKYQp^;t$R6 zn!H2XUs};`BnuS{2b)hlK4>w*8jwqscG+I`L4R-0^ftcqEAEY=q7t2#og2D5#LY~u z4{Xl5l-#69J`raG!zWH*g@z-dfTCJb}>JK;gJRfP;78@dLRUNU?ou8TZ?1$LEd!Bvo{ZbD@*`S z&_{tpWcZLsgD^J8We}HZ=>bj+1B(NBq>t(b8A}@6P{4*V2)vrLIan>YZbv9-{PRFL zAoZ)TSx6p?G=S4dL4fBHp`Zrwj&ws)H3$@to#0YY8%UE3ia){)jUIY{Fto1pkCS2} z!OiFbD+1{RBHlk=q#yy=#um&+CTgKW9T{%u3x?7>HY z$*jZ&^t%p@&K%Wn9L*T3a*daBxja_LnT;77iM6IlZM~$*>QO}&^+)p+5kk%w4wEJ& zwif;w{mD$4vudfoVlbM;a#K8P1~MZB4;?xrrCKTNY(+CltnA^~kD;57yCRM#^w1p> zeTp;d*xro>;Uz(l0fN$Z+0B#_Jg-W zX(uahsVk6MI3|OFGqRMrmssA6EU9g7|2zAGEDX={uvB?oR$K~$uzyI=+7!g3h$fPk z1Ir-|;QeRD68bdt1VVXkRF;4PDCU|_BB0paviDCWfp6nM@cV&q-#{V_fDnQzx1OdU z96Udk0#)9BWpQQ0$l5k_JG6@N#$%ga8c4%K$I8R==UxL4kbhhCqTxhOyXCVyf*>3<^+1}hB@GS*1Cazm8vqkHqn@F-<9|zmUc^n1&j+Z6MYe&|Mz(PT z{qq<;AQ_+(f)YE0Nil>f093NUE2I)YI1BOz7!+Y-8>{jks)XWDY=9≠9`lXlkjo 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%0A9%Va>K;crw{sxa|c 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 literal 0 HcmV?d00001 diff --git a/packages/ui/src/components/GlobalDragDrop.tsx b/packages/ui/src/components/GlobalDragDrop.tsx index 3a5bbe99..925f542f 100644 --- a/packages/ui/src/components/GlobalDragDrop.tsx +++ b/packages/ui/src/components/GlobalDragDrop.tsx @@ -16,8 +16,8 @@ const GlobalDragDrop = () => { const isValidDrag = (e: DragEvent) => { const types = e.dataTransfer?.types || []; if (types.includes('polymech/internal')) return false; - // Allow Files or Links (text/uri-list) - return types.includes('Files') || types.includes('text/uri-list'); + // Allow Files or Links (text/uri-list) or text/plain (often used for links on mobile) + return types.includes('Files') || types.includes('text/uri-list') || types.includes('text/plain'); }; const handleDragEnter = (e: DragEvent) => { diff --git a/packages/ui/src/components/ImageWizard/README.md b/packages/ui/src/components/ImageWizard/README.md index 0f059de2..c9fa504f 100644 --- a/packages/ui/src/components/ImageWizard/README.md +++ b/packages/ui/src/components/ImageWizard/README.md @@ -1,7 +1,6 @@ # ImageWizard Component Structure ## Overview - The ImageWizard is split into focused modules for better maintainability. ## File Structure @@ -30,25 +29,21 @@ ImageWizard/ ## Recent Refactorings ### 1. ✅ Prompt Splitter Extracted (`promptHandlers.ts`) - - `generateImageSplit` - Sequential multi-prompt generation - Uses `splitPromptByLines` from `@constants.ts` ### 2. ✅ Logger Refactored (`utils/logger.ts`) - - Changed from `addLog('debug', ...)` to `logger.debug(...)` - Created `Logger` interface with clean methods: `debug()`, `info()`, `warning()`, `error()`, `success()`, `verbose()` - All handlers now accept `Logger` instead of raw `addLog` function - Component name auto-prefixed in logs ### 3. ✅ DEFAULT_QUICK_ACTIONS Moved to `@constants.ts` - - `QuickAction` interface now exported from constants - Available throughout the codebase - Removed duplicate from `types.ts` ### 4. ✅ Drag and Drop Extracted (`dropHandlers.ts`) - - `handleDragEnter` - Show drop overlay - `handleDragOver` - Keep overlay active - `handleDragLeave` - Debounced hide (prevents flicker) @@ -57,7 +52,6 @@ ImageWizard/ ## Handler Categories ### 📸 imageHandlers.ts - - `handleFileUpload` - Upload files - `toggleImageSelection` - Select/deselect images - `removeImageRequest` - Request image deletion @@ -66,40 +60,32 @@ ImageWizard/ - `handleDownloadImage` - Download image ### 🎨 generationHandlers.ts - - `handleOptimizePrompt` - Optimize prompt with AI - `buildFullPrompt` - Build prompt with preset context - `abortGeneration` - Cancel generation ### 📝 promptHandlers.ts - - `generateImageSplit` - Sequential multi-prompt generation ### 🎤 voiceHandlers.ts - - `handleMicrophone` - Record audio - `handleVoiceToImage` - Voice-to-image workflow with AI ### 🤖 agentHandlers.ts - - `handleAgentGeneration` - AI Agent mode with tool calling ### 📤 publishHandlers.ts - - `publishImage` - Standard publish - `quickPublishAsNew` - Quick publish with prompt as description ### 💾 dataHandlers.ts - - `loadFamilyVersions` - Load image version families - `loadAvailableImages` - Load gallery images ### ⚙️ settingsHandlers.ts - - Template, preset, workflow, history management ### 🎯 dropHandlers.ts - - Drag and drop file handling ## Usage Example @@ -119,7 +105,6 @@ logger.info('File uploaded successfully'); ``` ## Benefits - ✅ Easier to find specific logic ✅ Better code organization ✅ Simpler testing @@ -127,3 +112,4 @@ logger.info('File uploaded successfully'); ✅ Clear separation of concerns ✅ Clean logging API ✅ Reusable utilities + diff --git a/packages/ui/src/components/ImageWizard/utils/logger.ts b/packages/ui/src/components/ImageWizard/utils/logger.ts index 405103a2..398f19f3 100644 --- a/packages/ui/src/components/ImageWizard/utils/logger.ts +++ b/packages/ui/src/components/ImageWizard/utils/logger.ts @@ -19,7 +19,7 @@ export interface Logger { */ const formatMessage = (message: string, args: any[]): string => { if (args.length === 0) return message; - + // Stringify additional arguments and append them const argsStr = args.map(arg => { if (typeof arg === 'string') return arg; @@ -30,7 +30,7 @@ const formatMessage = (message: string, args: any[]): string => { return String(arg); } }).join(' '); - + return `${message} ${argsStr}`; }; diff --git a/packages/ui/src/components/ListLayout.tsx b/packages/ui/src/components/ListLayout.tsx index ee476943..9535028e 100644 --- a/packages/ui/src/components/ListLayout.tsx +++ b/packages/ui/src/components/ListLayout.tsx @@ -14,7 +14,7 @@ import UserPage from "@/pages/UserPage"; interface ListLayoutProps { sortBy?: FeedSortOption; - navigationSource?: 'home' | 'collection' | 'tag' | 'user' | 'widget'; + navigationSource?: 'home' | 'collection' | 'tag' | 'user'; navigationSourceId?: string; isOwner?: boolean; // Not strictly used for rendering list but good for consistency } @@ -199,7 +199,7 @@ export const ListLayout = ({ {/* Right: Detail */} -

+
{selectedId ? ( (() => { const selectedPost = feedPosts.find((p: any) => p.id === selectedId); diff --git a/packages/ui/src/components/MarkdownRenderer.tsx b/packages/ui/src/components/MarkdownRenderer.tsx index 7692fec7..62a81f14 100644 --- a/packages/ui/src/components/MarkdownRenderer.tsx +++ b/packages/ui/src/components/MarkdownRenderer.tsx @@ -54,12 +54,28 @@ const MarkdownRenderer = React.memo(({ content, className = "" }: MarkdownRender .replace(/"/g, '"') .replace(/'/g, "'"); - // Configure marked options for regular markdown + + // Configure marked options marked.setOptions({ - breaks: true, // Convert \n to
- gfm: true, // GitHub flavored markdown + breaks: true, + gfm: true, }); + // Custom renderer to add IDs to headings + const renderer = new marked.Renderer(); + renderer.heading = ({ text, depth }: { text: string; depth: number }) => { + const slug = text + .toLowerCase() + .trim() + .replace(/[^\w\s-]/g, '') + .replace(/[\s_-]+/g, '-') + .replace(/^-+|-+$/g, ''); + + return `${text}`; + }; + + marked.use({ renderer }); + // Convert markdown to HTML const rawHtml = marked.parse(decodedContent) as string; diff --git a/packages/ui/src/components/PageActions.tsx b/packages/ui/src/components/PageActions.tsx new file mode 100644 index 00000000..07f72c03 --- /dev/null +++ b/packages/ui/src/components/PageActions.tsx @@ -0,0 +1,503 @@ +import { useState } from "react"; +import { supabase } from "@/integrations/supabase/client"; +import { toast } from "sonner"; +import { Button } from "@/components/ui/button"; +import { Eye, EyeOff, Edit3, Trash2, GitMerge, Share2, Link as LinkIcon, FileText, Download, FilePlus } from "lucide-react"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, + DropdownMenuSeparator, + DropdownMenuLabel +} from "@/components/ui/dropdown-menu"; +import { T, translate } from "@/i18n"; +import { PagePickerDialog } from "./widgets/PagePickerDialog"; +import { PageCreationWizard } from "./widgets/PageCreationWizard"; +import { cn } from "@/lib/utils"; + +interface Page { + id: string; + title: string; + content: any; + visible: boolean; + is_public: boolean; + owner: string; + slug: string; + parent: string | null; +} + +interface PageActionsProps { + page: Page; + isOwner: boolean; + isEditMode?: boolean; + onToggleEditMode?: () => void; + onPageUpdate: (updatedPage: Page) => void; + onDelete?: () => void; + className?: string; + showLabels?: boolean; +} + +export const PageActions = ({ + page, + isOwner, + isEditMode = false, + onToggleEditMode, + onPageUpdate, + onDelete, + className, + showLabels = true +}: PageActionsProps) => { + const [loading, setLoading] = useState(false); + const [showPagePicker, setShowPagePicker] = useState(false); + const [showCreationWizard, setShowCreationWizard] = useState(false); + const [isGeneratingPdf, setIsGeneratingPdf] = useState(false); + + const baseUrl = import.meta.env.VITE_SERVER_IMAGE_API_URL || window.location.origin; + + const handleParentUpdate = async (parentId: string | null) => { + if (loading) return; + setLoading(true); + + try { + const { error } = await supabase + .from('pages') + .update({ parent: parentId }) + .eq('id', page.id); + + if (error) throw error; + + onPageUpdate({ ...page, parent: parentId }); + toast.success(translate('Page parent updated')); + } catch (error) { + console.error('Error updating page parent:', error); + toast.error(translate('Failed to update page parent')); + } finally { + setLoading(false); + } + }; + + const handleToggleVisibility = async (e?: React.MouseEvent) => { + e?.stopPropagation(); + if (loading) return; + setLoading(true); + + try { + const { error } = await supabase + .from('pages') + .update({ visible: !page.visible }) + .eq('id', page.id); + + if (error) throw error; + + onPageUpdate({ ...page, visible: !page.visible }); + toast.success(translate(page.visible ? 'Page hidden' : 'Page made visible')); + } catch (error) { + console.error('Error toggling visibility:', error); + toast.error(translate('Failed to update page visibility')); + } finally { + setLoading(false); + } + }; + + const handleTogglePublic = async (e?: React.MouseEvent) => { + e?.stopPropagation(); + if (loading) return; + setLoading(true); + + try { + const { error } = await supabase + .from('pages') + .update({ is_public: !page.is_public }) + .eq('id', page.id); + + if (error) throw error; + + onPageUpdate({ ...page, is_public: !page.is_public }); + toast.success(translate(page.is_public ? 'Page made private' : 'Page made public')); + } catch (error) { + console.error('Error toggling public status:', error); + toast.error(translate('Failed to update page status')); + } finally { + setLoading(false); + } + }; + + const handleCopyLink = async () => { + const url = window.location.href; + const title = page.title || 'PolyMech Page'; + + if (navigator.share && navigator.canShare({ url, title })) { + try { + await navigator.share({ url, title }); + return; + } catch (e) { + if ((e as Error).name !== 'AbortError') console.error('Share failed', e); + } + } + + try { + await navigator.clipboard.writeText(url); + toast.success("Link copied to clipboard"); + } catch (e) { + console.error('Clipboard failed', e); + toast.error("Failed to copy link"); + } + }; + + const processPageContent = (content: any): string => { + if (!content) return ''; + if (typeof content === 'string') return content; + + let markdown = ''; + const serverUrl = import.meta.env.VITE_SERVER_IMAGE_API_URL || window.location.origin; + + try { + // Determine content root + // Some versions might have content directly, others wrapped in { pages: { [id]: { containers: ... } } } + let root = content; + if (content.pages) { + // Try to find the page by ID or take the first one + const pageIdKey = `page-${page.id}`; + if (content.pages[pageIdKey]) { + root = content.pages[pageIdKey]; + } else { + // Fallback: take first key + const keys = Object.keys(content.pages); + if (keys.length > 0) root = content.pages[keys[0]]; + } + } + + // Traverse containers + if (root.containers && Array.isArray(root.containers)) { + root.containers.forEach((container: any) => { + if (container.widgets && Array.isArray(container.widgets)) { + container.widgets.forEach((widget: any) => { + if (widget.widgetId === 'markdown-text' && widget.props && widget.props.content) { + markdown += widget.props.content + '\n\n'; + } + // Future: Handle other widgets if needed + }); + } + }); + } else if (root.widgets && Array.isArray(root.widgets)) { // Fallback for simple structure + root.widgets.forEach((widget: any) => { + if (widget.widgetId === 'markdown-text' && widget.props && widget.props.content) { + markdown += widget.props.content + '\n\n'; + } + }); + } + } catch (e) { + console.error('Error parsing page content:', e); + return JSON.stringify(content, null, 2); // Fallback to raw JSON + } + + // URL Resolution logic is handled by markdown-text widget content usually containing relative URLs + // If we need to process them: + // markdown = markdown.replace(/!\[(.*?)\]\((.*?)\)/g, (match, alt, url) => { ... }); + // For now returning raw markdown as user requested "mind url" likely meant for PDF which runs server side. + // Client side export usually keeps links as is unless they are purely internal IDs. + + return markdown; + }; + + const getSlug = (text: string) => text.toLowerCase().replace(/[^\w\s-]/g, '').replace(/\s+/g, '-'); + + const handleExportMarkdown = () => { + try { + let content = processPageContent(page.content); + + // Generate TOC + const lines = content.split('\n'); + let toc = '# Table of Contents\n\n'; + let hasHeadings = false; + + lines.forEach(line => { + // Determine header level + const match = line.match(/^(#{1,3})\s+(.+)/); + if (match) { + hasHeadings = true; + const level = match[1].length; + const text = match[2]; + const slug = getSlug(text); + const indent = ' '.repeat(level - 1); + toc += `${indent}- [${text}](#${slug})\n`; + } + }); + + if (hasHeadings) { + content = `${toc}\n---\n\n${content}`; + } + + const blob = new Blob([content], { type: 'text/markdown' }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `${(page.title || 'page').replace(/[^a-z0-9]/gi, '_')}.md`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + toast.success("Markdown downloaded"); + } catch (e) { + console.error("Markdown export failed", e); + toast.error("Failed to export Markdown"); + } + }; + + const handleEmbed = async () => { + // Embed logic: Copy iframe code + // Route: /embed/:id is currently for posts. But maybe it works for pages if we update the backend? + // Wait, current serving index.ts handleGetEmbed fetches from 'posts' table only. + // User asked for "embed (HTML)". + // Assuming we should point to a route that RENDERS the page. + // If we don't have a dedicated page embed route yet, we might need one. + // However, the user said "see dedicated app route ( @[src/main-embed.tsx] )". + // This suggests the frontend app handles it. + // The backend route `/embed/:id` serves the HTML that bootstraps `main-embed.tsx`. + // So we just need to use that URL. BUT `handleGetEmbed` in backend fetches from `posts`. + // We probably need `handleGetEmbedPage` or update `handleGetEmbed` to support pages. + // For now, let's assume valid URL structure is `/embed/page/:id` which we plan to add or `/embed/:id` if we unify. + // Let's use `/embed/page/${page.id}` in the snippet and ensure backend supports it. + + const embedUrl = `${baseUrl}/embed/page/${page.id}`; + const iframeCode = ``; + + try { + await navigator.clipboard.writeText(iframeCode); + toast.success("Embed code copied to clipboard"); + } catch (e) { + toast.error("Failed to copy embed code"); + } + }; + + const handleExportAstro = async () => { + try { + // Re-use markdown export logic + let content = processPageContent(page.content); + const slug = getSlug(page.title || 'page'); + + // Generate TOC (same as markdown export) + const lines = content.split('\n'); + let toc = '# Table of Contents\n\n'; + let hasHeadings = false; + + lines.forEach(line => { + const match = line.match(/^(#{1,3})\s+(.+)/); + if (match) { + hasHeadings = true; + const level = match[1].length; + const text = match[2]; + const id = getSlug(text); + const indent = ' '.repeat(level - 1); + toc += `${indent}- [${text}](#${id})\n`; + } + }); + + if (hasHeadings) { + content = `${toc}\n---\n\n${content}`; + } + + // Construct Front Matter + const safeTitle = (page.title || 'Untitled').replace(/"/g, '\\"'); + const safeSlug = (page.slug || slug).replace(/"/g, '\\"'); + const dateStr = new Date().toISOString().split('T')[0]; + + // Note: Page interface in PageActions might need update to include tags if we want them + // For now, using standard props we have + + const frontMatter = `--- +title: "${safeTitle}" +slug: "${safeSlug}" +date: "${dateStr}" +author: "${page.owner}" +draft: ${!page.visible} +--- + +`; + + const finalContent = frontMatter + content; + const blob = new Blob([finalContent], { type: 'text/markdown' }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `${slug}.astro`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + + toast.success("Astro export downloaded"); + } catch (e) { + console.error("Astro export failed", e); + toast.error("Failed to export Astro"); + } + }; + + const handleExportPdf = async () => { + setIsGeneratingPdf(true); + toast.info("Generating PDF..."); + try { + const link = document.createElement('a'); + link.href = `${baseUrl}/api/render/pdf/page/${page.id}`; + link.target = "_blank"; + link.download = `${(page.title || 'page').replace(/[^a-z0-9]/gi, '_')}.pdf`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } catch (e) { + console.error(e); + toast.error("Failed to download PDF"); + } finally { + setIsGeneratingPdf(false); + } + }; + + return ( +
+ {/* Share Menu */} + + + + + + Share & Export + + + + Copy Link + + + + Export Markdown + + + + {isGeneratingPdf ? 'Generating PDF...' : 'Export PDF'} + + + + Export Astro (Beta) + + + + Embed (HTML) + + + + + {/* Owner Controls */} + {isOwner && ( + <> + + + + + {onToggleEditMode && ( + + )} + + + + setShowPagePicker(false)} + onSelect={handleParentUpdate} + currentValue={page.parent} + forbiddenIds={[page.id]} + /> + + + + setShowCreationWizard(false)} + parentId={page.id} + /> + + {onDelete && ( + + )} + + )} +
+ ); +}; diff --git a/packages/ui/src/components/PhotoGrid.tsx b/packages/ui/src/components/PhotoGrid.tsx index 75935554..5ad35d05 100644 --- a/packages/ui/src/components/PhotoGrid.tsx +++ b/packages/ui/src/components/PhotoGrid.tsx @@ -59,7 +59,6 @@ const MediaGrid = ({ navigationSourceId, isOwner = false, onFilesDrop, - showVideos = true, sortBy = 'latest', supabaseClient, diff --git a/packages/ui/src/components/ResponsiveImage.tsx b/packages/ui/src/components/ResponsiveImage.tsx index b35548ee..e712edfd 100644 --- a/packages/ui/src/components/ResponsiveImage.tsx +++ b/packages/ui/src/components/ResponsiveImage.tsx @@ -26,6 +26,7 @@ export interface ResponsiveData { srcset: string; type: string; }[]; + stats?: any; } const ResponsiveImage: React.FC = ({ @@ -33,8 +34,8 @@ const ResponsiveImage: React.FC = ({ sizes = '(max-width: 1024px) 100vw, 50vw', className, imgClassName, - responsiveSizes = [180, 640, 1024, 1280, 1600], - formats = ['avif', 'webp'], + responsiveSizes = [640, 1280], + formats = ['avif'], alt, onDataLoaded, rootMargin = '800px', @@ -111,7 +112,7 @@ const ResponsiveImage: React.FC = ({ if (!isInView || isLoadingOrPending) { // Use className for wrapper if provided, otherwise generic // We attach the ref here to detect when this placeholder comes into view - return
; + return
; } if (error || !data) { @@ -151,7 +152,7 @@ const ResponsiveImage: React.FC = ({ /> {!imgLoaded && ( -
+
)} diff --git a/packages/ui/src/components/VideoCard.tsx b/packages/ui/src/components/VideoCard.tsx index de7d91b7..6a6f2551 100644 --- a/packages/ui/src/components/VideoCard.tsx +++ b/packages/ui/src/components/VideoCard.tsx @@ -84,11 +84,7 @@ const VideoCard = ({ // Stop playback on navigation & Cleanup useEffect(() => { - console.log(`[VideoCard ${videoId}] Mounted`); const handleNavigation = () => { - if (isPlaying) { - console.log(`[VideoCard ${videoId}] Navigation detected - stopping`); - } setIsPlaying(false); player.current?.pause(); }; @@ -96,7 +92,6 @@ const VideoCard = ({ handleNavigation(); return () => { - console.log(`[VideoCard ${videoId}] Unmounting - pausing player`); player.current?.pause(); }; }, [location.pathname]); @@ -383,7 +378,6 @@ const VideoCard = ({ }; const handleClick = (e: React.MouseEvent) => { - console.log('Video clicked'); e.preventDefault(); e.stopPropagation(); onClick?.(videoId); @@ -394,7 +388,6 @@ const VideoCard = ({ const handleStopVideo = (e: Event) => { const customEvent = e as CustomEvent; if (customEvent.detail?.sourceId !== videoId && isPlaying) { - console.log(`[VideoCard ${videoId}] Stopping due to global event`); setIsPlaying(false); player.current?.pause(); } @@ -405,7 +398,6 @@ const VideoCard = ({ }, [isPlaying, videoId]); const handlePlayClick = (e: React.MouseEvent) => { - console.log('Play clicked'); e.preventDefault(); e.stopPropagation(); diff --git a/packages/ui/src/components/hmi/GenericCanvas.tsx b/packages/ui/src/components/hmi/GenericCanvas.tsx index 28506045..8f612948 100644 --- a/packages/ui/src/components/hmi/GenericCanvas.tsx +++ b/packages/ui/src/components/hmi/GenericCanvas.tsx @@ -13,6 +13,8 @@ interface GenericCanvasProps { isEditMode?: boolean; showControls?: boolean; className?: string; + selectedWidgetId?: string | null; + onSelectWidget?: (widgetId: string) => void; } const GenericCanvasComponent: React.FC = ({ @@ -21,8 +23,10 @@ const GenericCanvasComponent: React.FC = ({ isEditMode = false, showControls = true, className = '', + selectedWidgetId, + onSelectWidget }) => { - const { + const { loadedPages, loadPageLayout, addWidgetToPage, @@ -33,7 +37,7 @@ const GenericCanvasComponent: React.FC = ({ addPageContainer, removePageContainer, movePageContainer, - exportPageLayout, + exportPageLayout, importPageLayout, saveToApi, isLoading @@ -137,10 +141,10 @@ const GenericCanvasComponent: React.FC = ({ const handleSaveToApi = async () => { if (isSaving) return; - + setIsSaving(true); setSaveStatus('idle'); - + try { const success = await saveToApi(); if (success) { @@ -176,7 +180,7 @@ const GenericCanvasComponent: React.FC = ({ return (
- + {/* Header with Controls */} {showControls && (
@@ -185,7 +189,7 @@ const GenericCanvasComponent: React.FC = ({

{layout.name}

- +
{/* Edit Mode Controls */} @@ -211,13 +215,12 @@ const GenericCanvasComponent: React.FC = ({ onClick={handleSaveToApi} size="sm" disabled={isSaving} - className={`glass-button ${ - saveStatus === 'success' - ? 'bg-green-500 text-white' - : saveStatus === 'error' + className={`glass-button ${saveStatus === 'success' + ? 'bg-green-500 text-white' + : saveStatus === 'error' ? 'bg-red-500 text-white' : 'bg-blue-500 text-white' - }`} + }`} title="Save layout to server" > {isSaving ? ( @@ -282,14 +285,14 @@ const GenericCanvasComponent: React.FC = ({ )} {/* Container Canvas */} -
{layout.containers .sort((a, b) => (a.order || 0) - (b.order || 0)) .map((container, index, array) => ( - = ({ onSelect={handleSelectContainer} onAddWidget={handleAddWidget} isCompactMode={className.includes('p-0')} + selectedWidgetId={selectedWidgetId} + onSelectWidget={onSelectWidget} onRemoveWidget={async (widgetId) => { try { await removeWidgetFromPage(pageId, widgetId); diff --git a/packages/ui/src/components/hmi/LayoutContainer.tsx b/packages/ui/src/components/hmi/LayoutContainer.tsx index 09719846..0797aa79 100644 --- a/packages/ui/src/components/hmi/LayoutContainer.tsx +++ b/packages/ui/src/components/hmi/LayoutContainer.tsx @@ -26,6 +26,8 @@ interface LayoutContainerProps { onMoveContainer?: (containerId: string, direction: 'up' | 'down') => void; canMoveContainerUp?: boolean; canMoveContainerDown?: boolean; + selectedWidgetId?: string | null; + onSelectWidget?: (widgetId: string) => void; depth?: number; isCompactMode?: boolean; } @@ -46,6 +48,8 @@ const LayoutContainerComponent: React.FC = ({ onMoveContainer, canMoveContainerUp, canMoveContainerDown, + selectedWidgetId, + onSelectWidget, depth = 0, isCompactMode = false, }) => { @@ -105,6 +109,8 @@ const LayoutContainerComponent: React.FC = ({ widget={widget} isEditMode={isEditMode} pageId={pageId} + isSelected={selectedWidgetId === widget.id} + onSelect={() => onSelectWidget?.(widget.id)} canMoveUp={index > 0} canMoveDown={index < container.widgets.length - 1} onRemove={onRemoveWidget} @@ -160,6 +166,8 @@ const LayoutContainerComponent: React.FC = ({ onMoveContainer={onMoveContainer} canMoveContainerUp={canMoveContainerUp} canMoveContainerDown={canMoveContainerDown} + selectedWidgetId={selectedWidgetId} + onSelectWidget={onSelectWidget} depth={depth + 1} isCompactMode={isCompactMode} /> @@ -437,6 +445,8 @@ interface WidgetItemProps { canMoveDown: boolean; onRemove?: (widgetInstanceId: string) => void; onMove?: (widgetInstanceId: string, direction: 'up' | 'down' | 'left' | 'right') => void; + isSelected?: boolean; + onSelect?: () => void; } const WidgetItem: React.FC = ({ @@ -447,9 +457,11 @@ const WidgetItem: React.FC = ({ canMoveDown, onRemove, onMove, + isSelected, + onSelect }) => { const widgetDefinition = widgetRegistry.get(widget.widgetId); - const { updateWidgetProps } = useLayout(); + const { updateWidgetProps, renameWidget } = useLayout(); const [showSettingsModal, setShowSettingsModal] = useState(false); // pageId is now passed as a prop from the parent component @@ -489,7 +501,7 @@ const WidgetItem: React.FC = ({ }; return ( -
+
{/* Edit Mode Controls */} {isEditMode && ( <> @@ -531,22 +543,47 @@ const WidgetItem: React.FC = ({
- {/* Move Controls - Cross Pattern */} - onMove?.(widget.id, direction)} - canMoveUp={canMoveUp} - canMoveDown={canMoveDown} - /> + + + {/* Move Controls - Cross Pattern (Only show on hover or selection) */} +
+ onMove?.(widget.id, direction)} + canMoveUp={canMoveUp} + canMoveDown={canMoveDown} + /> +
)} - {/* Widget Content - Always 100% width */} -
+ {/* Widget Content - With selection wrapper */} +
{ + if (isEditMode) { + e.preventDefault(); // Prevent focus stealing if clicking background + e.stopPropagation(); + onSelect?.(); + } + }} + > ) => { try { @@ -559,35 +596,20 @@ const WidgetItem: React.FC = ({
{/* Generic Settings Modal */} - {widgetDefinition.metadata.configSchema && showSettingsModal && ( - setShowSettingsModal(false)} - widgetDefinition={widgetDefinition} - currentProps={widget.props || {}} - onSave={handleSettingsSave} - /> - )} -
+ { + widgetDefinition.metadata.configSchema && showSettingsModal && ( + setShowSettingsModal(false)} + widgetDefinition={widgetDefinition} + currentProps={widget.props || {}} + onSave={handleSettingsSave} + /> + ) + } +
); }; -// Conservative comparison function for React.memo -const areLayoutContainerPropsEqual = ( - prevProps: LayoutContainerProps, - nextProps: LayoutContainerProps -): boolean => { - // Conservative approach: only prevent re-render for truly identical props - // Since we're using deep cloning in LayoutContext, object references will change - // when the layout data actually changes, so we can be more conservative here - - return ( - prevProps.isEditMode === nextProps.isEditMode && - prevProps.selectedContainerId === nextProps.selectedContainerId && - prevProps.depth === nextProps.depth && - prevProps.container === nextProps.container // Reference equality check - ); -}; - -// Export memoized component with conservative comparison -export const LayoutContainer = React.memo(LayoutContainerComponent, areLayoutContainerPropsEqual); \ No newline at end of file +// Export without memoization to ensure reliable updates (Selection highlighting fix) +export const LayoutContainer = LayoutContainerComponent; \ No newline at end of file diff --git a/packages/ui/src/components/hmi/SelectionHandler.tsx b/packages/ui/src/components/hmi/SelectionHandler.tsx new file mode 100644 index 00000000..eb7888b5 --- /dev/null +++ b/packages/ui/src/components/hmi/SelectionHandler.tsx @@ -0,0 +1,58 @@ +import React, { useEffect } from 'react'; + +interface SelectionHandlerProps { + onMoveSelection: (direction: 'up' | 'down' | 'left' | 'right') => void; + onClearSelection: () => void; + enabled?: boolean; +} + +export const SelectionHandler: React.FC = ({ + onMoveSelection, + onClearSelection, + enabled = true +}) => { + useEffect(() => { + if (!enabled) return; + + const handleKeyDown = (e: KeyboardEvent) => { + // Ignore if user is typing in a form field + const active = document.activeElement; + if (active && ( + active.tagName === 'INPUT' || + active.tagName === 'TEXTAREA' || + active.tagName === 'SELECT' || + (active as HTMLElement).isContentEditable + )) { + return; + } + + switch (e.key) { + case 'ArrowUp': + e.preventDefault(); + onMoveSelection('up'); + break; + case 'ArrowDown': + e.preventDefault(); + onMoveSelection('down'); + break; + case 'ArrowLeft': + e.preventDefault(); + onMoveSelection('left'); + break; + case 'ArrowRight': + e.preventDefault(); + onMoveSelection('right'); + break; + case 'Escape': + e.preventDefault(); + onClearSelection(); + break; + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [onMoveSelection, onClearSelection, enabled]); + + return null; // Headless component +}; diff --git a/packages/ui/src/components/hmi/WidgetPalette.tsx b/packages/ui/src/components/hmi/WidgetPalette.tsx index 8505b50f..be8e942f 100644 --- a/packages/ui/src/components/hmi/WidgetPalette.tsx +++ b/packages/ui/src/components/hmi/WidgetPalette.tsx @@ -13,10 +13,10 @@ interface WidgetPaletteProps { onWidgetAdd: (widgetId: string) => void; } -export const WidgetPalette: React.FC = ({ - isVisible, - onClose, - onWidgetAdd +export const WidgetPalette: React.FC = ({ + isVisible, + onClose, + onWidgetAdd }) => { const [searchQuery, setSearchQuery] = useState(''); const [selectedCategory, setSelectedCategory] = useState('all'); @@ -47,21 +47,34 @@ export const WidgetPalette: React.FC = ({ if (!isVisible) return null; - const widgets = searchQuery + const allWidgets = widgetRegistry.getAll(); + + // Use a Set to collect unique categories from all widgets + const dynamicCategories = Array.from(new Set([ + 'all', + 'control', + 'display', + 'chart', + 'system', + 'custom', + ...allWidgets.map(w => w.metadata.category) + ])); + + const widgets = searchQuery ? widgetRegistry.search(searchQuery) - : selectedCategory === 'all' - ? widgetRegistry.getAll() + : selectedCategory === 'all' + ? allWidgets : widgetRegistry.getByCategory(selectedCategory); - const categories = ['all', 'control', 'display', 'chart', 'system', 'custom']; + const categories = dynamicCategories; const modalContent = ( -
- e.stopPropagation()} style={{ zIndex: 100000 }} @@ -77,7 +90,7 @@ export const WidgetPalette: React.FC = ({ - + {/* Search */}
@@ -90,7 +103,7 @@ export const WidgetPalette: React.FC = ({ className="pl-8 glass-input" />
- + {/* Categories */}
{categories.map(category => ( @@ -130,7 +143,7 @@ export const WidgetPalette: React.FC = ({
- +
))} - + {widgets.length === 0 && (
No widgets found diff --git a/packages/ui/src/components/playground/PlaygroundHeader.tsx b/packages/ui/src/components/playground/PlaygroundHeader.tsx new file mode 100644 index 00000000..096c4a05 --- /dev/null +++ b/packages/ui/src/components/playground/PlaygroundHeader.tsx @@ -0,0 +1,183 @@ +import React from 'react'; +import { Button } from '@/components/ui/button'; +import { T } from '@/i18n'; +import { Settings, FileJson, LayoutTemplate, Save, ClipboardList, Mail } from 'lucide-react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { LayoutTemplate as ILayoutTemplate } from '@/lib/layoutTemplates'; + +interface PlaygroundHeaderProps { + viewMode: 'design' | 'preview'; + setViewMode: (mode: 'design' | 'preview') => void; + handleExportHtml: () => void; + onSendTestEmail: () => void; + htmlSize?: number; + + // Template Menu + templates: ILayoutTemplate[]; + handleLoadTemplate: (template: ILayoutTemplate) => void; + onSaveTemplateClick: () => void; + + // Other Actions + onPasteJsonClick: () => void; + handleDumpJson: () => void; + handleLoadContext: () => void; + + // Edit Mode + isEditMode: boolean; + setIsEditMode: (mode: boolean) => void; +} + +export const PlaygroundHeader: React.FC = ({ + viewMode, + setViewMode, + handleExportHtml, + onSendTestEmail, + htmlSize, + templates, + handleLoadTemplate, + onSaveTemplateClick, + onPasteJsonClick, + handleDumpJson, + handleLoadContext, + isEditMode, + setIsEditMode +}) => { + return ( +
+
+

Canvas Playground

+

Experiment with widgets and layout

+
+
+ + + +
+ +
+ + + + + + Predefined Layouts + + {templates.filter(t => t.isPredefined).map((t, i) => ( + handleLoadTemplate(t)}> + {t.name} + + ))} + + + My Layouts + + {templates.filter(t => !t.isPredefined).length === 0 && ( +
No saved layouts
+ )} + {templates.filter(t => !t.isPredefined).map((t, i) => ( + handleLoadTemplate(t)}> + {t.name} + + ))} +
+ + + + Save Current as Template... + +
+
+ + + + + + + + {htmlSize !== undefined && ( +
102000 ? 'bg-red-100 text-red-800 border-red-200 dark:bg-red-900/30 dark:text-red-300 dark:border-red-800' : + htmlSize > 80000 ? 'bg-yellow-100 text-yellow-800 border-yellow-200 dark:bg-yellow-900/30 dark:text-yellow-300 dark:border-yellow-800' : + 'bg-slate-100 text-slate-600 border-slate-200 dark:bg-slate-800 dark:text-slate-400 dark:border-slate-700' + }`} title="Gmail clips HTML larger than 102KB"> + {(htmlSize / 1024).toFixed(1)}KB + / 102KB +
+ )} + + + + +
+
+ ); +}; diff --git a/packages/ui/src/components/playground/TemplateDialogs.tsx b/packages/ui/src/components/playground/TemplateDialogs.tsx new file mode 100644 index 00000000..ef9df917 --- /dev/null +++ b/packages/ui/src/components/playground/TemplateDialogs.tsx @@ -0,0 +1,96 @@ +import React from 'react'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Textarea } from '@/components/ui/textarea'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; + +interface TemplateDialogsProps { + // Save Dialog + isSaveDialogOpen: boolean; + setIsSaveDialogOpen: (open: boolean) => void; + newTemplateName: string; + setNewTemplateName: (name: string) => void; + handleSaveTemplate: () => void; + + // Paste JSON Dialog + isPasteDialogOpen: boolean; + setIsPasteDialogOpen: (open: boolean) => void; + pasteJsonContent: string; + setPasteJsonContent: (content: string) => void; + handlePasteJson: () => void; +} + +export const TemplateDialogs: React.FC = ({ + isSaveDialogOpen, + setIsSaveDialogOpen, + newTemplateName, + setNewTemplateName, + handleSaveTemplate, + isPasteDialogOpen, + setIsPasteDialogOpen, + pasteJsonContent, + setPasteJsonContent, + handlePasteJson +}) => { + return ( + <> + + + + Save Layout Template + + Save the current layout configuration to your local browser storage. + + +
+ + setNewTemplateName(e.target.value)} + placeholder="e.g., My Dashboard Layout" + onKeyDown={(e) => e.key === 'Enter' && handleSaveTemplate()} + /> +
+ + + + +
+
+ + + + + Import Layout JSON + + Paste a raw JSON layout string below to import it into the playground. + + +
+ +