From 198c0863021909b375f532dccc130a2dcd0f2726 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 26 Jan 2026 06:32:30 +0000 Subject: [PATCH 1/4] Initial plan From 52cc1f24314f00df9a7f42b3894e05744d2d114d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 26 Jan 2026 06:37:56 +0000 Subject: [PATCH 2/4] Create plugin-calendar-view and move calendar-view component from components/ui Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- packages/components/shadcn-components.json | 15 +++--- packages/components/src/ui/index.ts | 1 - packages/plugin-calendar-view/README.md | 49 +++++++++++++++++ packages/plugin-calendar-view/package.json | 52 +++++++++++++++++++ .../src/index.tsx} | 10 +--- packages/plugin-calendar-view/tsconfig.json | 18 +++++++ packages/plugin-calendar-view/vite.config.ts | 49 +++++++++++++++++ pnpm-lock.yaml | 43 +++++++++++++++ 8 files changed, 221 insertions(+), 16 deletions(-) create mode 100644 packages/plugin-calendar-view/README.md create mode 100644 packages/plugin-calendar-view/package.json rename packages/{components/src/ui/calendar-view.tsx => plugin-calendar-view/src/index.tsx} (98%) create mode 100644 packages/plugin-calendar-view/tsconfig.json create mode 100644 packages/plugin-calendar-view/vite.config.ts diff --git a/packages/components/shadcn-components.json b/packages/components/shadcn-components.json index c6460cd0b..560a6d366 100644 --- a/packages/components/shadcn-components.json +++ b/packages/components/shadcn-components.json @@ -252,12 +252,14 @@ "dependencies": ["button"] }, "calendar-view": { - "description": "Custom ObjectUI component - Full calendar view", - "dependencies": ["calendar"] + "description": "Custom ObjectUI component - Full calendar view (moved to @object-ui/plugin-calendar-view)", + "dependencies": ["calendar"], + "movedToPlugin": "@object-ui/plugin-calendar-view" }, "chatbot": { - "description": "Custom ObjectUI component - Chatbot interface", - "dependencies": ["card", "input", "button"] + "description": "Custom ObjectUI component - Chatbot interface (moved to @object-ui/plugin-chatbot)", + "dependencies": ["card", "input", "button"], + "movedToPlugin": "@object-ui/plugin-chatbot" }, "combobox": { "description": "Custom ObjectUI component - Combo box (select + input)", @@ -296,8 +298,9 @@ "dependencies": [] }, "timeline": { - "description": "Custom ObjectUI component - Timeline component", - "dependencies": [] + "description": "Custom ObjectUI component - Timeline component (moved to @object-ui/plugin-timeline)", + "dependencies": [], + "movedToPlugin": "@object-ui/plugin-timeline" }, "toaster": { "description": "Custom ObjectUI component - Toast container", diff --git a/packages/components/src/ui/index.ts b/packages/components/src/ui/index.ts index d944826a5..539db867f 100644 --- a/packages/components/src/ui/index.ts +++ b/packages/components/src/ui/index.ts @@ -16,7 +16,6 @@ export * from './breadcrumb'; export * from './button-group'; export * from './button'; export * from './calendar'; -export * from './calendar-view'; export * from './card'; export * from './carousel'; export * from './checkbox'; diff --git a/packages/plugin-calendar-view/README.md b/packages/plugin-calendar-view/README.md new file mode 100644 index 000000000..32b946ef1 --- /dev/null +++ b/packages/plugin-calendar-view/README.md @@ -0,0 +1,49 @@ +# @object-ui/plugin-calendar-view + +Full-featured calendar view plugin for Object UI with month, week, and day views. + +## Installation + +```bash +npm install @object-ui/plugin-calendar-view +``` + +## Usage + +```tsx +import { CalendarView } from '@object-ui/plugin-calendar-view'; + +const events = [ + { + id: 1, + title: 'Team Meeting', + start: new Date(2024, 0, 15, 10, 0), + end: new Date(2024, 0, 15, 11, 0), + }, + // ... more events +]; + +function App() { + return ( + console.log('Event clicked:', event)} + onDateClick={(date) => console.log('Date clicked:', date)} + /> + ); +} +``` + +## Features + +- Month, week, and day views +- Event handling and display +- Customizable event colors +- All-day and timed events +- Responsive design +- Built with Tailwind CSS and Shadcn UI + +## License + +MIT diff --git a/packages/plugin-calendar-view/package.json b/packages/plugin-calendar-view/package.json new file mode 100644 index 000000000..6602babce --- /dev/null +++ b/packages/plugin-calendar-view/package.json @@ -0,0 +1,52 @@ +{ + "name": "@object-ui/plugin-calendar-view", + "version": "0.3.0", + "type": "module", + "license": "MIT", + "description": "Calendar view plugin for Object UI", + "homepage": "https://www.objectui.org", + "repository": { + "type": "git", + "url": "https://github.com/objectstack-ai/objectui.git", + "directory": "packages/plugin-calendar-view" + }, + "bugs": { + "url": "https://github.com/objectstack-ai/objectui/issues" + }, + "main": "dist/index.umd.cjs", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.umd.cjs" + } + }, + "scripts": { + "build": "vite build", + "test": "vitest run", + "test:watch": "vitest", + "type-check": "tsc --noEmit", + "lint": "eslint ." + }, + "dependencies": { + "@object-ui/components": "workspace:*", + "@object-ui/core": "workspace:*", + "@object-ui/react": "workspace:*", + "@object-ui/types": "workspace:*", + "lucide-react": "^0.468.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "devDependencies": { + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.2.1", + "typescript": "^5.9.3", + "vite": "^7.3.1", + "vite-plugin-dts": "^4.5.4" + } +} diff --git a/packages/components/src/ui/calendar-view.tsx b/packages/plugin-calendar-view/src/index.tsx similarity index 98% rename from packages/components/src/ui/calendar-view.tsx rename to packages/plugin-calendar-view/src/index.tsx index 7b3c9778f..526d42b65 100644 --- a/packages/components/src/ui/calendar-view.tsx +++ b/packages/plugin-calendar-view/src/index.tsx @@ -10,15 +10,7 @@ import * as React from "react" import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react" -import { cn } from "../lib/utils" -import { Button } from "./button" -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "./select" +import { cn, Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@object-ui/components" const DEFAULT_EVENT_COLOR = "bg-blue-500 text-white" diff --git a/packages/plugin-calendar-view/tsconfig.json b/packages/plugin-calendar-view/tsconfig.json new file mode 100644 index 000000000..22195355d --- /dev/null +++ b/packages/plugin-calendar-view/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "jsx": "react-jsx", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + "noEmit": false, + "declaration": true, + "composite": true, + "declarationMap": true, + "skipLibCheck": true + }, + "include": ["src"], + "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.test.tsx"] +} diff --git a/packages/plugin-calendar-view/vite.config.ts b/packages/plugin-calendar-view/vite.config.ts new file mode 100644 index 000000000..9df9e9ee6 --- /dev/null +++ b/packages/plugin-calendar-view/vite.config.ts @@ -0,0 +1,49 @@ +/** + * ObjectUI + * Copyright (c) 2024-present ObjectStack Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import dts from 'vite-plugin-dts'; +import { resolve } from 'path'; + +export default defineConfig({ + plugins: [ + react(), + dts({ + insertTypesEntry: true, + include: ['src'], + exclude: ['**/*.test.ts', '**/*.test.tsx', 'node_modules'], + skipDiagnostics: true, + }), + ], + resolve: { + alias: { + '@': resolve(__dirname, './src'), + }, + }, + build: { + lib: { + entry: resolve(__dirname, 'src/index.tsx'), + name: 'ObjectUIPluginCalendarView', + fileName: 'index', + }, + rollupOptions: { + external: ['react', 'react-dom', '@object-ui/components', '@object-ui/core', '@object-ui/react', 'lucide-react'], + output: { + globals: { + react: 'React', + 'react-dom': 'ReactDOM', + '@object-ui/components': 'ObjectUIComponents', + '@object-ui/core': 'ObjectUICore', + '@object-ui/react': 'ObjectUIReact', + 'lucide-react': 'LucideReact', + }, + }, + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4cbf5992f..e5c8b6745 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -489,6 +489,49 @@ importers: specifier: ^4.5.4 version: 4.5.4(@types/node@25.0.10)(rollup@4.55.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)) + packages/plugin-calendar-view: + dependencies: + '@object-ui/components': + specifier: workspace:* + version: link:../components + '@object-ui/core': + specifier: workspace:* + version: link:../core + '@object-ui/react': + specifier: workspace:* + version: link:../react + '@object-ui/types': + specifier: workspace:* + version: link:../types + lucide-react: + specifier: ^0.468.0 + version: 0.468.0(react@19.2.3) + react: + specifier: 19.2.3 + version: 19.2.3 + react-dom: + specifier: 19.2.3 + version: 19.2.3(react@19.2.3) + devDependencies: + '@types/react': + specifier: 19.0.6 + version: 19.0.6 + '@types/react-dom': + specifier: 19.0.3 + version: 19.0.3(@types/react@19.0.6) + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.7.0(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2) + vite-plugin-dts: + specifier: ^4.5.4 + version: 4.5.4(@types/node@25.0.10)(rollup@4.55.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)) + packages/plugin-charts: dependencies: '@object-ui/components': From c0b953f7383ec023ccda5aeb1a2bd3a4abea0480 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 26 Jan 2026 06:40:13 +0000 Subject: [PATCH 3/4] Move calendar-view renderer to plugin and remove from components package Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- .../complex-disclosure-renderers.test.tsx | 23 ------------------- .../components/src/renderers/complex/index.ts | 1 - packages/plugin-calendar-view/src/index.tsx | 3 +++ .../src/renderer.tsx} | 2 +- 4 files changed, 4 insertions(+), 25 deletions(-) rename packages/{components/src/renderers/complex/calendar-view.tsx => plugin-calendar-view/src/renderer.tsx} (99%) diff --git a/packages/components/src/__tests__/complex-disclosure-renderers.test.tsx b/packages/components/src/__tests__/complex-disclosure-renderers.test.tsx index 9db428faa..0ce135353 100644 --- a/packages/components/src/__tests__/complex-disclosure-renderers.test.tsx +++ b/packages/components/src/__tests__/complex-disclosure-renderers.test.tsx @@ -224,29 +224,6 @@ describe('Complex Renderers - Display Issue Detection', () => { }); }); - describe('Calendar View Renderer', () => { - it('should be properly registered', () => { - const validation = validateComponentRegistration('calendar-view'); - expect(validation.isRegistered).toBe(true); - }); - - it('should render calendar view', () => { - const { container } = renderComponent({ - type: 'calendar-view', - events: [ - { - id: '1', - title: 'Event 1', - start: '2024-01-01', - end: '2024-01-01', - }, - ], - }); - - expect(container).toBeDefined(); - }); - }); - describe('Table Renderer', () => { it('should be properly registered', () => { const validation = validateComponentRegistration('table'); diff --git a/packages/components/src/renderers/complex/index.ts b/packages/components/src/renderers/complex/index.ts index 5f6e6eac2..2da3a766c 100644 --- a/packages/components/src/renderers/complex/index.ts +++ b/packages/components/src/renderers/complex/index.ts @@ -6,7 +6,6 @@ * LICENSE file in the root directory of this source tree. */ -import './calendar-view'; import './carousel'; import './filter-builder'; import './scroll-area'; diff --git a/packages/plugin-calendar-view/src/index.tsx b/packages/plugin-calendar-view/src/index.tsx index 526d42b65..945ad16ab 100644 --- a/packages/plugin-calendar-view/src/index.tsx +++ b/packages/plugin-calendar-view/src/index.tsx @@ -501,3 +501,6 @@ function DayView({ date, events, onEventClick }: DayViewProps) { } export { CalendarView } + +// Export renderer to register the component with ObjectUI +export * from './renderer'; diff --git a/packages/components/src/renderers/complex/calendar-view.tsx b/packages/plugin-calendar-view/src/renderer.tsx similarity index 99% rename from packages/components/src/renderers/complex/calendar-view.tsx rename to packages/plugin-calendar-view/src/renderer.tsx index 6266d8c2e..a5808fb13 100644 --- a/packages/components/src/renderers/complex/calendar-view.tsx +++ b/packages/plugin-calendar-view/src/renderer.tsx @@ -8,7 +8,7 @@ import { ComponentRegistry } from '@object-ui/core'; import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types'; -import { CalendarView } from '../../ui'; +import { CalendarView } from './index'; import React from 'react'; // Calendar View Renderer - Airtable-style calendar for displaying records as events From 0be1d04e8666544f25f7d07cc65f9755f50cc35c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 26 Jan 2026 06:44:12 +0000 Subject: [PATCH 4/4] Address code review feedback - remove type assertions and improve type safety Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- packages/plugin-calendar-view/src/index.tsx | 2 +- packages/plugin-calendar-view/src/renderer.tsx | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/plugin-calendar-view/src/index.tsx b/packages/plugin-calendar-view/src/index.tsx index 945ad16ab..58ca0933a 100644 --- a/packages/plugin-calendar-view/src/index.tsx +++ b/packages/plugin-calendar-view/src/index.tsx @@ -502,5 +502,5 @@ function DayView({ date, events, onEventClick }: DayViewProps) { export { CalendarView } -// Export renderer to register the component with ObjectUI +// Export renderer for ObjectUI schema integration export * from './renderer'; diff --git a/packages/plugin-calendar-view/src/renderer.tsx b/packages/plugin-calendar-view/src/renderer.tsx index a5808fb13..5ee30b09b 100644 --- a/packages/plugin-calendar-view/src/renderer.tsx +++ b/packages/plugin-calendar-view/src/renderer.tsx @@ -101,10 +101,14 @@ ComponentRegistry.register('calendar-view', } }, [onAction, schema]); + const validView = (schema.view && ['month', 'week', 'day'].includes(schema.view)) + ? (schema.view as "month" | "week" | "day") + : 'month'; + return (