From bde549213e0f14502f2fdab3d498febf5a95af4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antony=20Dur=C3=A1n?= Date: Wed, 26 Feb 2025 16:43:56 -0600 Subject: [PATCH 01/37] chore(page-builder): initial page-builder plugin setup --- plugins/page-builder/.gitignore | 26 +++ plugins/page-builder/README.md | 176 ++++++++++++++++++ plugins/page-builder/package.json | 91 +++++++++ .../src/admin/routes/pages/page.tsx | 25 +++ plugins/page-builder/src/admin/tsconfig.json | 24 +++ plugins/page-builder/src/admin/vite-env.d.ts | 1 + .../page-builder/src/api/admin/pages/route.ts | 14 ++ .../page-builder/src/subscribers/README.md | 59 ++++++ plugins/page-builder/tsconfig.json | 34 ++++ yarn.lock | 61 ++++++ 10 files changed, 511 insertions(+) create mode 100644 plugins/page-builder/.gitignore create mode 100644 plugins/page-builder/README.md create mode 100644 plugins/page-builder/package.json create mode 100644 plugins/page-builder/src/admin/routes/pages/page.tsx create mode 100644 plugins/page-builder/src/admin/tsconfig.json create mode 100644 plugins/page-builder/src/admin/vite-env.d.ts create mode 100644 plugins/page-builder/src/api/admin/pages/route.ts create mode 100644 plugins/page-builder/src/subscribers/README.md create mode 100644 plugins/page-builder/tsconfig.json diff --git a/plugins/page-builder/.gitignore b/plugins/page-builder/.gitignore new file mode 100644 index 00000000..7aa21691 --- /dev/null +++ b/plugins/page-builder/.gitignore @@ -0,0 +1,26 @@ +/dist +.env +.DS_Store +/uploads +/node_modules +yarn-error.log + +.idea + +coverage + +!src/** + +./tsconfig.tsbuildinfo +medusa-db.sql +build +.cache + +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +.medusa \ No newline at end of file diff --git a/plugins/page-builder/README.md b/plugins/page-builder/README.md new file mode 100644 index 00000000..2e18803e --- /dev/null +++ b/plugins/page-builder/README.md @@ -0,0 +1,176 @@ +# @lambdacurry/medusa-page-builder + +A plugin that adds visual page building capabilities to your Medusa application, with built-in components, layouts, and SEO management. + +> This plugin is part of the [Medusa Plugins Collection](https://github.com/lambda-curry/medusa-plugins). + +## Features +> See a demo in our [Medusa Starter](https://github.com/lambda-curry/medusa2-starter) + +- Visual drag-and-drop page builder interface +- Pre-built components library +- Customizable layouts and templates +- Dynamic content management +- SEO optimization tools +- Version control and publishing workflow +- SDK for Store and Admin operations + +## Prerequisites + +- [Medusa >=2.5.0 backend](https://docs.medusajs.com/development/backend/install) +- [PostgreSQL](https://docs.medusajs.com/development/backend/prepare-environment#postgresql) + +## Installation and Configuration + +1. Install the plugin: +```bash +yarn add @lambdacurry/medusa-page-builder + +# or, if you're using yarn workspaces +yarn workspace my-app add @lambdacurry/medusa-page-builder +``` + +2. Add to `medusa-config.ts`: +```js +module.exports = defineConfig({ + plugins: [ + { + resolve: '@lambdacurry/medusa-page-builder', + options: { + defaultPageStatus: 'draft', // OPTIONAL, default is 'published' + components: { + // Define your custom components here + }, + }, + }, + ], +}); +``` + +3. Run migrations: +```bash +yarn medusa db:migrate +``` + +## Using the Plugin SDK + +> For detailed SDK setup and configuration, refer to the [@lambdacurry/medusa-plugins-sdk README](../packages/plugins-sdk/README.md). + +### Store Operations + +```typescript +// List pages +const { pages, count } = await sdk.store.pages.list( + query: StoreListPagesQuery, + headers?: ClientHeaders +); + +// Get a single page +const page = await sdk.store.pages.retrieve( + pageId: string, + headers?: ClientHeaders +); + +// Get page components +const components = await sdk.store.pages.getComponents( + pageId: string, + headers?: ClientHeaders +); +``` + +### Admin Operations + +```typescript +// List pages +const { pages, count } = await sdk.admin.pages.list( + query: AdminListPagesQuery +); + +// Create/Update pages +const page = await sdk.admin.pages.create( + data: AdminCreatePageDTO +); + +const page = await sdk.admin.pages.update( + pageId: string, + data: AdminUpdatePageDTO +); + +// Manage page status +const page = await sdk.admin.pages.updateStatus( + pageId: string, + status: 'draft' | 'published' | 'archived' +); + +// Manage components +const page = await sdk.admin.pages.updateComponents( + pageId: string, + data: AdminUpdatePageComponentsDTO +); +``` + +## Page Workflow + +1. **Creation**: Pages are set to: + - `published` status by default + - `draft` status if `defaultPageStatus: 'draft'` is set in plugin options + +2. **Management**: Admins can: + - Create and edit pages using the visual builder + - Manage page status (draft/published/archived) + - Configure SEO settings + - Manage component layouts and content + +## Available Endpoints + +### Admin Endpoints +- `GET /admin/pages` - List all pages +- `POST /admin/pages` - Create a page +- `GET /admin/pages/:id` - Get a page +- `PUT /admin/pages/:id` - Update a page +- `PUT /admin/pages/:id/status` - Update status +- `PUT /admin/pages/:id/components` - Update components + +### Store Endpoints +- `GET /store/pages` - List published pages +- `GET /store/pages/:id` - Get a published page +- `GET /store/pages/:id/components` - Get page components + +## Local Development + +> **IMPORTANT**: A running PostgreSQL instance is required. The plugin expects `DB_USERNAME` and `DB_PASSWORD` environment variables to be set. If not provided, both default to "postgres". + +Available scripts: +```bash +# Build the plugin +yarn build + +# Development mode with hot-reload +yarn dev + +# Publish to local registry for testing +yarn dev:publish + +# Generate database migrations +yarn db:generate +``` + +### Installing the plugin in your Medusa project for local development +After publishing the plugin locally by running yarn dev:publish, go to the root of your Medusa project and run the following commands: + +```bash +cd path/to/your/medusa-application + +yarn medusa plugin:add @lambdacurry/medusa-page-builder + +# If you are using yarn with a monorepo, you may also need to run +yarn install +``` + +## Compatibility + +This plugin is compatible with versions `>= 2.5.0` of `@medusajs/medusa`. + +## License + +MIT License \ No newline at end of file diff --git a/plugins/page-builder/package.json b/plugins/page-builder/package.json new file mode 100644 index 00000000..b10d59f3 --- /dev/null +++ b/plugins/page-builder/package.json @@ -0,0 +1,91 @@ +{ + "name": "@lambdacurry/medusa-page-builder", + "version": "0.0.1", + "description": "Page Builder Plugin for Medusa", + "author": "Lambda Curry (https://lambdacurry.dev)", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/lambda-curry/medusa-plugins" + }, + "homepage": "https://github.com/lambda-curry/medusa-plugins/tree/main/plugins/page-builder", + "files": [ + ".medusa/server" + ], + "exports": { + "./package.json": "./package.json", + "./workflows": "./.medusa/server/src/workflows/index.js", + "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js", + "./providers/*": "./.medusa/server/src/providers/*/index.js", + "./*": "./.medusa/server/src/*.js" + }, + "keywords": [ + "medusa", + "plugin", + "page-builder", + "medusa-plugin-page-builder", + "medusa-plugin", + "medusa-v2", + "lambdacurry" + ], + "scripts": { + "build": "medusa plugin:build", + "dev": "medusa plugin:develop", + "dev:publish": "medusa plugin:publish", + "prepublishOnly": "medusa plugin:build", + "db:generate": "DB_USERNAME=${DB_USERNAME:-postgres} DB_PASSWORD=${DB_PASSWORD:-postgres} medusa plugin:db:generate" + }, + "devDependencies": { + "@medusajs/admin-sdk": "2.5.0", + "@medusajs/cli": "2.5.0", + "@medusajs/framework": "2.5.0", + "@medusajs/icons": "2.5.0", + "@medusajs/medusa": "2.5.0", + "@medusajs/test-utils": "2.5.0", + "@mikro-orm/cli": "6.4.3", + "@mikro-orm/core": "6.4.3", + "@mikro-orm/knex": "6.4.3", + "@mikro-orm/migrations": "6.4.3", + "@mikro-orm/postgresql": "6.4.3", + "@swc/core": "1.5.7", + "@types/express": "4.17.13", + "@types/node": "^20.0.0", + "@types/react": "^18.3.2", + "@types/react-dom": "^18.2.25", + "awilix": "^8.0.1", + "pg": "^8.13.0", + "prop-types": "^15.8.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "ts-node": "^10.9.2", + "typescript": "^5.6.2", + "vite": "^5.2.11" + }, + "peerDependencies": { + "@medusajs/admin-sdk": "2.5.0", + "@medusajs/cli": "2.5.0", + "@medusajs/framework": "2.5.0", + "@medusajs/icons": "2.5.0", + "@medusajs/medusa": "2.5.0", + "@medusajs/test-utils": "2.5.0", + "@medusajs/ui": "4.0.3", + "@mikro-orm/cli": "6.4.3", + "@mikro-orm/core": "6.4.3", + "@mikro-orm/knex": "6.4.3", + "@mikro-orm/migrations": "6.4.3", + "@mikro-orm/postgresql": "6.4.3", + "awilix": "^8.0.1", + "pg": "^8.13.0" + }, + "engines": { + "node": ">=20" + }, + "installConfig": { + "hoistingLimits": "workspaces" + }, + "dependencies": { + "@lambdacurry/medusa-plugins-sdk": "latest", + "@medusajs/js-sdk": "^2.5.0", + "@medusajs/workflows-sdk": "^2.5.0" + } +} diff --git a/plugins/page-builder/src/admin/routes/pages/page.tsx b/plugins/page-builder/src/admin/routes/pages/page.tsx new file mode 100644 index 00000000..4464e098 --- /dev/null +++ b/plugins/page-builder/src/admin/routes/pages/page.tsx @@ -0,0 +1,25 @@ +import { Container, Heading } from "@medusajs/ui" +import { defineRouteConfig } from "@medusajs/admin-sdk" +import { ChatBubbleLeftRight } from "@medusajs/icons" + +const PagesPage = () => { + return ( + +
+ Page Builder +
+
+ Hello from the Page Builder plugin! +
+
+ ) +} + +export const config = defineRouteConfig({ + label: "Pages", + icon: ChatBubbleLeftRight, +}) + + + +export default PagesPage \ No newline at end of file diff --git a/plugins/page-builder/src/admin/tsconfig.json b/plugins/page-builder/src/admin/tsconfig.json new file mode 100644 index 00000000..ea4bf122 --- /dev/null +++ b/plugins/page-builder/src/admin/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["."] +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/vite-env.d.ts b/plugins/page-builder/src/admin/vite-env.d.ts new file mode 100644 index 00000000..151aa685 --- /dev/null +++ b/plugins/page-builder/src/admin/vite-env.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/plugins/page-builder/src/api/admin/pages/route.ts b/plugins/page-builder/src/api/admin/pages/route.ts new file mode 100644 index 00000000..651b1be3 --- /dev/null +++ b/plugins/page-builder/src/api/admin/pages/route.ts @@ -0,0 +1,14 @@ +import { + AuthenticatedMedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" + +export const GET = async ( + req: AuthenticatedMedusaRequest, + res: MedusaResponse +) => { + res.json({ + success: true, + message: "Page Builder API is working!", + }) +} \ No newline at end of file diff --git a/plugins/page-builder/src/subscribers/README.md b/plugins/page-builder/src/subscribers/README.md new file mode 100644 index 00000000..0f5f58bf --- /dev/null +++ b/plugins/page-builder/src/subscribers/README.md @@ -0,0 +1,59 @@ +# Custom subscribers + +Subscribers handle events emitted in the Medusa application. + +The subscriber is created in a TypeScript or JavaScript file under the `src/subscribers` directory. + +For example, create the file `src/subscribers/product-created.ts` with the following content: + +```ts +import { + type SubscriberConfig, +} from "@medusajs/framework" + +// subscriber function +export default async function productCreateHandler() { + console.log("A product was created") +} + +// subscriber config +export const config: SubscriberConfig = { + event: "product.created", +} +``` + +A subscriber file must export: + +- The subscriber function that is an asynchronous function executed whenever the associated event is triggered. +- A configuration object defining the event this subscriber is listening to. + +## Subscriber Parameters + +A subscriber receives an object having the following properties: + +- `event`: An object holding the event's details. It has a `data` property, which is the event's data payload. +- `container`: The Medusa container. Use it to resolve modules' main services and other registered resources. + +```ts +import type { + SubscriberArgs, + SubscriberConfig, +} from "@medusajs/framework" + +export default async function productCreateHandler({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const productId = data.id + + const productModuleService = container.resolve("product") + + const product = await productModuleService.retrieveProduct(productId) + + console.log(`The product ${product.title} was created`) +} + +export const config: SubscriberConfig = { + event: "product.created", +} +``` \ No newline at end of file diff --git a/plugins/page-builder/tsconfig.json b/plugins/page-builder/tsconfig.json new file mode 100644 index 00000000..af817c80 --- /dev/null +++ b/plugins/page-builder/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2021", + "esModuleInterop": true, + "module": "Node16", + "moduleResolution": "Node16", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declaration": true, + "sourceMap": false, + "inlineSourceMap": true, + "outDir": "./.medusa/server", + "rootDir": "./", + "baseUrl": ".", + "jsx": "react-jsx", + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "checkJs": false, + "strictNullChecks": true + }, + "ts-node": { + "swc": true + }, + "include": ["**/*"], + "exclude": [ + "node_modules", + ".medusa/server", + ".medusa/admin", + "src/admin", + ".cache" + ] +} diff --git a/yarn.lock b/yarn.lock index 1091e494..f767c36f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1854,6 +1854,55 @@ __metadata: languageName: node linkType: hard +"@lambdacurry/medusa-page-builder@workspace:plugins/page-builder": + version: 0.0.0-use.local + resolution: "@lambdacurry/medusa-page-builder@workspace:plugins/page-builder" + dependencies: + "@lambdacurry/medusa-plugins-sdk": "npm:latest" + "@medusajs/admin-sdk": "npm:2.5.0" + "@medusajs/cli": "npm:2.5.0" + "@medusajs/framework": "npm:2.5.0" + "@medusajs/icons": "npm:2.5.0" + "@medusajs/js-sdk": "npm:^2.5.0" + "@medusajs/medusa": "npm:2.5.0" + "@medusajs/test-utils": "npm:2.5.0" + "@medusajs/workflows-sdk": "npm:^2.5.0" + "@mikro-orm/cli": "npm:6.4.3" + "@mikro-orm/core": "npm:6.4.3" + "@mikro-orm/knex": "npm:6.4.3" + "@mikro-orm/migrations": "npm:6.4.3" + "@mikro-orm/postgresql": "npm:6.4.3" + "@swc/core": "npm:1.5.7" + "@types/express": "npm:4.17.13" + "@types/node": "npm:^20.0.0" + "@types/react": "npm:^18.3.2" + "@types/react-dom": "npm:^18.2.25" + awilix: "npm:^8.0.1" + pg: "npm:^8.13.0" + prop-types: "npm:^15.8.1" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + ts-node: "npm:^10.9.2" + typescript: "npm:^5.6.2" + vite: "npm:^5.2.11" + peerDependencies: + "@medusajs/admin-sdk": 2.5.0 + "@medusajs/cli": 2.5.0 + "@medusajs/framework": 2.5.0 + "@medusajs/icons": 2.5.0 + "@medusajs/medusa": 2.5.0 + "@medusajs/test-utils": 2.5.0 + "@medusajs/ui": 4.0.3 + "@mikro-orm/cli": 6.4.3 + "@mikro-orm/core": 6.4.3 + "@mikro-orm/knex": 6.4.3 + "@mikro-orm/migrations": 6.4.3 + "@mikro-orm/postgresql": 6.4.3 + awilix: ^8.0.1 + pg: ^8.13.0 + languageName: unknown + linkType: soft + "@lambdacurry/medusa-plugins-sdk@npm:0.0.5, @lambdacurry/medusa-plugins-sdk@workspace:packages/plugins-sdk": version: 0.0.0-use.local resolution: "@lambdacurry/medusa-plugins-sdk@workspace:packages/plugins-sdk" @@ -1871,6 +1920,18 @@ __metadata: languageName: unknown linkType: soft +"@lambdacurry/medusa-plugins-sdk@npm:latest": + version: 0.0.5 + resolution: "@lambdacurry/medusa-plugins-sdk@npm:0.0.5" + dependencies: + "@medusajs/js-sdk": "npm:^2.5.0" + "@types/express": "npm:^5.0.0" + "@types/multer": "npm:^1.4.12" + form-data: "npm:^4.0.2" + checksum: 10c0/988f9214b4f230f9ed2e843d5ad003097241a9709ad2c34fb773e9201b335e8a4cec620f9e78989f0e7174caa319ad0286c9b92e76c54292e0322716cad6e1e1 + languageName: node + linkType: hard + "@lambdacurry/medusa-product-reviews@workspace:plugins/product-reviews": version: 0.0.0-use.local resolution: "@lambdacurry/medusa-product-reviews@workspace:plugins/product-reviews" From 8d409ae6b0dc5d710c01b3269019aead3efc1182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antony=20Dur=C3=A1n?= Date: Thu, 27 Feb 2025 22:02:05 -0600 Subject: [PATCH 02/37] feat(page-builder): add initial components --- plugins/page-builder/package.json | 28 +- .../src/admin/components/atoms/icon/icon.tsx | 20 + .../src/admin/components/atoms/index.ts | 7 + .../molecules/breadcrumbs/breadcrumbs.tsx | 76 +++ .../src/admin/components/molecules/index.ts | 9 + .../molecules/nav-item/nav-item.tsx | 187 ++++++++ .../sidebar-toggle/sidebar-toggle.tsx | 35 ++ .../organisms/editor-modal/editor-modal.tsx | 207 +++++++++ .../editor-sidebar/editor-sidebar.tsx | 107 +++++ .../src/admin/components/organisms/index.ts | 12 + .../page-settings-sidebar.tsx | 18 + .../desktop-sidebar-container.tsx | 23 + .../mobile-sidebar-container.tsx | 63 +++ .../components/organisms/top-bar/top-bar.tsx | 20 + .../src/admin/components/templates/index.ts | 8 + .../templates/page-layout/page-layout.tsx | 16 + .../admin/components/templates/shell/index.ts | 3 + .../templates/shell/main-content.tsx | 26 ++ .../components/templates/shell/shell.tsx | 25 + .../templates/shell/sidebar-container.tsx | 22 + .../src/admin/hooks/use-loading-state.ts | 14 + plugins/page-builder/src/admin/lib/client.ts | 12 + .../sidebar/editor-sidebar-context.tsx | 15 + .../sidebar/editor-sidebar-provider.tsx | 45 ++ .../src/admin/providers/sidebar/index.ts | 3 + .../providers/sidebar/use-editor-sidebar.tsx | 12 + .../src/admin/routes/pages/edit/[id]/page.tsx | 49 ++ .../src/admin/routes/pages/page.tsx | 13 +- .../page-builder/src/api/admin/pages/route.ts | 8 +- yarn.lock | 437 +++++++++++++++--- 30 files changed, 1425 insertions(+), 95 deletions(-) create mode 100644 plugins/page-builder/src/admin/components/atoms/icon/icon.tsx create mode 100644 plugins/page-builder/src/admin/components/atoms/index.ts create mode 100644 plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx create mode 100644 plugins/page-builder/src/admin/components/molecules/index.ts create mode 100644 plugins/page-builder/src/admin/components/molecules/nav-item/nav-item.tsx create mode 100644 plugins/page-builder/src/admin/components/molecules/sidebar-toggle/sidebar-toggle.tsx create mode 100644 plugins/page-builder/src/admin/components/organisms/editor-modal/editor-modal.tsx create mode 100644 plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx create mode 100644 plugins/page-builder/src/admin/components/organisms/index.ts create mode 100644 plugins/page-builder/src/admin/components/organisms/page-settings-sidebar/page-settings-sidebar.tsx create mode 100644 plugins/page-builder/src/admin/components/organisms/sidebar-container/desktop-sidebar-container.tsx create mode 100644 plugins/page-builder/src/admin/components/organisms/sidebar-container/mobile-sidebar-container.tsx create mode 100644 plugins/page-builder/src/admin/components/organisms/top-bar/top-bar.tsx create mode 100644 plugins/page-builder/src/admin/components/templates/index.ts create mode 100644 plugins/page-builder/src/admin/components/templates/page-layout/page-layout.tsx create mode 100644 plugins/page-builder/src/admin/components/templates/shell/index.ts create mode 100644 plugins/page-builder/src/admin/components/templates/shell/main-content.tsx create mode 100644 plugins/page-builder/src/admin/components/templates/shell/shell.tsx create mode 100644 plugins/page-builder/src/admin/components/templates/shell/sidebar-container.tsx create mode 100644 plugins/page-builder/src/admin/hooks/use-loading-state.ts create mode 100644 plugins/page-builder/src/admin/lib/client.ts create mode 100644 plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-context.tsx create mode 100644 plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-provider.tsx create mode 100644 plugins/page-builder/src/admin/providers/sidebar/index.ts create mode 100644 plugins/page-builder/src/admin/providers/sidebar/use-editor-sidebar.tsx create mode 100644 plugins/page-builder/src/admin/routes/pages/edit/[id]/page.tsx diff --git a/plugins/page-builder/package.json b/plugins/page-builder/package.json index b10d59f3..431616e1 100644 --- a/plugins/page-builder/package.json +++ b/plugins/page-builder/package.json @@ -36,12 +36,12 @@ "db:generate": "DB_USERNAME=${DB_USERNAME:-postgres} DB_PASSWORD=${DB_PASSWORD:-postgres} medusa plugin:db:generate" }, "devDependencies": { - "@medusajs/admin-sdk": "2.5.0", - "@medusajs/cli": "2.5.0", - "@medusajs/framework": "2.5.0", - "@medusajs/icons": "2.5.0", - "@medusajs/medusa": "2.5.0", - "@medusajs/test-utils": "2.5.0", + "@medusajs/admin-sdk": "2.5.1", + "@medusajs/cli": "2.5.1", + "@medusajs/framework": "2.5.1", + "@medusajs/icons": "2.5.1", + "@medusajs/medusa": "2.5.1", + "@medusajs/test-utils": "2.5.1", "@mikro-orm/cli": "6.4.3", "@mikro-orm/core": "6.4.3", "@mikro-orm/knex": "6.4.3", @@ -62,12 +62,12 @@ "vite": "^5.2.11" }, "peerDependencies": { - "@medusajs/admin-sdk": "2.5.0", - "@medusajs/cli": "2.5.0", - "@medusajs/framework": "2.5.0", - "@medusajs/icons": "2.5.0", - "@medusajs/medusa": "2.5.0", - "@medusajs/test-utils": "2.5.0", + "@medusajs/admin-sdk": "2.5.1", + "@medusajs/cli": "2.5.1", + "@medusajs/framework": "2.5.1", + "@medusajs/icons": "2.5.1", + "@medusajs/medusa": "2.5.1", + "@medusajs/test-utils": "2.5.1", "@medusajs/ui": "4.0.3", "@mikro-orm/cli": "6.4.3", "@mikro-orm/core": "6.4.3", @@ -85,7 +85,7 @@ }, "dependencies": { "@lambdacurry/medusa-plugins-sdk": "latest", - "@medusajs/js-sdk": "^2.5.0", - "@medusajs/workflows-sdk": "^2.5.0" + "@medusajs/js-sdk": "^2.5.1", + "@medusajs/workflows-sdk": "^2.5.1" } } diff --git a/plugins/page-builder/src/admin/components/atoms/icon/icon.tsx b/plugins/page-builder/src/admin/components/atoms/icon/icon.tsx new file mode 100644 index 00000000..69d0c6e6 --- /dev/null +++ b/plugins/page-builder/src/admin/components/atoms/icon/icon.tsx @@ -0,0 +1,20 @@ +import { ReactNode } from "react" + +type ItemType = "core" | "extension" | "setting" + +/** + * Icon component that handles different display styles based on item type + */ +export const Icon = ({ icon, type }: { icon?: ReactNode; type: ItemType }) => { + if (!icon) { + return null + } + + return type === "extension" ? ( +
+
{icon}
+
+ ) : ( + icon + ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/atoms/index.ts b/plugins/page-builder/src/admin/components/atoms/index.ts new file mode 100644 index 00000000..ebcad1bc --- /dev/null +++ b/plugins/page-builder/src/admin/components/atoms/index.ts @@ -0,0 +1,7 @@ +/** + * Atoms are the basic building blocks of the UI. + * They are the smallest, indivisible components that can be reused across the application. + */ + +// Export atoms as they are created +export * from './icon/icon' diff --git a/plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx b/plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx new file mode 100644 index 00000000..e498ccf7 --- /dev/null +++ b/plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx @@ -0,0 +1,76 @@ +import { clx } from "@medusajs/ui" +import { TriangleRightMini } from "@medusajs/icons" +import { Link, useLoaderData } from "react-router-dom" + +type Crumb = { + label: string + path: string +} + +/** + * Breadcrumbs component for navigation + */ +export const Breadcrumbs = () => { + const data = useLoaderData() as any + + const crumbs: Crumb[] = [ + { + label: "Home", + path: "/", + }, + { + label: "Pages", + path: "/pages", + }, + ] + + if (data?.page) { + crumbs.push({ + label: data?.page?.title as string, + path: data?.page?.id as string, + }) + } + + return ( +
    + {crumbs.map((crumb, index) => { + const isLast = index === crumbs.length - 1 + const isSingle = crumbs.length === 1 + + return ( +
  1. + {!isLast ? ( + + {crumb.label} + + ) : ( +
    + {!isSingle && ...} + + {crumb.label} + +
    + )} + {!isLast && ( + + + + )} +
  2. + ) + })} +
+ ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/molecules/index.ts b/plugins/page-builder/src/admin/components/molecules/index.ts new file mode 100644 index 00000000..4949bd45 --- /dev/null +++ b/plugins/page-builder/src/admin/components/molecules/index.ts @@ -0,0 +1,9 @@ +/** + * Molecules are groups of atoms bonded together. + * They are relatively simple combinations of UI components that function together as a unit. + */ + +// Export molecules as they are created +export * from './breadcrumbs/breadcrumbs' +export * from './sidebar-toggle/sidebar-toggle' +export * from './nav-item/nav-item' diff --git a/plugins/page-builder/src/admin/components/molecules/nav-item/nav-item.tsx b/plugins/page-builder/src/admin/components/molecules/nav-item/nav-item.tsx new file mode 100644 index 00000000..ad9e5d66 --- /dev/null +++ b/plugins/page-builder/src/admin/components/molecules/nav-item/nav-item.tsx @@ -0,0 +1,187 @@ +import { Text, clx } from "@medusajs/ui" +import { Collapsible as RadixCollapsible } from "radix-ui" +import { + ReactNode, + useCallback, + useEffect, + useState, +} from "react" +import { NavLink, useLocation } from "react-router-dom" +import { Icon } from "../../atoms" + +type ItemType = "core" | "extension" | "setting" + +type NestedItemProps = { + label: string + to: string +} + +export type INavItem = { + icon?: ReactNode + label: string + to: string + items?: NestedItemProps[] + type?: ItemType + from?: string + nested?: string +} + +const BASE_NAV_LINK_CLASSES = + "text-ui-fg-subtle transition-fg hover:bg-ui-bg-subtle-hover flex items-center gap-x-2 rounded-md py-0.5 pl-0.5 pr-2 outline-none [&>svg]:text-ui-fg-subtle focus-visible:shadow-borders-focus" +const ACTIVE_NAV_LINK_CLASSES = + "bg-ui-bg-base shadow-elevation-card-rest text-ui-fg-base hover:bg-ui-bg-base" +const NESTED_NAV_LINK_CLASSES = "pl-[34px] pr-2 py-1 w-full text-ui-fg-muted" +const SETTING_NAV_LINK_CLASSES = "pl-2 py-1" + +const getIsOpen = ( + to: string, + items: NestedItemProps[] | undefined, + pathname: string +) => { + return [to, ...(items?.map((i) => i.to) ?? [])].some((p) => + pathname.startsWith(p) + ) +} + +/** + * Navigation item component with support for nested items + */ +export const NavItem = ({ + icon, + label, + to, + items, + type = "core", + from, +}: INavItem) => { + const { pathname } = useLocation() + const [open, setOpen] = useState(getIsOpen(to, items, pathname)) + + useEffect(() => { + setOpen(getIsOpen(to, items, pathname)) + }, [pathname, to, items]) + + const navLinkClassNames = useCallback( + ({ + to, + isActive, + isNested = false, + isSetting = false, + }: { + to: string + isActive: boolean + isNested?: boolean + isSetting?: boolean + }) => { + if (["core", "setting"].includes(type)) { + isActive = pathname.startsWith(to) + } + + return clx(BASE_NAV_LINK_CLASSES, { + [NESTED_NAV_LINK_CLASSES]: isNested, + [ACTIVE_NAV_LINK_CLASSES]: isActive, + [SETTING_NAV_LINK_CLASSES]: isSetting, + }) + }, + [type, pathname] + ) + + const isSetting = type === "setting" + + return ( +
+ { + return clx(navLinkClassNames({ isActive, isSetting, to }), { + "max-lg:hidden": !!items?.length, + }) + }} + > + {type !== "setting" && ( +
+ +
+ )} + + {label} + +
+ {items && items.length > 0 && ( + + +
+ +
+ + {label} + +
+ +
+
    +
  • + { + return clx( + navLinkClassNames({ + to, + isActive, + isSetting, + isNested: true, + }) + ) + }} + > + + {label} + + +
  • + {items.map((item) => { + return ( +
  • + { + return clx( + navLinkClassNames({ + to: item.to, + isActive, + isSetting, + isNested: true, + }) + ) + }} + > + + {item.label} + + +
  • + ) + })} +
+
+
+
+ )} +
+ ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/molecules/sidebar-toggle/sidebar-toggle.tsx b/plugins/page-builder/src/admin/components/molecules/sidebar-toggle/sidebar-toggle.tsx new file mode 100644 index 00000000..7fcfe9db --- /dev/null +++ b/plugins/page-builder/src/admin/components/molecules/sidebar-toggle/sidebar-toggle.tsx @@ -0,0 +1,35 @@ +import { SidebarLeft, SidebarRight } from "@medusajs/icons" +import { IconButton, Tooltip } from "@medusajs/ui" +import { useEditorSidebar } from "../../../providers/sidebar" + +/** + * Toggle button for showing/hiding sidebars + */ +export const SidebarToggle = ({ side }: { side: "left" | "right" }) => { + const { toggleLeft, toggleRight } = useEditorSidebar() + const toggle = side === "left" ? toggleLeft : toggleRight + const Icon = side === "left" ? SidebarLeft : SidebarRight + + return ( + +
+ toggle("desktop")} + size="small" + > + + + toggle("mobile")} + size="small" + > + + +
+
+ ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/organisms/editor-modal/editor-modal.tsx b/plugins/page-builder/src/admin/components/organisms/editor-modal/editor-modal.tsx new file mode 100644 index 00000000..318d2eb1 --- /dev/null +++ b/plugins/page-builder/src/admin/components/organisms/editor-modal/editor-modal.tsx @@ -0,0 +1,207 @@ +"use client" + +import { XMark } from "@medusajs/icons" +import { clx, IconButton } from "@medusajs/ui" +import { Dialog as RadixDialog } from "radix-ui" +import * as React from "react" + +/** + * @prop defaultOpen - Whether the modal is opened by default. + * @prop open - Whether the modal is opened. + * @prop onOpenChange - A function to handle when the modal is opened or closed. + */ +interface EditorModalRootProps + extends React.ComponentPropsWithoutRef {} + +/** + * This component is based on the [Radix UI Dialog](https://www.radix-ui.com/primitives/docs/components/dialog) primitives. + */ +const EditorModalRoot = (props: EditorModalRootProps) => { + return +} +EditorModalRoot.displayName = "EditorModal" + +interface EditorModalTriggerProps extends React.ComponentPropsWithoutRef {} + +/** + * This component is used to create the trigger button that opens the modal. + * It accepts props from the [Radix UI Dialog Trigger](https://www.radix-ui.com/primitives/docs/components/dialog#trigger) component. + */ +const EditorModalTrigger = React.forwardRef< + React.ElementRef, + EditorModalTriggerProps +>((props: EditorModalTriggerProps, ref) => { + return +}) +EditorModalTrigger.displayName = "EditorModal.Trigger" + +// /** +// * This component is used to create the close button for the modal. +// * It accepts props from the [Radix UI Dialog Close](https://www.radix-ui.com/primitives/docs/components/dialog#close) component. +// */ +// const EditorModalClose = RadixDialog.Close +// EditorModalClose.displayName = "EditorModal.Close" + +interface EditorModalPortalProps extends RadixDialog.DialogPortalProps {} + +/** + * The `EditorModal.Content` component uses this component to wrap the modal content. + * It accepts props from the [Radix UI Dialog Portal](https://www.radix-ui.com/primitives/docs/components/dialog#portal) component. + */ +const EditorModalPortal = (props: EditorModalPortalProps) => { + return ( + + ) +} +EditorModalPortal.displayName = "EditorModal.Portal" + +/** + * This component is used to create the overlay for the modal. + * It accepts props from the [Radix UI Dialog Overlay](https://www.radix-ui.com/primitives/docs/components/dialog#overlay) component. + */ +const EditorModalOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return ( + + ) +}) +EditorModalOverlay.displayName = "EditorModal.Overlay" + +/** + * This component wraps the content of the modal. + * It accepts props from the [Radix UI Dialog Content](https://www.radix-ui.com/primitives/docs/components/dialog#content) component. + */ +const EditorModalContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + overlayProps?: React.ComponentPropsWithoutRef + portalProps?: React.ComponentPropsWithoutRef + } +>(({ className, overlayProps, portalProps, ...props }, ref) => { + return ( + + + + + ) +}) +EditorModalContent.displayName = "EditorModal.Content" + +/** + * This component is used to wrap the header content of the modal. + * This component is based on the `div` element and supports all of its props + */ +const EditorModalHeader = React.forwardRef< + HTMLDivElement, + React.ComponentPropsWithoutRef<"div"> +>(({ children, className, ...props }, ref) => { + return ( +
+ {/*
+ + + + + +
*/} + {children} +
+ ) +}) +EditorModalHeader.displayName = "EditorModal.Header" + +/** + * This component is used to wrap the footer content of the modal. + * This component is based on the `div` element and supports all of its props + */ +const EditorModalFooter = React.forwardRef< + HTMLDivElement, + React.ComponentPropsWithoutRef<"div"> +>(({ children, className, ...props }, ref) => { + return ( +
+ {children} +
+ ) +}) +EditorModalFooter.displayName = "EditorModal.Footer" + +interface EditorModalTitleProps extends React.ComponentPropsWithoutRef {} + +/** + * This component adds an accessible title to the modal. + * It accepts props from the [Radix UI Dialog Title](https://www.radix-ui.com/primitives/docs/components/dialog#title) component. + */ +const EditorModalTitle = React.forwardRef< + HTMLHeadingElement, + EditorModalTitleProps +>(({ className, ...props }: EditorModalTitleProps, ref) => { + return ( + + ) +}) +EditorModalTitle.displayName = "EditorModal.Title" + +/** + * This component adds accessible description to the modal. + * It accepts props from the [Radix UI Dialog Description](https://www.radix-ui.com/primitives/docs/components/dialog#description) component. + */ +const EditorModalDescription = RadixDialog.Description +EditorModalDescription.displayName = "EditorModal.Description" + +/** + * This component is used to wrap the body content of the modal. + * This component is based on the `div` element and supports all of its props + */ +const EditorModalBody = React.forwardRef< + HTMLDivElement, + React.ComponentPropsWithoutRef<"div"> +>(({ className, ...props }, ref) => { + return
+}) +EditorModalBody.displayName = "EditorModal.Body" + +const EditorModal = Object.assign(EditorModalRoot, { + Trigger: EditorModalTrigger, + Title: EditorModalTitle, + Description: EditorModalDescription, + Content: EditorModalContent, + Header: EditorModalHeader, + Body: EditorModalBody, + // Close: EditorModalClose, + Footer: EditorModalFooter, +}) + +export { EditorModal } \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx b/plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx new file mode 100644 index 00000000..ea67e09e --- /dev/null +++ b/plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx @@ -0,0 +1,107 @@ +import { + ShoppingCart, + Tag, + Buildings, + Users, + ReceiptPercent, + CurrencyDollar, +} from "@medusajs/icons" +import { INavItem, NavItem } from "../../../components/molecules/nav-item/nav-item" + +/** + * Sidebar for the page editor with sections menu + */ +export const EditorSidebar = () => { + return ( + + ) +} + +const useCoreRoutes = (): Omit[] => { + return [ + { + icon: , + label: 'orders', + to: "/orders", + items: [ + // TODO: Enable when domin is introduced + // { + // label: 'draftOrders', + // to: "/draft-orders", + // }, + ], + }, + { + icon: , + label: 'products', + to: "/products", + items: [ + { + label: 'collections', + to: "/collections", + }, + { + label: 'categories', + to: "/categories", + }, + // TODO: Enable when domin is introduced + // { + // label: 'giftCards', + // to: "/gift-cards", + // }, + ], + }, + { + icon: , + label: 'inventory', + to: "/inventory", + items: [ + { + label: 'reservations', + to: "/reservations", + }, + ], + }, + { + icon: , + label: 'customers', + to: "/customers", + items: [ + { + label: 'customerGroups', + to: "/customer-groups", + }, + ], + }, + { + icon: , + label: 'promotions', + to: "/promotions", + items: [ + { + label: 'campaigns', + to: "/campaigns", + }, + ], + }, + { + icon: , + label: 'priceLists', + to: "/price-lists", + }, + ] +} + +const SectionsMenu = () => { + const coreRoutes = useCoreRoutes() + + return ( + + ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/organisms/index.ts b/plugins/page-builder/src/admin/components/organisms/index.ts new file mode 100644 index 00000000..9162987c --- /dev/null +++ b/plugins/page-builder/src/admin/components/organisms/index.ts @@ -0,0 +1,12 @@ +/** + * Organisms are complex UI components composed of groups of molecules and/or atoms. + * They form distinct sections of the interface. + */ + +// Export organisms as they are created +export * from './top-bar/top-bar' +export * from './editor-modal/editor-modal' +export * from './sidebar-container/desktop-sidebar-container' +export * from './sidebar-container/mobile-sidebar-container' +export * from './editor-sidebar/editor-sidebar' +export * from './page-settings-sidebar/page-settings-sidebar' diff --git a/plugins/page-builder/src/admin/components/organisms/page-settings-sidebar/page-settings-sidebar.tsx b/plugins/page-builder/src/admin/components/organisms/page-settings-sidebar/page-settings-sidebar.tsx new file mode 100644 index 00000000..71ee92d9 --- /dev/null +++ b/plugins/page-builder/src/admin/components/organisms/page-settings-sidebar/page-settings-sidebar.tsx @@ -0,0 +1,18 @@ +/** + * Sidebar for page settings + */ +export const PageSettingsSidebar = () => { + return ( + + ) +} + +const PageSettingsMenu = () => { + return ( +
+

Page Settings

+
+ ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/organisms/sidebar-container/desktop-sidebar-container.tsx b/plugins/page-builder/src/admin/components/organisms/sidebar-container/desktop-sidebar-container.tsx new file mode 100644 index 00000000..621e58a5 --- /dev/null +++ b/plugins/page-builder/src/admin/components/organisms/sidebar-container/desktop-sidebar-container.tsx @@ -0,0 +1,23 @@ +import { clx } from "@medusajs/ui" +import { PropsWithChildren } from "react" +import { useEditorSidebar } from "../../../providers/sidebar" + +/** + * Desktop sidebar container component + */ +export const DesktopSidebarContainer = ({ children, side = "left" }: PropsWithChildren & { side?: "left" | "right" }) => { + const { left, right } = useEditorSidebar() + const isOpen = side === "left" ? left.desktop : right.desktop + + return ( +
+ {children} +
+ ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/organisms/sidebar-container/mobile-sidebar-container.tsx b/plugins/page-builder/src/admin/components/organisms/sidebar-container/mobile-sidebar-container.tsx new file mode 100644 index 00000000..b0102473 --- /dev/null +++ b/plugins/page-builder/src/admin/components/organisms/sidebar-container/mobile-sidebar-container.tsx @@ -0,0 +1,63 @@ +import { XMark } from "@medusajs/icons" +import { IconButton, clx } from "@medusajs/ui" +import { Dialog as RadixDialog } from "radix-ui" +import { PropsWithChildren } from "react" +import { useTranslation } from "react-i18next" +import { useEditorSidebar } from "../../../providers/sidebar" + +/** + * Mobile sidebar container component + */ +export const MobileSidebarContainer = ({ children, side = "left" }: PropsWithChildren & { side?: "left" | "right" }) => { + const { t } = useTranslation() + const { left, right, toggleLeft, toggleRight } = useEditorSidebar() + const isOpen = side === "left" ? left.mobile : right.mobile + const toggle = side === "left" ? toggleLeft : toggleRight + + return ( + toggle("mobile")}> + + + +
+ + + + + + + {t("app.nav.accessibility.title")} + + + {t("app.nav.accessibility.description")} + +
+ {children} +
+
+
+ ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/organisms/top-bar/top-bar.tsx b/plugins/page-builder/src/admin/components/organisms/top-bar/top-bar.tsx new file mode 100644 index 00000000..2b15b286 --- /dev/null +++ b/plugins/page-builder/src/admin/components/organisms/top-bar/top-bar.tsx @@ -0,0 +1,20 @@ +import { Button } from "@medusajs/ui" +import { Breadcrumbs, SidebarToggle } from "../../molecules" + +/** + * Top navigation bar component for the page editor + */ +export const Topbar = () => { + return ( +
+
+ + +
+
+ + +
+
+ ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/templates/index.ts b/plugins/page-builder/src/admin/components/templates/index.ts new file mode 100644 index 00000000..9605b29f --- /dev/null +++ b/plugins/page-builder/src/admin/components/templates/index.ts @@ -0,0 +1,8 @@ +/** + * Templates are page-level objects that place components into a layout. + * They focus on the page's structure rather than the data being displayed. + */ + +// Export templates as they are created +export * from './page-layout/page-layout' +export * from './shell/shell' diff --git a/plugins/page-builder/src/admin/components/templates/page-layout/page-layout.tsx b/plugins/page-builder/src/admin/components/templates/page-layout/page-layout.tsx new file mode 100644 index 00000000..70969ad2 --- /dev/null +++ b/plugins/page-builder/src/admin/components/templates/page-layout/page-layout.tsx @@ -0,0 +1,16 @@ +import { PropsWithChildren } from "react" +import { Shell } from "../shell/shell" +import { EditorSidebar } from "../../organisms/editor-sidebar/editor-sidebar" +import { PageSettingsSidebar } from "../../organisms/page-settings-sidebar/page-settings-sidebar" + +/** + * Page layout template for the page editor + * Provides the main layout structure with sidebars + */ +export const PageLayout = ({ children }: PropsWithChildren) => { + return ( + } rightSidebar={}> + {children} + + ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/templates/shell/index.ts b/plugins/page-builder/src/admin/components/templates/shell/index.ts new file mode 100644 index 00000000..c11d2ee8 --- /dev/null +++ b/plugins/page-builder/src/admin/components/templates/shell/index.ts @@ -0,0 +1,3 @@ +export * from './shell' +export * from './main-content' +export * from './sidebar-container' diff --git a/plugins/page-builder/src/admin/components/templates/shell/main-content.tsx b/plugins/page-builder/src/admin/components/templates/shell/main-content.tsx new file mode 100644 index 00000000..a5ccc5b0 --- /dev/null +++ b/plugins/page-builder/src/admin/components/templates/shell/main-content.tsx @@ -0,0 +1,26 @@ +import { clx } from "@medusajs/ui" +import { PropsWithChildren } from "react" +import { useLoadingState } from "../../../hooks/use-loading-state" + +/** + * MainContent component that handles the main content area + * Manages loading state visualization + */ +export const MainContent = ({ children }: PropsWithChildren) => { + const { isLoading } = useLoadingState() + + return ( +
+
+ {children} +
+
+ ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/templates/shell/shell.tsx b/plugins/page-builder/src/admin/components/templates/shell/shell.tsx new file mode 100644 index 00000000..bd9fc1ba --- /dev/null +++ b/plugins/page-builder/src/admin/components/templates/shell/shell.tsx @@ -0,0 +1,25 @@ +import { TooltipProvider } from "@medusajs/ui" +import { PropsWithChildren, ReactNode } from "react" +import { MainContent } from "./main-content" +import { SidebarContainer } from "./sidebar-container" + +interface ShellProps extends PropsWithChildren { + leftSidebar?: ReactNode + rightSidebar?: ReactNode +} + +/** + * Shell template component that provides the main application structure + * Composes the layout using specialized components for each section + */ +export const Shell = ({ children, leftSidebar, rightSidebar }: ShellProps) => { + return ( + +
+ {leftSidebar} + {children} + {rightSidebar} +
+
+ ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/templates/shell/sidebar-container.tsx b/plugins/page-builder/src/admin/components/templates/shell/sidebar-container.tsx new file mode 100644 index 00000000..4e12743d --- /dev/null +++ b/plugins/page-builder/src/admin/components/templates/shell/sidebar-container.tsx @@ -0,0 +1,22 @@ +import { PropsWithChildren, ReactNode } from "react" +import { DesktopSidebarContainer, MobileSidebarContainer } from "../../organisms" + +interface SidebarContainerProps extends PropsWithChildren { + side: "left" | "right" +} + +/** + * SidebarContainer component that handles both mobile and desktop sidebar containers + */ +export const SidebarContainer = ({ children, side }: SidebarContainerProps) => { + if (!children) { + return null + } + + return ( +
+ {children} + {children} +
+ ) +} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/hooks/use-loading-state.ts b/plugins/page-builder/src/admin/hooks/use-loading-state.ts new file mode 100644 index 00000000..9b4770f0 --- /dev/null +++ b/plugins/page-builder/src/admin/hooks/use-loading-state.ts @@ -0,0 +1,14 @@ +import { useNavigation } from 'react-router-dom' + +/** + * Hook to track the loading state of the application + * @returns Object containing the loading state + */ +export const useLoadingState = () => { + const navigation = useNavigation() + const isLoading = navigation.state === 'loading' + + return { + isLoading, + } +} diff --git a/plugins/page-builder/src/admin/lib/client.ts b/plugins/page-builder/src/admin/lib/client.ts new file mode 100644 index 00000000..4be38dad --- /dev/null +++ b/plugins/page-builder/src/admin/lib/client.ts @@ -0,0 +1,12 @@ +import Medusa from '@medusajs/js-sdk' + +declare const __BACKEND_URL__: string | undefined + +export const backendUrl = __BACKEND_URL__ ?? 'http://localhost:9000' + +export const sdk = new Medusa({ + baseUrl: backendUrl, + auth: { + type: 'session', + }, +}) diff --git a/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-context.tsx b/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-context.tsx new file mode 100644 index 00000000..4ffda39e --- /dev/null +++ b/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-context.tsx @@ -0,0 +1,15 @@ +import { createContext } from "react" + +type EditorSidebarState = { + desktop: boolean + mobile: boolean +} + +type EditorSidebarContextValue = { + left: EditorSidebarState + right: EditorSidebarState + toggleLeft: (view: "desktop" | "mobile") => void + toggleRight: (view: "desktop" | "mobile") => void +} + +export const EditorSidebarContext = createContext(null) diff --git a/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-provider.tsx b/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-provider.tsx new file mode 100644 index 00000000..b82140e2 --- /dev/null +++ b/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-provider.tsx @@ -0,0 +1,45 @@ +import { ReactNode, useState } from "react" +import { EditorSidebarContext } from "./editor-sidebar-context" + +interface EditorSidebarProviderProps { + children: ReactNode +} + +export const EditorSidebarProvider = ({ children }: EditorSidebarProviderProps) => { + const [leftSidebar, setLeftSidebar] = useState({ + desktop: true, + mobile: false, + }) + + const [rightSidebar, setRightSidebar] = useState({ + desktop: false, + mobile: false, + }) + + const toggleLeft = (view: "desktop" | "mobile") => { + setLeftSidebar((prev) => ({ + ...prev, + [view]: !prev[view], + })) + } + + const toggleRight = (view: "desktop" | "mobile") => { + setRightSidebar((prev) => ({ + ...prev, + [view]: !prev[view], + })) + } + + return ( + + {children} + + ) +} diff --git a/plugins/page-builder/src/admin/providers/sidebar/index.ts b/plugins/page-builder/src/admin/providers/sidebar/index.ts new file mode 100644 index 00000000..fbf096f2 --- /dev/null +++ b/plugins/page-builder/src/admin/providers/sidebar/index.ts @@ -0,0 +1,3 @@ +export * from './editor-sidebar-context' +export * from './editor-sidebar-provider' +export * from './use-editor-sidebar' diff --git a/plugins/page-builder/src/admin/providers/sidebar/use-editor-sidebar.tsx b/plugins/page-builder/src/admin/providers/sidebar/use-editor-sidebar.tsx new file mode 100644 index 00000000..5e6f3436 --- /dev/null +++ b/plugins/page-builder/src/admin/providers/sidebar/use-editor-sidebar.tsx @@ -0,0 +1,12 @@ +import { useContext } from "react" +import { EditorSidebarContext } from "./editor-sidebar-context" + +export const useEditorSidebar = () => { + const context = useContext(EditorSidebarContext) + + if (!context) { + throw new Error("useEditorSidebar must be used within a EditorSidebarProvider") + } + + return context +} diff --git a/plugins/page-builder/src/admin/routes/pages/edit/[id]/page.tsx b/plugins/page-builder/src/admin/routes/pages/edit/[id]/page.tsx new file mode 100644 index 00000000..20dbd49a --- /dev/null +++ b/plugins/page-builder/src/admin/routes/pages/edit/[id]/page.tsx @@ -0,0 +1,49 @@ +import { Button } from "@medusajs/ui" +import { LoaderFunctionArgs, useLoaderData, useParams } from "react-router-dom" +import { PageLayout } from "../../../../components/templates" +import { EditorSidebarProvider } from "../../../../providers/sidebar" +import { AnimatePresence } from "motion/react" +import { useState } from "react" +import { useEffect } from "react" +import { EditorModal, Topbar } from "../../../../components/organisms" + +export async function loader({ params }: LoaderFunctionArgs) { + // TODO fetch page + + console.log("🚀 ~ loader ~ pages/:id ~ params:", params) + + return { + page: { + id: params.id, + title: "Test Page", + description: "Test Page Description", + content: "Test Page Content", + }, + } +} + +const PageDetailsPage = () => { + const { id } = useParams() + console.log("🚀 ~ PageDetailsPage ~ id:", id) + const pageData = useLoaderData() as Awaited> + console.log("🚀 ~ PageDetailsPage ~ page:", pageData) + + return ( + + + + + + + + +

Page Details2

+
+
+
+
+
+ ) +} + +export default PageDetailsPage diff --git a/plugins/page-builder/src/admin/routes/pages/page.tsx b/plugins/page-builder/src/admin/routes/pages/page.tsx index 4464e098..64b7a619 100644 --- a/plugins/page-builder/src/admin/routes/pages/page.tsx +++ b/plugins/page-builder/src/admin/routes/pages/page.tsx @@ -1,6 +1,7 @@ -import { Container, Heading } from "@medusajs/ui" +import { Container, Heading, Button } from "@medusajs/ui" import { defineRouteConfig } from "@medusajs/admin-sdk" -import { ChatBubbleLeftRight } from "@medusajs/icons" +import { DocumentText } from "@medusajs/icons" +import { Link } from "react-router-dom" const PagesPage = () => { return ( @@ -9,7 +10,9 @@ const PagesPage = () => { Page Builder
- Hello from the Page Builder plugin! + + +
) @@ -17,9 +20,7 @@ const PagesPage = () => { export const config = defineRouteConfig({ label: "Pages", - icon: ChatBubbleLeftRight, + icon: DocumentText, }) - - export default PagesPage \ No newline at end of file diff --git a/plugins/page-builder/src/api/admin/pages/route.ts b/plugins/page-builder/src/api/admin/pages/route.ts index 651b1be3..6dbb0f27 100644 --- a/plugins/page-builder/src/api/admin/pages/route.ts +++ b/plugins/page-builder/src/api/admin/pages/route.ts @@ -1,14 +1,14 @@ import { AuthenticatedMedusaRequest, MedusaResponse, -} from "@medusajs/framework/http" +} from '@medusajs/framework/http' export const GET = async ( req: AuthenticatedMedusaRequest, - res: MedusaResponse + res: MedusaResponse, ) => { res.json({ success: true, - message: "Page Builder API is working!", + message: 'Page Builder API is working!!', }) -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index f767c36f..d76413bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1859,14 +1859,14 @@ __metadata: resolution: "@lambdacurry/medusa-page-builder@workspace:plugins/page-builder" dependencies: "@lambdacurry/medusa-plugins-sdk": "npm:latest" - "@medusajs/admin-sdk": "npm:2.5.0" - "@medusajs/cli": "npm:2.5.0" - "@medusajs/framework": "npm:2.5.0" - "@medusajs/icons": "npm:2.5.0" - "@medusajs/js-sdk": "npm:^2.5.0" - "@medusajs/medusa": "npm:2.5.0" - "@medusajs/test-utils": "npm:2.5.0" - "@medusajs/workflows-sdk": "npm:^2.5.0" + "@medusajs/admin-sdk": "npm:2.5.1" + "@medusajs/cli": "npm:2.5.1" + "@medusajs/framework": "npm:2.5.1" + "@medusajs/icons": "npm:2.5.1" + "@medusajs/js-sdk": "npm:^2.5.1" + "@medusajs/medusa": "npm:2.5.1" + "@medusajs/test-utils": "npm:2.5.1" + "@medusajs/workflows-sdk": "npm:^2.5.1" "@mikro-orm/cli": "npm:6.4.3" "@mikro-orm/core": "npm:6.4.3" "@mikro-orm/knex": "npm:6.4.3" @@ -1886,12 +1886,12 @@ __metadata: typescript: "npm:^5.6.2" vite: "npm:^5.2.11" peerDependencies: - "@medusajs/admin-sdk": 2.5.0 - "@medusajs/cli": 2.5.0 - "@medusajs/framework": 2.5.0 - "@medusajs/icons": 2.5.0 - "@medusajs/medusa": 2.5.0 - "@medusajs/test-utils": 2.5.0 + "@medusajs/admin-sdk": 2.5.1 + "@medusajs/cli": 2.5.1 + "@medusajs/framework": 2.5.1 + "@medusajs/icons": 2.5.1 + "@medusajs/medusa": 2.5.1 + "@medusajs/test-utils": 2.5.1 "@medusajs/ui": 4.0.3 "@mikro-orm/cli": 6.4.3 "@mikro-orm/core": 6.4.3 @@ -1903,7 +1903,19 @@ __metadata: languageName: unknown linkType: soft -"@lambdacurry/medusa-plugins-sdk@npm:0.0.5, @lambdacurry/medusa-plugins-sdk@workspace:packages/plugins-sdk": +"@lambdacurry/medusa-plugins-sdk@npm:0.0.5, @lambdacurry/medusa-plugins-sdk@npm:latest": + version: 0.0.5 + resolution: "@lambdacurry/medusa-plugins-sdk@npm:0.0.5" + dependencies: + "@medusajs/js-sdk": "npm:^2.5.0" + "@types/express": "npm:^5.0.0" + "@types/multer": "npm:^1.4.12" + form-data: "npm:^4.0.2" + checksum: 10c0/988f9214b4f230f9ed2e843d5ad003097241a9709ad2c34fb773e9201b335e8a4cec620f9e78989f0e7174caa319ad0286c9b92e76c54292e0322716cad6e1e1 + languageName: node + linkType: hard + +"@lambdacurry/medusa-plugins-sdk@workspace:packages/plugins-sdk": version: 0.0.0-use.local resolution: "@lambdacurry/medusa-plugins-sdk@workspace:packages/plugins-sdk" dependencies: @@ -1920,18 +1932,6 @@ __metadata: languageName: unknown linkType: soft -"@lambdacurry/medusa-plugins-sdk@npm:latest": - version: 0.0.5 - resolution: "@lambdacurry/medusa-plugins-sdk@npm:0.0.5" - dependencies: - "@medusajs/js-sdk": "npm:^2.5.0" - "@types/express": "npm:^5.0.0" - "@types/multer": "npm:^1.4.12" - form-data: "npm:^4.0.2" - checksum: 10c0/988f9214b4f230f9ed2e843d5ad003097241a9709ad2c34fb773e9201b335e8a4cec620f9e78989f0e7174caa319ad0286c9b92e76c54292e0322716cad6e1e1 - languageName: node - linkType: hard - "@lambdacurry/medusa-product-reviews@workspace:plugins/product-reviews": version: 0.0.0-use.local resolution: "@lambdacurry/medusa-product-reviews@workspace:plugins/product-reviews" @@ -2044,7 +2044,7 @@ __metadata: languageName: unknown linkType: soft -"@medusajs/admin-bundler@npm:^2.5.0": +"@medusajs/admin-bundler@npm:^2.5.0, @medusajs/admin-bundler@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/admin-bundler@npm:2.5.1" dependencies: @@ -2110,6 +2110,16 @@ __metadata: languageName: node linkType: hard +"@medusajs/admin-sdk@npm:2.5.1": + version: 2.5.1 + resolution: "@medusajs/admin-sdk@npm:2.5.1" + dependencies: + "@medusajs/admin-shared": "npm:^2.5.1" + zod: "npm:3.22.4" + checksum: 10c0/4741057fef67a08fa6fab2fa89f742005d4a4e31d35687eb8539941c9f2ffba22d12803cd0c2a6d9576a213a84fe5804bf60f9ac94f0e1efd393d1cad9ffea0d + languageName: node + linkType: hard + "@medusajs/admin-shared@npm:2.4.0, @medusajs/admin-shared@npm:~2.4.0": version: 2.4.0 resolution: "@medusajs/admin-shared@npm:2.4.0" @@ -2162,7 +2172,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/api-key@npm:^2.5.0": +"@medusajs/api-key@npm:^2.5.0, @medusajs/api-key@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/api-key@npm:2.5.1" peerDependencies: @@ -2188,7 +2198,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/auth-emailpass@npm:^2.5.0": +"@medusajs/auth-emailpass@npm:^2.5.0, @medusajs/auth-emailpass@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/auth-emailpass@npm:2.5.1" dependencies: @@ -2210,7 +2220,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/auth-github@npm:^2.5.0": +"@medusajs/auth-github@npm:^2.5.0, @medusajs/auth-github@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/auth-github@npm:2.5.1" peerDependencies: @@ -2228,7 +2238,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/auth-google@npm:^2.5.0": +"@medusajs/auth-google@npm:^2.5.0, @medusajs/auth-google@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/auth-google@npm:2.5.1" dependencies: @@ -2250,7 +2260,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/auth@npm:^2.5.0": +"@medusajs/auth@npm:^2.5.0, @medusajs/auth@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/auth@npm:2.5.1" peerDependencies: @@ -2276,7 +2286,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/cache-inmemory@npm:^2.5.0": +"@medusajs/cache-inmemory@npm:^2.5.0, @medusajs/cache-inmemory@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/cache-inmemory@npm:2.5.1" peerDependencies: @@ -2294,7 +2304,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/cache-redis@npm:^2.5.0": +"@medusajs/cache-redis@npm:^2.5.0, @medusajs/cache-redis@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/cache-redis@npm:2.5.1" dependencies: @@ -2318,7 +2328,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/cart@npm:^2.5.0": +"@medusajs/cart@npm:^2.5.0, @medusajs/cart@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/cart@npm:2.5.1" peerDependencies: @@ -2426,7 +2436,48 @@ __metadata: languageName: node linkType: hard -"@medusajs/core-flows@npm:^2.5.0": +"@medusajs/cli@npm:2.5.1": + version: 2.5.1 + resolution: "@medusajs/cli@npm:2.5.1" + dependencies: + "@medusajs/telemetry": "npm:^2.5.1" + "@medusajs/utils": "npm:2.5.1" + "@types/express": "npm:^4.17.17" + chalk: "npm:^4.0.0" + configstore: "npm:5.0.1" + dotenv: "npm:^16.4.5" + execa: "npm:^5.1.1" + express: "npm:^4.21.0" + fs-exists-cached: "npm:^1.0.0" + fs-extra: "npm:^10.0.0" + glob: "npm:^10.3.10" + hosted-git-info: "npm:^4.0.2" + inquirer: "npm:^8.0.0" + is-valid-path: "npm:^0.1.1" + meant: "npm:^1.0.3" + ora: "npm:^5.4.1" + pg: "npm:^8.11.3" + pg-god: "npm:^1.0.12" + prompts: "npm:^2.4.2" + resolve-cwd: "npm:^3.0.0" + stack-trace: "npm:^0.0.10" + ulid: "npm:^2.3.0" + winston: "npm:^3.8.2" + yargs: "npm:^15.3.1" + peerDependencies: + "@mikro-orm/core": 6.4.3 + "@mikro-orm/knex": 6.4.3 + "@mikro-orm/migrations": 6.4.3 + "@mikro-orm/postgresql": 6.4.3 + awilix: ^8.0.1 + pg: ^8.13.0 + bin: + medusa: cli.js + checksum: 10c0/17ade83834331c5757aaad365aa6af3265e5b0ac340e308bc89e3546d26b3dae8463ab63ea4e62f89845e0cb7ac6be0d998408060b8cdd99f9fd357c8ca5a7ac + languageName: node + linkType: hard + +"@medusajs/core-flows@npm:^2.5.0, @medusajs/core-flows@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/core-flows@npm:2.5.1" dependencies: @@ -2450,7 +2501,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/currency@npm:^2.5.0": +"@medusajs/currency@npm:^2.5.0, @medusajs/currency@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/currency@npm:2.5.1" peerDependencies: @@ -2476,7 +2527,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/customer@npm:^2.5.0": +"@medusajs/customer@npm:^2.5.0, @medusajs/customer@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/customer@npm:2.5.1" peerDependencies: @@ -2584,7 +2635,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/event-bus-local@npm:^2.5.0": +"@medusajs/event-bus-local@npm:^2.5.0, @medusajs/event-bus-local@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/event-bus-local@npm:2.5.1" dependencies: @@ -2606,7 +2657,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/event-bus-redis@npm:^2.5.0": +"@medusajs/event-bus-redis@npm:^2.5.0, @medusajs/event-bus-redis@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/event-bus-redis@npm:2.5.1" dependencies: @@ -2632,7 +2683,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/file-local@npm:^2.5.0": +"@medusajs/file-local@npm:^2.5.0, @medusajs/file-local@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/file-local@npm:2.5.1" peerDependencies: @@ -2650,7 +2701,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/file-s3@npm:^2.5.0": +"@medusajs/file-s3@npm:^2.5.0, @medusajs/file-s3@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/file-s3@npm:2.5.1" dependencies: @@ -2676,7 +2727,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/file@npm:^2.5.0": +"@medusajs/file@npm:^2.5.0, @medusajs/file@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/file@npm:2.5.1" peerDependencies: @@ -2796,7 +2847,57 @@ __metadata: languageName: node linkType: hard -"@medusajs/fulfillment-manual@npm:^2.5.0": +"@medusajs/framework@npm:2.5.1": + version: 2.5.1 + resolution: "@medusajs/framework@npm:2.5.1" + dependencies: + "@jercle/yargonaut": "npm:^1.1.5" + "@medusajs/modules-sdk": "npm:^2.5.1" + "@medusajs/orchestration": "npm:^2.5.1" + "@medusajs/telemetry": "npm:^2.5.1" + "@medusajs/types": "npm:^2.5.1" + "@medusajs/utils": "npm:^2.5.1" + "@medusajs/workflows-sdk": "npm:^2.5.1" + "@opentelemetry/api": "npm:^1.9.0" + "@types/express": "npm:^4.17.17" + chokidar: "npm:^3.4.2" + compression: "npm:1.7.4" + connect-redis: "npm:5.2.0" + cookie-parser: "npm:^1.4.6" + cors: "npm:^2.8.5" + express: "npm:^4.21.0" + express-session: "npm:^1.17.3" + glob: "npm:7.2.3" + jsonwebtoken: "npm:^9.0.2" + lodash: "npm:4.17.21" + morgan: "npm:^1.9.1" + tsconfig-paths: "npm:^4.2.0" + zod: "npm:3.22.4" + peerDependencies: + "@medusajs/cli": ^2.4.0 + "@mikro-orm/cli": 6.4.3 + "@mikro-orm/core": 6.4.3 + "@mikro-orm/knex": 6.4.3 + "@mikro-orm/migrations": 6.4.3 + "@mikro-orm/postgresql": 6.4.3 + awilix: ^8.0.1 + ioredis: ^5.4.1 + pg: ^8.13.0 + vite: ^5.4.14 + peerDependenciesMeta: + "@mikro-orm/cli": + optional: true + ioredis: + optional: true + vite: + optional: true + bin: + medusa-mikro-orm: dist/mikro-orm-cli/bin.js + checksum: 10c0/09f991d12427c37ad8b5c79b4533817c44528ef362f9a3bbf330a1b54dc1eb347de3f786593476139e7581ccec8d65da4a2623821eca90e506a02fe8b8556d56 + languageName: node + linkType: hard + +"@medusajs/fulfillment-manual@npm:^2.5.0, @medusajs/fulfillment-manual@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/fulfillment-manual@npm:2.5.1" peerDependencies: @@ -2814,7 +2915,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/fulfillment@npm:^2.5.0": +"@medusajs/fulfillment@npm:^2.5.0, @medusajs/fulfillment@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/fulfillment@npm:2.5.1" peerDependencies: @@ -2858,7 +2959,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/icons@npm:^2.5.1": +"@medusajs/icons@npm:2.5.1, @medusajs/icons@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/icons@npm:2.5.1" peerDependencies: @@ -2867,7 +2968,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/index@npm:^2.5.0": +"@medusajs/index@npm:^2.5.0, @medusajs/index@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/index@npm:2.5.1" peerDependencies: @@ -2895,7 +2996,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/inventory@npm:^2.5.0": +"@medusajs/inventory@npm:^2.5.0, @medusajs/inventory@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/inventory@npm:2.5.1" peerDependencies: @@ -2954,7 +3055,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/link-modules@npm:^2.5.0": +"@medusajs/link-modules@npm:^2.5.0, @medusajs/link-modules@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/link-modules@npm:2.5.1" peerDependencies: @@ -2980,7 +3081,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/locking-postgres@npm:^2.5.0": +"@medusajs/locking-postgres@npm:^2.5.0, @medusajs/locking-postgres@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/locking-postgres@npm:2.5.1" peerDependencies: @@ -2998,7 +3099,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/locking-redis@npm:^2.5.0": +"@medusajs/locking-redis@npm:^2.5.0, @medusajs/locking-redis@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/locking-redis@npm:2.5.1" dependencies: @@ -3020,7 +3121,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/locking@npm:^2.5.0": +"@medusajs/locking@npm:^2.5.0, @medusajs/locking@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/locking@npm:2.5.1" peerDependencies: @@ -3213,6 +3314,91 @@ __metadata: languageName: node linkType: hard +"@medusajs/medusa@npm:2.5.1": + version: 2.5.1 + resolution: "@medusajs/medusa@npm:2.5.1" + dependencies: + "@inquirer/checkbox": "npm:^2.3.11" + "@inquirer/input": "npm:^2.2.9" + "@medusajs/admin-bundler": "npm:^2.5.1" + "@medusajs/api-key": "npm:^2.5.1" + "@medusajs/auth": "npm:^2.5.1" + "@medusajs/auth-emailpass": "npm:^2.5.1" + "@medusajs/auth-github": "npm:^2.5.1" + "@medusajs/auth-google": "npm:^2.5.1" + "@medusajs/cache-inmemory": "npm:^2.5.1" + "@medusajs/cache-redis": "npm:^2.5.1" + "@medusajs/cart": "npm:^2.5.1" + "@medusajs/core-flows": "npm:^2.5.1" + "@medusajs/currency": "npm:^2.5.1" + "@medusajs/customer": "npm:^2.5.1" + "@medusajs/event-bus-local": "npm:^2.5.1" + "@medusajs/event-bus-redis": "npm:^2.5.1" + "@medusajs/file": "npm:^2.5.1" + "@medusajs/file-local": "npm:^2.5.1" + "@medusajs/file-s3": "npm:^2.5.1" + "@medusajs/fulfillment": "npm:^2.5.1" + "@medusajs/fulfillment-manual": "npm:^2.5.1" + "@medusajs/index": "npm:^2.5.1" + "@medusajs/inventory": "npm:^2.5.1" + "@medusajs/link-modules": "npm:^2.5.1" + "@medusajs/locking": "npm:^2.5.1" + "@medusajs/locking-postgres": "npm:^2.5.1" + "@medusajs/locking-redis": "npm:^2.5.1" + "@medusajs/notification": "npm:^2.5.1" + "@medusajs/notification-local": "npm:^2.5.1" + "@medusajs/notification-sendgrid": "npm:^2.5.1" + "@medusajs/order": "npm:^2.5.1" + "@medusajs/payment": "npm:^2.5.1" + "@medusajs/payment-stripe": "npm:^2.5.1" + "@medusajs/pricing": "npm:^2.5.1" + "@medusajs/product": "npm:^2.5.1" + "@medusajs/promotion": "npm:^2.5.1" + "@medusajs/region": "npm:^2.5.1" + "@medusajs/sales-channel": "npm:^2.5.1" + "@medusajs/stock-location": "npm:^2.5.1" + "@medusajs/store": "npm:^2.5.1" + "@medusajs/tax": "npm:^2.5.1" + "@medusajs/telemetry": "npm:^2.5.1" + "@medusajs/user": "npm:^2.5.1" + "@medusajs/workflow-engine-inmemory": "npm:^2.5.1" + "@medusajs/workflow-engine-redis": "npm:^2.5.1" + boxen: "npm:^5.0.1" + chalk: "npm:^4.0.0" + chokidar: "npm:^3.4.2" + compression: "npm:^1.7.4" + express: "npm:^4.21.0" + fs-exists-cached: "npm:^1.0.0" + jsonwebtoken: "npm:^9.0.2" + lodash: "npm:^4.17.21" + multer: "npm:^1.4.5-lts.1" + node-schedule: "npm:^2.1.1" + qs: "npm:^6.11.2" + request-ip: "npm:^3.3.0" + slugify: "npm:^1.6.6" + uuid: "npm:^9.0.0" + zod: "npm:3.22.4" + peerDependencies: + "@medusajs/framework": ^2.4.0 + "@mikro-orm/core": 6.4.3 + "@mikro-orm/knex": 6.4.3 + "@mikro-orm/migrations": 6.4.3 + "@mikro-orm/postgresql": 6.4.3 + "@swc/core": ^1.7.28 + awilix: ^8.0.1 + react-dom: ^18.0.0 + yalc: 1.0.0-pre.53 + peerDependenciesMeta: + "@swc/core": + optional: true + react-dom: + optional: true + yalc: + optional: true + checksum: 10c0/395145f4f8449d5b6a9f6c46b05d1f7930503c838f9b6ff14db9e774c5e7d123c98755ee31d7e86cb88c4b38d914df35c2cbdf7cc63ac7c3a98dc4d67793b516 + languageName: node + linkType: hard + "@medusajs/modules-sdk@npm:^2.5.0": version: 2.5.0 resolution: "@medusajs/modules-sdk@npm:2.5.0" @@ -3232,6 +3418,25 @@ __metadata: languageName: node linkType: hard +"@medusajs/modules-sdk@npm:^2.5.1": + version: 2.5.1 + resolution: "@medusajs/modules-sdk@npm:2.5.1" + dependencies: + "@medusajs/orchestration": "npm:^2.5.1" + "@medusajs/types": "npm:^2.5.1" + "@medusajs/utils": "npm:^2.5.1" + peerDependencies: + "@mikro-orm/core": 6.4.3 + "@mikro-orm/knex": 6.4.3 + "@mikro-orm/migrations": 6.4.3 + "@mikro-orm/postgresql": 6.4.3 + awilix: ^8.0.1 + express: ^4.21.0 + pg: ^8.13.0 + checksum: 10c0/a0b14816b6bced99388a4529d1c6bf4a2fd60072828b777d9cff54418b4ea547accddaca04a79aed2bc02c1a1e5bca8f73ccd6720cff4c537d7dfa4ecadef996 + languageName: node + linkType: hard + "@medusajs/modules-sdk@npm:~2.4.0": version: 2.4.0 resolution: "@medusajs/modules-sdk@npm:2.4.0" @@ -3251,7 +3456,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/notification-local@npm:^2.5.0": +"@medusajs/notification-local@npm:^2.5.0, @medusajs/notification-local@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/notification-local@npm:2.5.1" peerDependencies: @@ -3269,7 +3474,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/notification-sendgrid@npm:^2.5.0": +"@medusajs/notification-sendgrid@npm:^2.5.0, @medusajs/notification-sendgrid@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/notification-sendgrid@npm:2.5.1" dependencies: @@ -3291,7 +3496,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/notification@npm:^2.5.0": +"@medusajs/notification@npm:^2.5.0, @medusajs/notification@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/notification@npm:2.5.1" peerDependencies: @@ -3335,6 +3540,24 @@ __metadata: languageName: node linkType: hard +"@medusajs/orchestration@npm:^2.5.1": + version: 2.5.1 + resolution: "@medusajs/orchestration@npm:2.5.1" + dependencies: + "@medusajs/types": "npm:^2.5.1" + "@medusajs/utils": "npm:^2.5.1" + peerDependencies: + "@mikro-orm/core": 6.4.3 + "@mikro-orm/knex": 6.4.3 + "@mikro-orm/migrations": 6.4.3 + "@mikro-orm/postgresql": 6.4.3 + awilix: ^8.0.1 + express: ^4.21.0 + pg: ^8.13.0 + checksum: 10c0/77953f8b6bb1bc904722b8bd177e6e36629bceccd28e07f3c06510d0f2c357d73393b515d0de7e9a4f8a962d9c5291fc0e354e856ec1234771e269db1e661592 + languageName: node + linkType: hard + "@medusajs/orchestration@npm:~2.4.0": version: 2.4.0 resolution: "@medusajs/orchestration@npm:2.4.0" @@ -3353,7 +3576,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/order@npm:^2.5.0": +"@medusajs/order@npm:^2.5.0, @medusajs/order@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/order@npm:2.5.1" peerDependencies: @@ -3379,7 +3602,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/payment-stripe@npm:^2.5.0": +"@medusajs/payment-stripe@npm:^2.5.0, @medusajs/payment-stripe@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/payment-stripe@npm:2.5.1" dependencies: @@ -3403,7 +3626,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/payment@npm:^2.5.0": +"@medusajs/payment@npm:^2.5.0, @medusajs/payment@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/payment@npm:2.5.1" peerDependencies: @@ -3429,7 +3652,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/pricing@npm:^2.5.0": +"@medusajs/pricing@npm:^2.5.0, @medusajs/pricing@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/pricing@npm:2.5.1" peerDependencies: @@ -3455,7 +3678,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/product@npm:^2.5.0": +"@medusajs/product@npm:^2.5.0, @medusajs/product@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/product@npm:2.5.1" peerDependencies: @@ -3481,7 +3704,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/promotion@npm:^2.5.0": +"@medusajs/promotion@npm:^2.5.0, @medusajs/promotion@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/promotion@npm:2.5.1" peerDependencies: @@ -3507,7 +3730,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/region@npm:^2.5.0": +"@medusajs/region@npm:^2.5.0, @medusajs/region@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/region@npm:2.5.1" peerDependencies: @@ -3533,7 +3756,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/sales-channel@npm:^2.5.0": +"@medusajs/sales-channel@npm:^2.5.0, @medusajs/sales-channel@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/sales-channel@npm:2.5.1" peerDependencies: @@ -3559,7 +3782,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/stock-location@npm:^2.5.0": +"@medusajs/stock-location@npm:^2.5.0, @medusajs/stock-location@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/stock-location@npm:2.5.1" peerDependencies: @@ -3585,7 +3808,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/store@npm:^2.5.0": +"@medusajs/store@npm:^2.5.0, @medusajs/store@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/store@npm:2.5.1" peerDependencies: @@ -3611,7 +3834,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/tax@npm:^2.5.0": +"@medusajs/tax@npm:^2.5.0, @medusajs/tax@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/tax@npm:2.5.1" peerDependencies: @@ -3637,7 +3860,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/telemetry@npm:^2.5.0": +"@medusajs/telemetry@npm:^2.5.0, @medusajs/telemetry@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/telemetry@npm:2.5.1" dependencies: @@ -3715,6 +3938,27 @@ __metadata: languageName: node linkType: hard +"@medusajs/test-utils@npm:2.5.1": + version: 2.5.1 + resolution: "@medusajs/test-utils@npm:2.5.1" + dependencies: + "@types/express": "npm:^4.17.17" + axios: "npm:^0.21.4" + express: "npm:^4.21.0" + get-port: "npm:^5.1.0" + randomatic: "npm:^3.1.1" + peerDependencies: + "@medusajs/framework": ^2.4.0 + "@medusajs/medusa": ^2.4.0 + "@mikro-orm/postgresql": 6.4.3 + awilix: ^8.0.1 + peerDependenciesMeta: + "@medusajs/medusa": + optional: true + checksum: 10c0/430a7aef6323cd1d52711eef96e0928a3cea24bd68a5365a256a0a5516ae919e8535720230e224515efc47223511d6b6d7165f5f8f9627f7fcf2ac0f95cfb0a7 + languageName: node + linkType: hard + "@medusajs/types@npm:^2.5.0": version: 2.5.0 resolution: "@medusajs/types@npm:2.5.0" @@ -3831,7 +4075,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/user@npm:^2.5.0": +"@medusajs/user@npm:^2.5.0, @medusajs/user@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/user@npm:2.5.1" dependencies: @@ -3921,7 +4165,37 @@ __metadata: languageName: node linkType: hard -"@medusajs/workflow-engine-inmemory@npm:^2.5.0": +"@medusajs/utils@npm:2.5.1, @medusajs/utils@npm:^2.5.1": + version: 2.5.1 + resolution: "@medusajs/utils@npm:2.5.1" + dependencies: + "@graphql-codegen/core": "npm:^4.0.2" + "@graphql-codegen/typescript": "npm:^4.0.9" + "@graphql-tools/merge": "npm:^9.0.7" + "@graphql-tools/schema": "npm:^10.0.6" + "@medusajs/types": "npm:^2.5.1" + "@types/pluralize": "npm:^0.0.33" + bignumber.js: "npm:^9.1.2" + dotenv: "npm:^16.4.5" + dotenv-expand: "npm:^11.0.6" + graphql: "npm:^16.9.0" + jsonwebtoken: "npm:^9.0.2" + pg-connection-string: "npm:^2.7.0" + pluralize: "npm:^8.0.0" + ulid: "npm:^2.3.0" + peerDependencies: + "@mikro-orm/core": 6.4.3 + "@mikro-orm/knex": 6.4.3 + "@mikro-orm/migrations": 6.4.3 + "@mikro-orm/postgresql": 6.4.3 + awilix: ^8.0.1 + express: ^4.21.0 + pg: ^8.13.0 + checksum: 10c0/fbd875c2e2858ef7f0a1385acfb82324772c49c2e6224980d921a8de3460f192f6502a398150cf61a985a18ffe121508e1b5a51d000a4e1f2c7149ef29d0c5ee + languageName: node + linkType: hard + +"@medusajs/workflow-engine-inmemory@npm:^2.5.0, @medusajs/workflow-engine-inmemory@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/workflow-engine-inmemory@npm:2.5.1" dependencies: @@ -3953,7 +4227,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/workflow-engine-redis@npm:^2.5.0": +"@medusajs/workflow-engine-redis@npm:^2.5.0, @medusajs/workflow-engine-redis@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/workflow-engine-redis@npm:2.5.1" dependencies: @@ -4008,6 +4282,27 @@ __metadata: languageName: node linkType: hard +"@medusajs/workflows-sdk@npm:^2.5.1": + version: 2.5.1 + resolution: "@medusajs/workflows-sdk@npm:2.5.1" + dependencies: + "@medusajs/modules-sdk": "npm:^2.5.1" + "@medusajs/orchestration": "npm:^2.5.1" + "@medusajs/types": "npm:^2.5.1" + "@medusajs/utils": "npm:^2.5.1" + ulid: "npm:^2.3.0" + peerDependencies: + "@mikro-orm/core": 6.4.3 + "@mikro-orm/knex": 6.4.3 + "@mikro-orm/migrations": 6.4.3 + "@mikro-orm/postgresql": 6.4.3 + awilix: ^8.0.1 + express: ^4.21.0 + pg: ^8.13.0 + checksum: 10c0/e6e449396ef07240f417ecc2cccb8409e8710ae731176bed267bb013ef47046b228e2c8877711c1d9c9b7d2a6064b9824ee97506a59980871660ae7030ed3b4f + languageName: node + linkType: hard + "@medusajs/workflows-sdk@npm:~2.4.0": version: 2.4.0 resolution: "@medusajs/workflows-sdk@npm:2.4.0" From ee88c9cfddbd96b75c843d6f4eea3622df4493b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antony=20Dur=C3=A1n?= Date: Fri, 28 Feb 2025 21:29:47 -0600 Subject: [PATCH 03/37] feat(page-builder): add core models/links --- plugins/page-builder/src/links/page-user.ts | 8 ++++ .../src/modules/page-builder/index.ts | 8 ++++ .../src/modules/page-builder/models/image.ts | 21 ++++++++++ .../src/modules/page-builder/models/index.ts | 6 +++ .../page-builder/models/navigation-item.ts | 10 +++++ .../page-builder/models/page-section.ts | 38 +++++++++++++++++++ .../modules/page-builder/models/page-tag.ts | 13 +++++++ .../page-builder/models/page-template.ts | 13 +++++++ .../src/modules/page-builder/models/page.ts | 36 ++++++++++++++++++ .../page-builder/models/site-settings.ts | 32 ++++++++++++++++ .../src/modules/page-builder/service.ts | 20 ++++++++++ 11 files changed, 205 insertions(+) create mode 100644 plugins/page-builder/src/links/page-user.ts create mode 100644 plugins/page-builder/src/modules/page-builder/index.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/image.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/index.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/navigation-item.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/page-section.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/page-tag.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/page-template.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/page.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/site-settings.ts create mode 100644 plugins/page-builder/src/modules/page-builder/service.ts diff --git a/plugins/page-builder/src/links/page-user.ts b/plugins/page-builder/src/links/page-user.ts new file mode 100644 index 00000000..15e17f5d --- /dev/null +++ b/plugins/page-builder/src/links/page-user.ts @@ -0,0 +1,8 @@ +import PageBuilderModule from '../modules/page-builder' +import UserModule from '@medusajs/medusa/user' +import { defineLink } from '@medusajs/framework/utils' + +export default defineLink(PageBuilderModule.linkable.page, { + linkable: UserModule.linkable.user, + isList: true, +}) diff --git a/plugins/page-builder/src/modules/page-builder/index.ts b/plugins/page-builder/src/modules/page-builder/index.ts new file mode 100644 index 00000000..15a80ff4 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/index.ts @@ -0,0 +1,8 @@ +import PageBuilderService from './service' +import { Module } from '@medusajs/framework/utils' + +export const PAGE_BUILDER_MODULE = 'page-builder' + +export default Module(PAGE_BUILDER_MODULE, { + service: PageBuilderService, +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/image.ts b/plugins/page-builder/src/modules/page-builder/models/image.ts new file mode 100644 index 00000000..ab25ca5f --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/image.ts @@ -0,0 +1,21 @@ +import { model } from '@medusajs/framework/utils' +import { Page } from './page' +import { SiteSettings } from './site-settings' + +// TODO: check if this model is needed +export const Image = model.define('image', { + id: model.id().primaryKey(), + url: model.text(), + metadata: model.json().nullable(), + + page: model + .belongsTo(() => Page, { + mappedBy: 'featured_image', + }) + .nullable(), + site: model + .belongsTo(() => SiteSettings, { + mappedBy: 'favicon', + }) + .nullable(), +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/index.ts b/plugins/page-builder/src/modules/page-builder/models/index.ts new file mode 100644 index 00000000..24188d60 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/index.ts @@ -0,0 +1,6 @@ +export * from './page' +export * from './page-template' +export * from './page-section' +export * from './site-settings' +export * from './navigation-item' +export * from './page-tag' diff --git a/plugins/page-builder/src/modules/page-builder/models/navigation-item.ts b/plugins/page-builder/src/modules/page-builder/models/navigation-item.ts new file mode 100644 index 00000000..0c40f166 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/navigation-item.ts @@ -0,0 +1,10 @@ +import { model } from '@medusajs/framework/utils' + +export const NavigationItem = model.define('navigation_item', { + id: model.id({ prefix: 'nav_item' }).primaryKey(), + label: model.text(), + location: model.enum(['header', 'footer']), + sort_order: model.number().default(0), + url: model.text().nullable(), + new_tab: model.boolean().default(false), +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/page-section.ts b/plugins/page-builder/src/modules/page-builder/models/page-section.ts new file mode 100644 index 00000000..a378fc39 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/page-section.ts @@ -0,0 +1,38 @@ +import { model } from '@medusajs/framework/utils' +import { Page } from './page' +import { PageTemplate } from './page-template' + +export const PageSection = model.define('page_section', { + id: model.id({ prefix: 'pagesec' }).primaryKey(), + type: model.enum([ + 'button_list', + 'cta', + 'header', + 'hero', + 'product_carousel', + 'product_grid', + 'image_gallery', + 'raw_html', + 'rich_text', + 'blog_list', + ]), + name: model.text(), + content: model.json().nullable(), + status: model.enum(['draft', 'published', 'archived']).default('draft'), + settings: model.json().nullable(), + is_reusable: model.boolean().default(false), + styles: model.json().nullable(), + sort_order: model.number(), + + // last_updated_by_id: model.text().nullable(), + page: model + .belongsTo(() => Page, { + mappedBy: 'sections', + }) + .nullable(), + pageTemplate: model + .belongsTo(() => PageTemplate, { + mappedBy: 'sections', + }) + .nullable(), +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/page-tag.ts b/plugins/page-builder/src/modules/page-builder/models/page-tag.ts new file mode 100644 index 00000000..078831b9 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/page-tag.ts @@ -0,0 +1,13 @@ +import { model } from '@medusajs/framework/utils' +import { Page } from './page' + +export const PageTag = model.define('page_tag', { + id: model.id({ prefix: 'pagetag' }).primaryKey(), + label: model.text(), + handle: model.text().unique(), + description: model.text(), + // created_by_id: model.id(), + pages: model.manyToMany(() => Page, { + mappedBy: 'tags', + }), +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/page-template.ts b/plugins/page-builder/src/modules/page-builder/models/page-template.ts new file mode 100644 index 00000000..078851dd --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/page-template.ts @@ -0,0 +1,13 @@ +import { model } from '@medusajs/framework/utils' +import { PageSection } from './page-section' + +export const PageTemplate = model.define('page_template', { + id: model.id({ prefix: 'page_temp' }).primaryKey(), + title: model.text(), + status: model.enum(['draft', 'published', 'archived']).default('draft'), + type: model.enum(['page', 'post', 'product', 'revision']), + // last_updated_by_id: model.text().nullable(), + sort_order: model.number().default(0), + description: model.text().nullable(), + sections: model.hasMany(() => PageSection), +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/page.ts b/plugins/page-builder/src/modules/page-builder/models/page.ts new file mode 100644 index 00000000..fd1e3367 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/page.ts @@ -0,0 +1,36 @@ +import { model } from '@medusajs/framework/utils' +import { PageSection } from './page-section' +import { PageTag } from './page-tag' + +export const Page = model.define('page', { + id: model.id({ prefix: 'page' }).primaryKey(), + title: model.text(), + handle: model.text().unique(), + excerpt: model.text().nullable(), + content: model.json().nullable(), + type: model.enum(['page', 'post', 'product', 'revision']), + status: model.enum(['draft', 'published', 'archived']).default('draft'), + content_mode: model.enum(['basic', 'advanced']), + seo: model.json().nullable(), + published_at: model.text().nullable(), + archived_at: model.text().nullable(), + is_home_page: model.boolean().default(false), + + featured_image: model.hasOne(() => Image).nullable(), + + // author_id: model.array(), // TODO: or model.text()? + // last_updated_by_id: model.text(), + + root: model + .belongsTo(() => Page, { + mappedBy: undefined, + }) + .nullable(), + sections: model.hasMany(() => PageSection), + tags: model.manyToMany(() => PageTag, { + mappedBy: 'page_id', + pivotTable: 'page_tag', + joinColumn: 'page_id', + inverseJoinColumn: 'tag_id', + }), +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/site-settings.ts b/plugins/page-builder/src/modules/page-builder/models/site-settings.ts new file mode 100644 index 00000000..324be546 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/site-settings.ts @@ -0,0 +1,32 @@ +import { model } from '@medusajs/framework/utils' +import { Image } from './image' + +export const SiteSettings = model.define('site_settings', { + id: model.id({ prefix: 'site_sett' }).primaryKey(), + description: model.text().nullable(), + favicon: model + .hasOne(() => Image, { + mappedBy: 'favicon_id', + }) + .nullable(), + header_code: model.text().nullable(), + footer_code: model.text().nullable(), + storefront_url: model.text().nullable(), + primary_theme_colors: model.json().nullable(), + accent_theme_colors: model.json().nullable(), + highlight_theme_colors: model.json().nullable(), + display_font: model.json().nullable(), + body_font: model.json().nullable(), + include_site_name_beside_logo: model.boolean().default(false), + social_instagram: model.text().nullable(), + social_youtube: model.text().nullable(), + social_facebook: model.text().nullable(), + social_twitter: model.text().nullable(), + social_linkedin: model.text().nullable(), + social_pinterest: model.text().nullable(), + social_tiktok: model.text().nullable(), + social_snapchat: model.text().nullable(), + global_css: model.text().nullable(), + ga_property_id: model.text().nullable(), + shipping_sort: model.text().nullable(), +}) diff --git a/plugins/page-builder/src/modules/page-builder/service.ts b/plugins/page-builder/src/modules/page-builder/service.ts new file mode 100644 index 00000000..308fb745 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/service.ts @@ -0,0 +1,20 @@ +import { MedusaService } from '@medusajs/framework/utils' +import { + Page, + PageTemplate, + PageTag, + PageSection, + SiteSettings, + NavigationItem, +} from './models' + +class PageBuilderService extends MedusaService({ + Page, + PageTag, + PageSection, + PageTemplate, + SiteSettings, + NavigationItem, +}) {} + +export default PageBuilderService From 72ab84c9eb4a9db8ae8c42363213f23b2ac45db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antony=20Dur=C3=A1n?= Date: Tue, 4 Mar 2025 14:33:29 -0600 Subject: [PATCH 04/37] feat(page-builder): update admin UI components and routes --- .../molecules/breadcrumbs/breadcrumbs.tsx | 30 ++-- .../sidebar-toggle/sidebar-toggle.tsx | 8 +- .../editor-sidebar/editor-sidebar.tsx | 139 ++++++------------ .../src/admin/components/organisms/index.ts | 6 +- .../page-settings-sidebar.tsx | 18 --- .../post-settings-sidebar.tsx | 34 +++++ .../drawer-sidebar-container.tsx | 50 +++++++ .../mobile-sidebar-container.tsx | 63 -------- ...ainer.tsx => static-sidebar-container.tsx} | 7 +- .../components/organisms/top-bar/top-bar.tsx | 4 +- .../src/admin/components/templates/index.ts | 8 +- .../post-layout.tsx} | 8 +- .../components/templates/shell/shell.tsx | 14 +- .../templates/shell/sidebar-container.tsx | 22 --- .../sidebar/editor-sidebar-context.tsx | 31 ++-- .../sidebar/editor-sidebar-provider.tsx | 35 ++--- .../providers/sidebar/use-editor-sidebar.tsx | 4 +- .../edit => content/editor}/[id]/page.tsx | 32 ++-- .../admin/routes/{pages => content}/page.tsx | 10 +- 19 files changed, 237 insertions(+), 286 deletions(-) delete mode 100644 plugins/page-builder/src/admin/components/organisms/page-settings-sidebar/page-settings-sidebar.tsx create mode 100644 plugins/page-builder/src/admin/components/organisms/post-settings-sidebar/post-settings-sidebar.tsx create mode 100644 plugins/page-builder/src/admin/components/organisms/sidebar-container/drawer-sidebar-container.tsx delete mode 100644 plugins/page-builder/src/admin/components/organisms/sidebar-container/mobile-sidebar-container.tsx rename plugins/page-builder/src/admin/components/organisms/sidebar-container/{desktop-sidebar-container.tsx => static-sidebar-container.tsx} (56%) rename plugins/page-builder/src/admin/components/templates/{page-layout/page-layout.tsx => post-layout/post-layout.tsx} (51%) delete mode 100644 plugins/page-builder/src/admin/components/templates/shell/sidebar-container.tsx rename plugins/page-builder/src/admin/routes/{pages/edit => content/editor}/[id]/page.tsx (57%) rename plugins/page-builder/src/admin/routes/{pages => content}/page.tsx (76%) diff --git a/plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx b/plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx index e498ccf7..a1d04bd5 100644 --- a/plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx +++ b/plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx @@ -4,7 +4,7 @@ import { Link, useLoaderData } from "react-router-dom" type Crumb = { label: string - path: string + path?: string } /** @@ -19,16 +19,24 @@ export const Breadcrumbs = () => { path: "/", }, { - label: "Pages", - path: "/pages", + label: "Content", + path: "/content", }, ] - if (data?.page) { - crumbs.push({ - label: data?.page?.title as string, - path: data?.page?.id as string, - }) + if (data?.post) { + const post = data.post + const type = post.type?.charAt(0).toUpperCase() + post.type?.slice(1) as string + + crumbs.push(...[ + { + label: type, + }, + { + label: post.title as string, + path: post.id as string, + }, + ]) } return ( @@ -43,7 +51,7 @@ export const Breadcrumbs = () => { return (
  • - {!isLast ? ( + {!isLast && crumb.path ? ( { ) : (
    - {!isSingle && ...} + {!isSingle && isLast && ...} {crumb.label} diff --git a/plugins/page-builder/src/admin/components/molecules/sidebar-toggle/sidebar-toggle.tsx b/plugins/page-builder/src/admin/components/molecules/sidebar-toggle/sidebar-toggle.tsx index 7fcfe9db..a45605e9 100644 --- a/plugins/page-builder/src/admin/components/molecules/sidebar-toggle/sidebar-toggle.tsx +++ b/plugins/page-builder/src/admin/components/molecules/sidebar-toggle/sidebar-toggle.tsx @@ -5,18 +5,18 @@ import { useEditorSidebar } from "../../../providers/sidebar" /** * Toggle button for showing/hiding sidebars */ -export const SidebarToggle = ({ side }: { side: "left" | "right" }) => { +export const SidebarToggle = ({ side, drawerOnly = false }: { side: "left" | "right", drawerOnly?: boolean }) => { const { toggleLeft, toggleRight } = useEditorSidebar() const toggle = side === "left" ? toggleLeft : toggleRight const Icon = side === "left" ? SidebarLeft : SidebarRight return ( - +
    toggle("desktop")} + onClick={() => toggle(drawerOnly ? "drawer" : "static")} size="small" > @@ -24,7 +24,7 @@ export const SidebarToggle = ({ side }: { side: "left" | "right" }) => { toggle("mobile")} + onClick={() => toggle("drawer")} size="small" > diff --git a/plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx b/plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx index ea67e09e..73176404 100644 --- a/plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx +++ b/plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx @@ -1,106 +1,65 @@ -import { - ShoppingCart, - Tag, - Buildings, - Users, - ReceiptPercent, - CurrencyDollar, -} from "@medusajs/icons" -import { INavItem, NavItem } from "../../../components/molecules/nav-item/nav-item" +import { SquareTwoStackSolid } from "@medusajs/icons" +import { NavItem } from "../../molecules/nav-item/nav-item" +import { DrawerSidebarContainer } from "../sidebar-container/drawer-sidebar-container" +import { StaticSidebarContainer } from "../sidebar-container/static-sidebar-container" /** - * Sidebar for the page editor with sections menu + * EditorSidebar is a responsive sidebar for the page builder + * - Rendered as a static sidebar on desktop screens + * - Rendered as a drawer on mobile/smaller screens */ export const EditorSidebar = () => { - return ( + const sidebarContent = ( ) -} -const useCoreRoutes = (): Omit[] => { - return [ - { - icon: , - label: 'orders', - to: "/orders", - items: [ - // TODO: Enable when domin is introduced - // { - // label: 'draftOrders', - // to: "/draft-orders", - // }, - ], - }, - { - icon: , - label: 'products', - to: "/products", - items: [ - { - label: 'collections', - to: "/collections", - }, - { - label: 'categories', - to: "/categories", - }, - // TODO: Enable when domin is introduced - // { - // label: 'giftCards', - // to: "/gift-cards", - // }, - ], - }, - { - icon: , - label: 'inventory', - to: "/inventory", - items: [ - { - label: 'reservations', - to: "/reservations", - }, - ], - }, - { - icon: , - label: 'customers', - to: "/customers", - items: [ - { - label: 'customerGroups', - to: "/customer-groups", - }, - ], - }, - { - icon: , - label: 'promotions', - to: "/promotions", - items: [ - { - label: 'campaigns', - to: "/campaigns", - }, - ], - }, - { - icon: , - label: 'priceLists', - to: "/price-lists", - }, - ] + return ( + <> + + {sidebarContent} + + + {sidebarContent} + + + ) } -const SectionsMenu = () => { - const coreRoutes = useCoreRoutes() +const sections = [ + { + icon: , + label: 'Section 1', + to: "sections/section_id_1", + }, + { + icon: , + label: 'Section 2', + to: "sections/section_id_2", + }, + { + icon: , + label: 'Section 3', + to: "sections/section_id_3", + }, + { + icon: , + label: 'Section 4', + to: "sections/section_id_4", + }, + { + icon: , + label: 'Section 5', + to: "sections/section_id_5", + }, +] +const SectionsMenu = () => { return ( -
    ) diff --git a/plugins/page-builder/src/admin/components/templates/index.ts b/plugins/page-builder/src/admin/components/templates/index.ts index 9605b29f..a4ef7df2 100644 --- a/plugins/page-builder/src/admin/components/templates/index.ts +++ b/plugins/page-builder/src/admin/components/templates/index.ts @@ -1,8 +1,2 @@ -/** - * Templates are page-level objects that place components into a layout. - * They focus on the page's structure rather than the data being displayed. - */ - -// Export templates as they are created -export * from './page-layout/page-layout' +export * from './post-layout/post-layout' export * from './shell/shell' diff --git a/plugins/page-builder/src/admin/components/templates/page-layout/page-layout.tsx b/plugins/page-builder/src/admin/components/templates/post-layout/post-layout.tsx similarity index 51% rename from plugins/page-builder/src/admin/components/templates/page-layout/page-layout.tsx rename to plugins/page-builder/src/admin/components/templates/post-layout/post-layout.tsx index 70969ad2..4c941947 100644 --- a/plugins/page-builder/src/admin/components/templates/page-layout/page-layout.tsx +++ b/plugins/page-builder/src/admin/components/templates/post-layout/post-layout.tsx @@ -1,15 +1,15 @@ import { PropsWithChildren } from "react" import { Shell } from "../shell/shell" import { EditorSidebar } from "../../organisms/editor-sidebar/editor-sidebar" -import { PageSettingsSidebar } from "../../organisms/page-settings-sidebar/page-settings-sidebar" +import { PostSettingsSidebar } from "../../organisms/post-settings-sidebar/post-settings-sidebar" /** - * Page layout template for the page editor + * Post layout template for the post editor * Provides the main layout structure with sidebars */ -export const PageLayout = ({ children }: PropsWithChildren) => { +export const PostLayout = ({ children }: PropsWithChildren) => { return ( - } rightSidebar={}> + } rightSidebar={}> {children} ) diff --git a/plugins/page-builder/src/admin/components/templates/shell/shell.tsx b/plugins/page-builder/src/admin/components/templates/shell/shell.tsx index bd9fc1ba..924aac59 100644 --- a/plugins/page-builder/src/admin/components/templates/shell/shell.tsx +++ b/plugins/page-builder/src/admin/components/templates/shell/shell.tsx @@ -1,24 +1,22 @@ -import { TooltipProvider } from "@medusajs/ui" import { PropsWithChildren, ReactNode } from "react" +import { TooltipProvider } from "@medusajs/ui" import { MainContent } from "./main-content" -import { SidebarContainer } from "./sidebar-container" -interface ShellProps extends PropsWithChildren { +type ShellProps = PropsWithChildren & { leftSidebar?: ReactNode rightSidebar?: ReactNode } /** - * Shell template component that provides the main application structure - * Composes the layout using specialized components for each section + * Shell layout component that provides a consistent layout across the admin dashboard. */ export const Shell = ({ children, leftSidebar, rightSidebar }: ShellProps) => { return ( -
    - {leftSidebar} +
    + {leftSidebar} {children} - {rightSidebar} + {rightSidebar}
    ) diff --git a/plugins/page-builder/src/admin/components/templates/shell/sidebar-container.tsx b/plugins/page-builder/src/admin/components/templates/shell/sidebar-container.tsx deleted file mode 100644 index 4e12743d..00000000 --- a/plugins/page-builder/src/admin/components/templates/shell/sidebar-container.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { PropsWithChildren, ReactNode } from "react" -import { DesktopSidebarContainer, MobileSidebarContainer } from "../../organisms" - -interface SidebarContainerProps extends PropsWithChildren { - side: "left" | "right" -} - -/** - * SidebarContainer component that handles both mobile and desktop sidebar containers - */ -export const SidebarContainer = ({ children, side }: SidebarContainerProps) => { - if (!children) { - return null - } - - return ( -
    - {children} - {children} -
    - ) -} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-context.tsx b/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-context.tsx index 4ffda39e..3c2c06c6 100644 --- a/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-context.tsx +++ b/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-context.tsx @@ -1,15 +1,28 @@ import { createContext } from "react" -type EditorSidebarState = { - desktop: boolean - mobile: boolean +export type SidebarViewType = "drawer" | "static" + +export interface SidebarState { + drawer: boolean + static: boolean } -type EditorSidebarContextValue = { - left: EditorSidebarState - right: EditorSidebarState - toggleLeft: (view: "desktop" | "mobile") => void - toggleRight: (view: "desktop" | "mobile") => void +export interface EditorSidebarContextType { + left: SidebarState + right: SidebarState + toggleLeft: (viewType: SidebarViewType) => void + toggleRight: (viewType: SidebarViewType) => void } -export const EditorSidebarContext = createContext(null) +export const EditorSidebarContext = createContext({ + left: { + drawer: false, + static: true + }, + right: { + drawer: false, + static: false + }, + toggleLeft: () => {}, + toggleRight: () => {}, +}) diff --git a/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-provider.tsx b/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-provider.tsx index b82140e2..fbca84f2 100644 --- a/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-provider.tsx +++ b/plugins/page-builder/src/admin/providers/sidebar/editor-sidebar-provider.tsx @@ -1,32 +1,33 @@ -import { ReactNode, useState } from "react" -import { EditorSidebarContext } from "./editor-sidebar-context" +import { PropsWithChildren, useState } from "react" +import { EditorSidebarContext, SidebarState, SidebarViewType } from "./editor-sidebar-context" -interface EditorSidebarProviderProps { - children: ReactNode -} - -export const EditorSidebarProvider = ({ children }: EditorSidebarProviderProps) => { - const [leftSidebar, setLeftSidebar] = useState({ - desktop: true, - mobile: false, +/** + * Provider for the editor sidebar state + * Manages the visibility state of left and right sidebars + * with separate states for drawer and static views + */ +export const EditorSidebarProvider = ({ children }: PropsWithChildren) => { + const [leftSidebar, setLeftSidebar] = useState({ + drawer: false, + static: true }) - const [rightSidebar, setRightSidebar] = useState({ - desktop: false, - mobile: false, + const [rightSidebar, setRightSidebar] = useState({ + drawer: false, + static: false }) - const toggleLeft = (view: "desktop" | "mobile") => { + const toggleLeft = (viewType: SidebarViewType) => { setLeftSidebar((prev) => ({ ...prev, - [view]: !prev[view], + [viewType]: !prev[viewType], })) } - const toggleRight = (view: "desktop" | "mobile") => { + const toggleRight = (viewType: SidebarViewType) => { setRightSidebar((prev) => ({ ...prev, - [view]: !prev[view], + [viewType]: !prev[viewType], })) } diff --git a/plugins/page-builder/src/admin/providers/sidebar/use-editor-sidebar.tsx b/plugins/page-builder/src/admin/providers/sidebar/use-editor-sidebar.tsx index 5e6f3436..b0586a52 100644 --- a/plugins/page-builder/src/admin/providers/sidebar/use-editor-sidebar.tsx +++ b/plugins/page-builder/src/admin/providers/sidebar/use-editor-sidebar.tsx @@ -1,7 +1,7 @@ import { useContext } from "react" -import { EditorSidebarContext } from "./editor-sidebar-context" +import { EditorSidebarContext, EditorSidebarContextType } from "./editor-sidebar-context" -export const useEditorSidebar = () => { +export const useEditorSidebar = (): EditorSidebarContextType => { const context = useContext(EditorSidebarContext) if (!context) { diff --git a/plugins/page-builder/src/admin/routes/pages/edit/[id]/page.tsx b/plugins/page-builder/src/admin/routes/content/editor/[id]/page.tsx similarity index 57% rename from plugins/page-builder/src/admin/routes/pages/edit/[id]/page.tsx rename to plugins/page-builder/src/admin/routes/content/editor/[id]/page.tsx index 20dbd49a..097e2d9e 100644 --- a/plugins/page-builder/src/admin/routes/pages/edit/[id]/page.tsx +++ b/plugins/page-builder/src/admin/routes/content/editor/[id]/page.tsx @@ -1,32 +1,27 @@ -import { Button } from "@medusajs/ui" import { LoaderFunctionArgs, useLoaderData, useParams } from "react-router-dom" -import { PageLayout } from "../../../../components/templates" -import { EditorSidebarProvider } from "../../../../providers/sidebar" -import { AnimatePresence } from "motion/react" -import { useState } from "react" -import { useEffect } from "react" import { EditorModal, Topbar } from "../../../../components/organisms" +import { EditorSidebarProvider } from "../../../../providers/sidebar" +import { PostLayout } from "../../../../components/templates/post-layout/post-layout" export async function loader({ params }: LoaderFunctionArgs) { - // TODO fetch page - - console.log("🚀 ~ loader ~ pages/:id ~ params:", params) + console.log("🚀 ~ loader ~ content/editor/:id ~ params:", params) return { - page: { + post: { id: params.id, title: "Test Page", description: "Test Page Description", content: "Test Page Content", + type: "page", }, } } -const PageDetailsPage = () => { +const PostDetailsPage = () => { const { id } = useParams() - console.log("🚀 ~ PageDetailsPage ~ id:", id) - const pageData = useLoaderData() as Awaited> - console.log("🚀 ~ PageDetailsPage ~ page:", pageData) + console.log("🚀 ~ PostDetailsPage ~ id:", id) + const postData = useLoaderData() as Awaited> + console.log("🚀 ~ PostDetailsPage ~ post:", postData) return ( @@ -36,9 +31,10 @@ const PageDetailsPage = () => { - -

    Page Details2

    -
    + +

    {postData.post?.title}

    +

    {postData.post?.description}

    +
    @@ -46,4 +42,4 @@ const PageDetailsPage = () => { ) } -export default PageDetailsPage +export default PostDetailsPage diff --git a/plugins/page-builder/src/admin/routes/pages/page.tsx b/plugins/page-builder/src/admin/routes/content/page.tsx similarity index 76% rename from plugins/page-builder/src/admin/routes/pages/page.tsx rename to plugins/page-builder/src/admin/routes/content/page.tsx index 64b7a619..bc138983 100644 --- a/plugins/page-builder/src/admin/routes/pages/page.tsx +++ b/plugins/page-builder/src/admin/routes/content/page.tsx @@ -3,14 +3,14 @@ import { defineRouteConfig } from "@medusajs/admin-sdk" import { DocumentText } from "@medusajs/icons" import { Link } from "react-router-dom" -const PagesPage = () => { +const ContentPage = () => { return (
    - Page Builder + Content
    - +
    @@ -19,8 +19,8 @@ const PagesPage = () => { } export const config = defineRouteConfig({ - label: "Pages", + label: "Content", icon: DocumentText, }) -export default PagesPage \ No newline at end of file +export default ContentPage \ No newline at end of file From de0aca08cdf867c93767a93640787876ba4d2b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antony=20Dur=C3=A1n?= Date: Wed, 5 Mar 2025 11:51:57 -0600 Subject: [PATCH 05/37] feat(page-builder): add core models/services/module/migrations/links --- plugins/page-builder/src/links/page-user.ts | 8 - .../src/links/post-author-user.ts | 14 + .../page-builder/src/links/post-tag-user.ts | 14 + .../.snapshot-medusa-page-builder.json | 1488 +++++++++++++++++ .../migrations/Migration20250305164601.ts | 103 ++ .../src/modules/page-builder/models/image.ts | 43 +- .../src/modules/page-builder/models/index.ts | 10 +- .../page-builder/models/navigation-item.ts | 4 +- .../modules/page-builder/models/page-tag.ts | 13 - .../page-builder/models/page-template.ts | 13 - .../src/modules/page-builder/models/page.ts | 36 - .../page-builder/models/post-author.ts | 13 + .../{page-section.ts => post-section.ts} | 27 +- .../modules/page-builder/models/post-tag.ts | 15 + .../page-builder/models/post-template.ts | 14 + .../src/modules/page-builder/models/post.ts | 36 + .../page-builder/models/site-settings.ts | 12 +- .../src/modules/page-builder/service.ts | 20 +- 18 files changed, 1763 insertions(+), 120 deletions(-) delete mode 100644 plugins/page-builder/src/links/page-user.ts create mode 100644 plugins/page-builder/src/links/post-author-user.ts create mode 100644 plugins/page-builder/src/links/post-tag-user.ts create mode 100644 plugins/page-builder/src/modules/page-builder/migrations/.snapshot-medusa-page-builder.json create mode 100644 plugins/page-builder/src/modules/page-builder/migrations/Migration20250305164601.ts delete mode 100644 plugins/page-builder/src/modules/page-builder/models/page-tag.ts delete mode 100644 plugins/page-builder/src/modules/page-builder/models/page-template.ts delete mode 100644 plugins/page-builder/src/modules/page-builder/models/page.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/post-author.ts rename plugins/page-builder/src/modules/page-builder/models/{page-section.ts => post-section.ts} (57%) create mode 100644 plugins/page-builder/src/modules/page-builder/models/post-tag.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/post-template.ts create mode 100644 plugins/page-builder/src/modules/page-builder/models/post.ts diff --git a/plugins/page-builder/src/links/page-user.ts b/plugins/page-builder/src/links/page-user.ts deleted file mode 100644 index 15e17f5d..00000000 --- a/plugins/page-builder/src/links/page-user.ts +++ /dev/null @@ -1,8 +0,0 @@ -import PageBuilderModule from '../modules/page-builder' -import UserModule from '@medusajs/medusa/user' -import { defineLink } from '@medusajs/framework/utils' - -export default defineLink(PageBuilderModule.linkable.page, { - linkable: UserModule.linkable.user, - isList: true, -}) diff --git a/plugins/page-builder/src/links/post-author-user.ts b/plugins/page-builder/src/links/post-author-user.ts new file mode 100644 index 00000000..87cbaf27 --- /dev/null +++ b/plugins/page-builder/src/links/post-author-user.ts @@ -0,0 +1,14 @@ +import { defineLink } from '@medusajs/framework/utils' +import UserModule from '@medusajs/medusa/user' +import PageBuilderModule from '../modules/page-builder' + +export default defineLink( + { + ...PageBuilderModule.linkable.postAuthor.id, + field: 'medusa_user_id', + }, + UserModule.linkable.user, + { + readOnly: true, + }, +) diff --git a/plugins/page-builder/src/links/post-tag-user.ts b/plugins/page-builder/src/links/post-tag-user.ts new file mode 100644 index 00000000..86a515b3 --- /dev/null +++ b/plugins/page-builder/src/links/post-tag-user.ts @@ -0,0 +1,14 @@ +import { defineLink } from '@medusajs/framework/utils' +import UserModule from '@medusajs/medusa/user' +import PageBuilderModule from '../modules/page-builder' + +export default defineLink( + { + ...PageBuilderModule.linkable.postTag.id, + field: 'created_by_id', + }, + UserModule.linkable.user, + { + readOnly: true, + }, +) diff --git a/plugins/page-builder/src/modules/page-builder/migrations/.snapshot-medusa-page-builder.json b/plugins/page-builder/src/modules/page-builder/migrations/.snapshot-medusa-page-builder.json new file mode 100644 index 00000000..7954db7b --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/migrations/.snapshot-medusa-page-builder.json @@ -0,0 +1,1488 @@ +{ + "namespaces": [ + "public" + ], + "name": "public", + "tables": [ + { + "columns": { + "id": { + "name": "id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "label": { + "name": "label", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "location": { + "name": "location", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "enumItems": [ + "header", + "footer" + ], + "mappedType": "enum" + }, + "url": { + "name": "url", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "new_tab": { + "name": "new_tab", + "type": "boolean", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "false", + "mappedType": "boolean" + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "0", + "mappedType": "integer" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "length": 6, + "mappedType": "datetime" + } + }, + "name": "navigation_item", + "schema": "public", + "indexes": [ + { + "keyName": "IDX_navigation_item_deleted_at", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_navigation_item_deleted_at\" ON \"navigation_item\" (deleted_at) WHERE deleted_at IS NULL" + }, + { + "keyName": "navigation_item_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "constraint": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {}, + "nativeEnums": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "type": { + "name": "type", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "enumItems": [ + "page", + "post" + ], + "mappedType": "enum" + }, + "title": { + "name": "title", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "handle": { + "name": "handle", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "excerpt": { + "name": "excerpt", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "content": { + "name": "content", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "json" + }, + "status": { + "name": "status", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "'draft'", + "enumItems": [ + "draft", + "published", + "archived" + ], + "mappedType": "enum" + }, + "content_mode": { + "name": "content_mode", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "enumItems": [ + "basic", + "advanced" + ], + "mappedType": "enum" + }, + "seo": { + "name": "seo", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "json" + }, + "published_at": { + "name": "published_at", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "archived_at": { + "name": "archived_at", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "is_home_page": { + "name": "is_home_page", + "type": "boolean", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "false", + "mappedType": "boolean" + }, + "root_id": { + "name": "root_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "length": 6, + "mappedType": "datetime" + } + }, + "name": "post", + "schema": "public", + "indexes": [ + { + "keyName": "IDX_post_handle_unique", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE UNIQUE INDEX IF NOT EXISTS \"IDX_post_handle_unique\" ON \"post\" (handle) WHERE deleted_at IS NULL" + }, + { + "keyName": "IDX_post_root_id", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_post_root_id\" ON \"post\" (root_id) WHERE deleted_at IS NULL" + }, + { + "keyName": "IDX_post_deleted_at", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_post_deleted_at\" ON \"post\" (deleted_at) WHERE deleted_at IS NULL" + }, + { + "keyName": "post_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "constraint": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": { + "post_root_id_foreign": { + "constraintName": "post_root_id_foreign", + "columnNames": [ + "root_id" + ], + "localTableName": "public.post", + "referencedColumnNames": [ + "id" + ], + "referencedTableName": "public.post", + "deleteRule": "set null", + "updateRule": "cascade" + } + }, + "nativeEnums": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "name": { + "name": "name", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "medusa_user_id": { + "name": "medusa_user_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "length": 6, + "mappedType": "datetime" + } + }, + "name": "post_author", + "schema": "public", + "indexes": [ + { + "keyName": "IDX_post_author_medusa_user_id_unique", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE UNIQUE INDEX IF NOT EXISTS \"IDX_post_author_medusa_user_id_unique\" ON \"post_author\" (medusa_user_id) WHERE deleted_at IS NULL" + }, + { + "keyName": "IDX_post_author_deleted_at", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_post_author_deleted_at\" ON \"post_author\" (deleted_at) WHERE deleted_at IS NULL" + }, + { + "keyName": "post_author_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "constraint": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {}, + "nativeEnums": {} + }, + { + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "post_author_id": { + "name": "post_author_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + } + }, + "name": "post_post_authors", + "schema": "public", + "indexes": [ + { + "keyName": "post_post_authors_pkey", + "columnNames": [ + "post_id", + "post_author_id" + ], + "composite": true, + "constraint": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": { + "post_post_authors_post_id_foreign": { + "constraintName": "post_post_authors_post_id_foreign", + "columnNames": [ + "post_id" + ], + "localTableName": "public.post_post_authors", + "referencedColumnNames": [ + "id" + ], + "referencedTableName": "public.post", + "deleteRule": "cascade", + "updateRule": "cascade" + }, + "post_post_authors_post_author_id_foreign": { + "constraintName": "post_post_authors_post_author_id_foreign", + "columnNames": [ + "post_author_id" + ], + "localTableName": "public.post_post_authors", + "referencedColumnNames": [ + "id" + ], + "referencedTableName": "public.post_author", + "deleteRule": "cascade", + "updateRule": "cascade" + } + }, + "nativeEnums": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "label": { + "name": "label", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "handle": { + "name": "handle", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "description": { + "name": "description", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "created_by_id": { + "name": "created_by_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "length": 6, + "mappedType": "datetime" + } + }, + "name": "post_tag", + "schema": "public", + "indexes": [ + { + "keyName": "IDX_post_tag_handle_unique", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE UNIQUE INDEX IF NOT EXISTS \"IDX_post_tag_handle_unique\" ON \"post_tag\" (handle) WHERE deleted_at IS NULL" + }, + { + "keyName": "IDX_post_tag_deleted_at", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_post_tag_deleted_at\" ON \"post_tag\" (deleted_at) WHERE deleted_at IS NULL" + }, + { + "keyName": "post_tag_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "constraint": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {}, + "nativeEnums": {} + }, + { + "columns": { + "post_id": { + "name": "post_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "post_tag_id": { + "name": "post_tag_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + } + }, + "name": "post_post_tags", + "schema": "public", + "indexes": [ + { + "keyName": "post_post_tags_pkey", + "columnNames": [ + "post_id", + "post_tag_id" + ], + "composite": true, + "constraint": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": { + "post_post_tags_post_id_foreign": { + "constraintName": "post_post_tags_post_id_foreign", + "columnNames": [ + "post_id" + ], + "localTableName": "public.post_post_tags", + "referencedColumnNames": [ + "id" + ], + "referencedTableName": "public.post", + "deleteRule": "cascade", + "updateRule": "cascade" + }, + "post_post_tags_post_tag_id_foreign": { + "constraintName": "post_post_tags_post_tag_id_foreign", + "columnNames": [ + "post_tag_id" + ], + "localTableName": "public.post_post_tags", + "referencedColumnNames": [ + "id" + ], + "referencedTableName": "public.post_tag", + "deleteRule": "cascade", + "updateRule": "cascade" + } + }, + "nativeEnums": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "title": { + "name": "title", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "status": { + "name": "status", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "'draft'", + "enumItems": [ + "draft", + "published", + "archived" + ], + "mappedType": "enum" + }, + "type": { + "name": "type", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "enumItems": [ + "page", + "post" + ], + "mappedType": "enum" + }, + "description": { + "name": "description", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "0", + "mappedType": "integer" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "length": 6, + "mappedType": "datetime" + } + }, + "name": "post_template", + "schema": "public", + "indexes": [ + { + "keyName": "IDX_post_template_deleted_at", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_post_template_deleted_at\" ON \"post_template\" (deleted_at) WHERE deleted_at IS NULL" + }, + { + "keyName": "post_template_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "constraint": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {}, + "nativeEnums": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "type": { + "name": "type", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "enumItems": [ + "button_list", + "cta", + "header", + "hero", + "product_carousel", + "product_grid", + "image_gallery", + "raw_html", + "rich_text", + "blog_list" + ], + "mappedType": "enum" + }, + "status": { + "name": "status", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "'draft'", + "enumItems": [ + "draft", + "published", + "archived" + ], + "mappedType": "enum" + }, + "name": { + "name": "name", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "content": { + "name": "content", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "json" + }, + "settings": { + "name": "settings", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "json" + }, + "styles": { + "name": "styles", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "json" + }, + "is_reusable": { + "name": "is_reusable", + "type": "boolean", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "false", + "mappedType": "boolean" + }, + "usage_count": { + "name": "usage_count", + "type": "integer", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "1", + "mappedType": "integer" + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "integer" + }, + "post_id": { + "name": "post_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "post_template_id": { + "name": "post_template_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "length": 6, + "mappedType": "datetime" + } + }, + "name": "post_section", + "schema": "public", + "indexes": [ + { + "keyName": "IDX_post_section_post_id", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_post_section_post_id\" ON \"post_section\" (post_id) WHERE deleted_at IS NULL" + }, + { + "keyName": "IDX_post_section_post_template_id", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_post_section_post_template_id\" ON \"post_section\" (post_template_id) WHERE deleted_at IS NULL" + }, + { + "keyName": "IDX_post_section_deleted_at", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_post_section_deleted_at\" ON \"post_section\" (deleted_at) WHERE deleted_at IS NULL" + }, + { + "keyName": "post_section_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "constraint": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": { + "post_section_post_id_foreign": { + "constraintName": "post_section_post_id_foreign", + "columnNames": [ + "post_id" + ], + "localTableName": "public.post_section", + "referencedColumnNames": [ + "id" + ], + "referencedTableName": "public.post", + "deleteRule": "set null", + "updateRule": "cascade" + }, + "post_section_post_template_id_foreign": { + "constraintName": "post_section_post_template_id_foreign", + "columnNames": [ + "post_template_id" + ], + "localTableName": "public.post_section", + "referencedColumnNames": [ + "id" + ], + "referencedTableName": "public.post_template", + "deleteRule": "set null", + "updateRule": "cascade" + } + }, + "nativeEnums": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "description": { + "name": "description", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "header_code": { + "name": "header_code", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "footer_code": { + "name": "footer_code", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "storefront_url": { + "name": "storefront_url", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "primary_theme_colors": { + "name": "primary_theme_colors", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "json" + }, + "accent_theme_colors": { + "name": "accent_theme_colors", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "json" + }, + "highlight_theme_colors": { + "name": "highlight_theme_colors", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "json" + }, + "display_font": { + "name": "display_font", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "json" + }, + "body_font": { + "name": "body_font", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "json" + }, + "include_site_name_beside_logo": { + "name": "include_site_name_beside_logo", + "type": "boolean", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "boolean" + }, + "social_instagram": { + "name": "social_instagram", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "social_youtube": { + "name": "social_youtube", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "social_facebook": { + "name": "social_facebook", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "social_twitter": { + "name": "social_twitter", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "social_linkedin": { + "name": "social_linkedin", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "social_pinterest": { + "name": "social_pinterest", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "social_tiktok": { + "name": "social_tiktok", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "social_snapchat": { + "name": "social_snapchat", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "global_css": { + "name": "global_css", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "ga_property_id": { + "name": "ga_property_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "shipping_sort": { + "name": "shipping_sort", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "length": 6, + "mappedType": "datetime" + } + }, + "name": "site_settings", + "schema": "public", + "indexes": [ + { + "keyName": "IDX_site_settings_deleted_at", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_site_settings_deleted_at\" ON \"site_settings\" (deleted_at) WHERE deleted_at IS NULL" + }, + { + "keyName": "site_settings_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "constraint": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {}, + "nativeEnums": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "url": { + "name": "url", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "json" + }, + "post_id": { + "name": "post_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "site_settings_id": { + "name": "site_settings_id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "text" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 6, + "default": "now()", + "mappedType": "datetime" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamptz", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "length": 6, + "mappedType": "datetime" + } + }, + "name": "image", + "schema": "public", + "indexes": [ + { + "keyName": "IDX_image_post_id_unique", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE UNIQUE INDEX IF NOT EXISTS \"IDX_image_post_id_unique\" ON \"image\" (post_id) WHERE deleted_at IS NULL" + }, + { + "keyName": "IDX_image_site_settings_id_unique", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE UNIQUE INDEX IF NOT EXISTS \"IDX_image_site_settings_id_unique\" ON \"image\" (site_settings_id) WHERE deleted_at IS NULL" + }, + { + "keyName": "IDX_image_deleted_at", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_image_deleted_at\" ON \"image\" (deleted_at) WHERE deleted_at IS NULL" + }, + { + "keyName": "IDX_product_image_url", + "columnNames": [], + "composite": false, + "constraint": false, + "primary": false, + "unique": false, + "expression": "CREATE INDEX IF NOT EXISTS \"IDX_product_image_url\" ON \"image\" (url) WHERE deleted_at IS NULL" + }, + { + "keyName": "image_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "constraint": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": { + "image_post_id_foreign": { + "constraintName": "image_post_id_foreign", + "columnNames": [ + "post_id" + ], + "localTableName": "public.image", + "referencedColumnNames": [ + "id" + ], + "referencedTableName": "public.post", + "deleteRule": "set null", + "updateRule": "cascade" + }, + "image_site_settings_id_foreign": { + "constraintName": "image_site_settings_id_foreign", + "columnNames": [ + "site_settings_id" + ], + "localTableName": "public.image", + "referencedColumnNames": [ + "id" + ], + "referencedTableName": "public.site_settings", + "deleteRule": "set null", + "updateRule": "cascade" + } + }, + "nativeEnums": {} + } + ], + "nativeEnums": {} +} diff --git a/plugins/page-builder/src/modules/page-builder/migrations/Migration20250305164601.ts b/plugins/page-builder/src/modules/page-builder/migrations/Migration20250305164601.ts new file mode 100644 index 00000000..914a57ed --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/migrations/Migration20250305164601.ts @@ -0,0 +1,103 @@ +import { Migration } from '@mikro-orm/migrations'; + +export class Migration20250305164601 extends Migration { + + override async up(): Promise { + this.addSql(`alter table if exists "image" drop constraint if exists "image_site_settings_id_unique";`); + this.addSql(`alter table if exists "image" drop constraint if exists "image_post_id_unique";`); + this.addSql(`alter table if exists "post_tag" drop constraint if exists "post_tag_handle_unique";`); + this.addSql(`alter table if exists "post_author" drop constraint if exists "post_author_medusa_user_id_unique";`); + this.addSql(`alter table if exists "post" drop constraint if exists "post_handle_unique";`); + this.addSql(`create table if not exists "navigation_item" ("id" text not null, "label" text not null, "location" text check ("location" in ('header', 'footer')) not null, "url" text not null, "new_tab" boolean not null default false, "sort_order" integer not null default 0, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "navigation_item_pkey" primary key ("id"));`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_navigation_item_deleted_at" ON "navigation_item" (deleted_at) WHERE deleted_at IS NULL;`); + + this.addSql(`create table if not exists "post" ("id" text not null, "type" text check ("type" in ('page', 'post')) not null, "title" text not null, "handle" text not null, "excerpt" text null, "content" jsonb null, "status" text check ("status" in ('draft', 'published', 'archived')) not null default 'draft', "content_mode" text check ("content_mode" in ('basic', 'advanced')) not null, "seo" jsonb null, "published_at" text null, "archived_at" text null, "is_home_page" boolean not null default false, "root_id" text null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "post_pkey" primary key ("id"));`); + this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_post_handle_unique" ON "post" (handle) WHERE deleted_at IS NULL;`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_post_root_id" ON "post" (root_id) WHERE deleted_at IS NULL;`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_post_deleted_at" ON "post" (deleted_at) WHERE deleted_at IS NULL;`); + + this.addSql(`create table if not exists "post_author" ("id" text not null, "name" text not null, "medusa_user_id" text not null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "post_author_pkey" primary key ("id"));`); + this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_post_author_medusa_user_id_unique" ON "post_author" (medusa_user_id) WHERE deleted_at IS NULL;`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_post_author_deleted_at" ON "post_author" (deleted_at) WHERE deleted_at IS NULL;`); + + this.addSql(`create table if not exists "post_post_authors" ("post_id" text not null, "post_author_id" text not null, constraint "post_post_authors_pkey" primary key ("post_id", "post_author_id"));`); + + this.addSql(`create table if not exists "post_tag" ("id" text not null, "label" text not null, "handle" text not null, "description" text not null, "created_by_id" text not null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "post_tag_pkey" primary key ("id"));`); + this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_post_tag_handle_unique" ON "post_tag" (handle) WHERE deleted_at IS NULL;`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_post_tag_deleted_at" ON "post_tag" (deleted_at) WHERE deleted_at IS NULL;`); + + this.addSql(`create table if not exists "post_post_tags" ("post_id" text not null, "post_tag_id" text not null, constraint "post_post_tags_pkey" primary key ("post_id", "post_tag_id"));`); + + this.addSql(`create table if not exists "post_template" ("id" text not null, "title" text not null, "status" text check ("status" in ('draft', 'published', 'archived')) not null default 'draft', "type" text check ("type" in ('page', 'post')) not null, "description" text null, "sort_order" integer not null default 0, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "post_template_pkey" primary key ("id"));`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_post_template_deleted_at" ON "post_template" (deleted_at) WHERE deleted_at IS NULL;`); + + this.addSql(`create table if not exists "post_section" ("id" text not null, "type" text check ("type" in ('button_list', 'cta', 'header', 'hero', 'product_carousel', 'product_grid', 'image_gallery', 'raw_html', 'rich_text', 'blog_list')) not null, "status" text check ("status" in ('draft', 'published', 'archived')) not null default 'draft', "name" text not null, "content" jsonb not null, "settings" jsonb not null, "styles" jsonb null, "is_reusable" boolean not null default false, "usage_count" integer not null default 1, "sort_order" integer not null, "post_id" text null, "post_template_id" text null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "post_section_pkey" primary key ("id"));`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_post_section_post_id" ON "post_section" (post_id) WHERE deleted_at IS NULL;`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_post_section_post_template_id" ON "post_section" (post_template_id) WHERE deleted_at IS NULL;`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_post_section_deleted_at" ON "post_section" (deleted_at) WHERE deleted_at IS NULL;`); + + this.addSql(`create table if not exists "site_settings" ("id" text not null, "description" text null, "header_code" text null, "footer_code" text null, "storefront_url" text null, "primary_theme_colors" jsonb null, "accent_theme_colors" jsonb null, "highlight_theme_colors" jsonb null, "display_font" jsonb null, "body_font" jsonb null, "include_site_name_beside_logo" boolean not null, "social_instagram" text null, "social_youtube" text null, "social_facebook" text null, "social_twitter" text null, "social_linkedin" text null, "social_pinterest" text null, "social_tiktok" text null, "social_snapchat" text null, "global_css" text null, "ga_property_id" text null, "shipping_sort" text null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "site_settings_pkey" primary key ("id"));`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_site_settings_deleted_at" ON "site_settings" (deleted_at) WHERE deleted_at IS NULL;`); + + this.addSql(`create table if not exists "image" ("id" text not null, "url" text not null, "metadata" jsonb null, "post_id" text null, "site_settings_id" text null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "image_pkey" primary key ("id"));`); + this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_image_post_id_unique" ON "image" (post_id) WHERE deleted_at IS NULL;`); + this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_image_site_settings_id_unique" ON "image" (site_settings_id) WHERE deleted_at IS NULL;`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_image_deleted_at" ON "image" (deleted_at) WHERE deleted_at IS NULL;`); + this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_product_image_url" ON "image" (url) WHERE deleted_at IS NULL;`); + + this.addSql(`alter table if exists "post" add constraint "post_root_id_foreign" foreign key ("root_id") references "post" ("id") on update cascade on delete set null;`); + + this.addSql(`alter table if exists "post_post_authors" add constraint "post_post_authors_post_id_foreign" foreign key ("post_id") references "post" ("id") on update cascade on delete cascade;`); + this.addSql(`alter table if exists "post_post_authors" add constraint "post_post_authors_post_author_id_foreign" foreign key ("post_author_id") references "post_author" ("id") on update cascade on delete cascade;`); + + this.addSql(`alter table if exists "post_post_tags" add constraint "post_post_tags_post_id_foreign" foreign key ("post_id") references "post" ("id") on update cascade on delete cascade;`); + this.addSql(`alter table if exists "post_post_tags" add constraint "post_post_tags_post_tag_id_foreign" foreign key ("post_tag_id") references "post_tag" ("id") on update cascade on delete cascade;`); + + this.addSql(`alter table if exists "post_section" add constraint "post_section_post_id_foreign" foreign key ("post_id") references "post" ("id") on update cascade on delete set null;`); + this.addSql(`alter table if exists "post_section" add constraint "post_section_post_template_id_foreign" foreign key ("post_template_id") references "post_template" ("id") on update cascade on delete set null;`); + + this.addSql(`alter table if exists "image" add constraint "image_post_id_foreign" foreign key ("post_id") references "post" ("id") on update cascade on delete set null;`); + this.addSql(`alter table if exists "image" add constraint "image_site_settings_id_foreign" foreign key ("site_settings_id") references "site_settings" ("id") on update cascade on delete set null;`); + } + + override async down(): Promise { + this.addSql(`alter table if exists "post" drop constraint if exists "post_root_id_foreign";`); + + this.addSql(`alter table if exists "post_post_authors" drop constraint if exists "post_post_authors_post_id_foreign";`); + + this.addSql(`alter table if exists "post_post_tags" drop constraint if exists "post_post_tags_post_id_foreign";`); + + this.addSql(`alter table if exists "post_section" drop constraint if exists "post_section_post_id_foreign";`); + + this.addSql(`alter table if exists "image" drop constraint if exists "image_post_id_foreign";`); + + this.addSql(`alter table if exists "post_post_authors" drop constraint if exists "post_post_authors_post_author_id_foreign";`); + + this.addSql(`alter table if exists "post_post_tags" drop constraint if exists "post_post_tags_post_tag_id_foreign";`); + + this.addSql(`alter table if exists "post_section" drop constraint if exists "post_section_post_template_id_foreign";`); + + this.addSql(`alter table if exists "image" drop constraint if exists "image_site_settings_id_foreign";`); + + this.addSql(`drop table if exists "navigation_item" cascade;`); + + this.addSql(`drop table if exists "post" cascade;`); + + this.addSql(`drop table if exists "post_author" cascade;`); + + this.addSql(`drop table if exists "post_post_authors" cascade;`); + + this.addSql(`drop table if exists "post_tag" cascade;`); + + this.addSql(`drop table if exists "post_post_tags" cascade;`); + + this.addSql(`drop table if exists "post_template" cascade;`); + + this.addSql(`drop table if exists "post_section" cascade;`); + + this.addSql(`drop table if exists "site_settings" cascade;`); + + this.addSql(`drop table if exists "image" cascade;`); + } + +} diff --git a/plugins/page-builder/src/modules/page-builder/models/image.ts b/plugins/page-builder/src/modules/page-builder/models/image.ts index ab25ca5f..f372a293 100644 --- a/plugins/page-builder/src/modules/page-builder/models/image.ts +++ b/plugins/page-builder/src/modules/page-builder/models/image.ts @@ -1,21 +1,30 @@ import { model } from '@medusajs/framework/utils' -import { Page } from './page' +import { Post } from './post' import { SiteSettings } from './site-settings' -// TODO: check if this model is needed -export const Image = model.define('image', { - id: model.id().primaryKey(), - url: model.text(), - metadata: model.json().nullable(), +export const Image = model + .define('image', { + id: model.id({ prefix: 'img' }).primaryKey(), + url: model.text(), + metadata: model.json().nullable(), - page: model - .belongsTo(() => Page, { - mappedBy: 'featured_image', - }) - .nullable(), - site: model - .belongsTo(() => SiteSettings, { - mappedBy: 'favicon', - }) - .nullable(), -}) + // relations fields + post: model + .belongsTo(() => Post, { + mappedBy: 'featured_image', + }) + .nullable(), + site_settings: model + .belongsTo(() => SiteSettings, { + mappedBy: 'favicon', + }) + .nullable(), + }) + .indexes([ + { + name: 'IDX_product_image_url', + on: ['url'], + unique: false, + where: 'deleted_at IS NULL', + }, + ]) diff --git a/plugins/page-builder/src/modules/page-builder/models/index.ts b/plugins/page-builder/src/modules/page-builder/models/index.ts index 24188d60..e7009779 100644 --- a/plugins/page-builder/src/modules/page-builder/models/index.ts +++ b/plugins/page-builder/src/modules/page-builder/models/index.ts @@ -1,6 +1,8 @@ -export * from './page' -export * from './page-template' -export * from './page-section' +export * from './post-author' +export * from './post' +export * from './post-section' +export * from './post-tag' +export * from './post-template' +export * from './image' export * from './site-settings' export * from './navigation-item' -export * from './page-tag' diff --git a/plugins/page-builder/src/modules/page-builder/models/navigation-item.ts b/plugins/page-builder/src/modules/page-builder/models/navigation-item.ts index 0c40f166..471f5db8 100644 --- a/plugins/page-builder/src/modules/page-builder/models/navigation-item.ts +++ b/plugins/page-builder/src/modules/page-builder/models/navigation-item.ts @@ -4,7 +4,7 @@ export const NavigationItem = model.define('navigation_item', { id: model.id({ prefix: 'nav_item' }).primaryKey(), label: model.text(), location: model.enum(['header', 'footer']), - sort_order: model.number().default(0), - url: model.text().nullable(), + url: model.text(), new_tab: model.boolean().default(false), + sort_order: model.number().default(0), }) diff --git a/plugins/page-builder/src/modules/page-builder/models/page-tag.ts b/plugins/page-builder/src/modules/page-builder/models/page-tag.ts deleted file mode 100644 index 078831b9..00000000 --- a/plugins/page-builder/src/modules/page-builder/models/page-tag.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { model } from '@medusajs/framework/utils' -import { Page } from './page' - -export const PageTag = model.define('page_tag', { - id: model.id({ prefix: 'pagetag' }).primaryKey(), - label: model.text(), - handle: model.text().unique(), - description: model.text(), - // created_by_id: model.id(), - pages: model.manyToMany(() => Page, { - mappedBy: 'tags', - }), -}) diff --git a/plugins/page-builder/src/modules/page-builder/models/page-template.ts b/plugins/page-builder/src/modules/page-builder/models/page-template.ts deleted file mode 100644 index 078851dd..00000000 --- a/plugins/page-builder/src/modules/page-builder/models/page-template.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { model } from '@medusajs/framework/utils' -import { PageSection } from './page-section' - -export const PageTemplate = model.define('page_template', { - id: model.id({ prefix: 'page_temp' }).primaryKey(), - title: model.text(), - status: model.enum(['draft', 'published', 'archived']).default('draft'), - type: model.enum(['page', 'post', 'product', 'revision']), - // last_updated_by_id: model.text().nullable(), - sort_order: model.number().default(0), - description: model.text().nullable(), - sections: model.hasMany(() => PageSection), -}) diff --git a/plugins/page-builder/src/modules/page-builder/models/page.ts b/plugins/page-builder/src/modules/page-builder/models/page.ts deleted file mode 100644 index fd1e3367..00000000 --- a/plugins/page-builder/src/modules/page-builder/models/page.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { model } from '@medusajs/framework/utils' -import { PageSection } from './page-section' -import { PageTag } from './page-tag' - -export const Page = model.define('page', { - id: model.id({ prefix: 'page' }).primaryKey(), - title: model.text(), - handle: model.text().unique(), - excerpt: model.text().nullable(), - content: model.json().nullable(), - type: model.enum(['page', 'post', 'product', 'revision']), - status: model.enum(['draft', 'published', 'archived']).default('draft'), - content_mode: model.enum(['basic', 'advanced']), - seo: model.json().nullable(), - published_at: model.text().nullable(), - archived_at: model.text().nullable(), - is_home_page: model.boolean().default(false), - - featured_image: model.hasOne(() => Image).nullable(), - - // author_id: model.array(), // TODO: or model.text()? - // last_updated_by_id: model.text(), - - root: model - .belongsTo(() => Page, { - mappedBy: undefined, - }) - .nullable(), - sections: model.hasMany(() => PageSection), - tags: model.manyToMany(() => PageTag, { - mappedBy: 'page_id', - pivotTable: 'page_tag', - joinColumn: 'page_id', - inverseJoinColumn: 'tag_id', - }), -}) diff --git a/plugins/page-builder/src/modules/page-builder/models/post-author.ts b/plugins/page-builder/src/modules/page-builder/models/post-author.ts new file mode 100644 index 00000000..00b0fbc2 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/post-author.ts @@ -0,0 +1,13 @@ +import { model } from '@medusajs/framework/utils' +import { Post } from './post' + +export const PostAuthor = model.define('post_author', { + id: model.id({ prefix: 'post_author' }).primaryKey(), + name: model.text(), + + // relations fields + medusa_user_id: model.text().unique(), + posts: model.manyToMany(() => Post, { + mappedBy: 'authors', + }), +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/page-section.ts b/plugins/page-builder/src/modules/page-builder/models/post-section.ts similarity index 57% rename from plugins/page-builder/src/modules/page-builder/models/page-section.ts rename to plugins/page-builder/src/modules/page-builder/models/post-section.ts index a378fc39..eae96fe6 100644 --- a/plugins/page-builder/src/modules/page-builder/models/page-section.ts +++ b/plugins/page-builder/src/modules/page-builder/models/post-section.ts @@ -1,9 +1,9 @@ import { model } from '@medusajs/framework/utils' -import { Page } from './page' -import { PageTemplate } from './page-template' +import { Post } from './post' +import { PostTemplate } from './post-template' -export const PageSection = model.define('page_section', { - id: model.id({ prefix: 'pagesec' }).primaryKey(), +export const PostSection = model.define('post_section', { + id: model.id({ prefix: 'postsec' }).primaryKey(), type: model.enum([ 'button_list', 'cta', @@ -16,22 +16,23 @@ export const PageSection = model.define('page_section', { 'rich_text', 'blog_list', ]), - name: model.text(), - content: model.json().nullable(), status: model.enum(['draft', 'published', 'archived']).default('draft'), - settings: model.json().nullable(), - is_reusable: model.boolean().default(false), + name: model.text(), + content: model.json(), + settings: model.json(), styles: model.json().nullable(), + is_reusable: model.boolean().default(false), + usage_count: model.number().default(1), sort_order: model.number(), - // last_updated_by_id: model.text().nullable(), - page: model - .belongsTo(() => Page, { + // relations fields + post: model + .belongsTo(() => Post, { mappedBy: 'sections', }) .nullable(), - pageTemplate: model - .belongsTo(() => PageTemplate, { + post_template: model + .belongsTo(() => PostTemplate, { mappedBy: 'sections', }) .nullable(), diff --git a/plugins/page-builder/src/modules/page-builder/models/post-tag.ts b/plugins/page-builder/src/modules/page-builder/models/post-tag.ts new file mode 100644 index 00000000..582276d9 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/post-tag.ts @@ -0,0 +1,15 @@ +import { model } from '@medusajs/framework/utils' +import { Post } from './post' + +export const PostTag = model.define('post_tag', { + id: model.id({ prefix: 'post_tag' }).primaryKey(), + label: model.text(), + handle: model.text().unique(), + description: model.text(), + + // relations fields + created_by_id: model.text(), + posts: model.manyToMany(() => Post, { + mappedBy: 'tags', + }), +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/post-template.ts b/plugins/page-builder/src/modules/page-builder/models/post-template.ts new file mode 100644 index 00000000..5ab7a7d4 --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/post-template.ts @@ -0,0 +1,14 @@ +import { model } from '@medusajs/framework/utils' +import { PostSection } from './post-section' + +export const PostTemplate = model.define('post_template', { + id: model.id({ prefix: 'post_temp' }).primaryKey(), + title: model.text(), + status: model.enum(['draft', 'published', 'archived']).default('draft'), + type: model.enum(['page', 'post']), + description: model.text().nullable(), + sort_order: model.number().default(0), + + // relations fields + sections: model.hasMany(() => PostSection), +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/post.ts b/plugins/page-builder/src/modules/page-builder/models/post.ts new file mode 100644 index 00000000..0844912c --- /dev/null +++ b/plugins/page-builder/src/modules/page-builder/models/post.ts @@ -0,0 +1,36 @@ +import { model } from '@medusajs/framework/utils' +import { PostSection } from './post-section' +import { PostTag } from './post-tag' +import { PostAuthor } from './post-author' +import { Image } from './image' + +export const Post = model.define('post', { + id: model.id({ prefix: 'post' }).primaryKey(), + type: model.enum(['page', 'post']), + title: model.text(), + handle: model.text().unique(), + excerpt: model.text().nullable(), + content: model.json().nullable(), + status: model.enum(['draft', 'published', 'archived']).default('draft'), + content_mode: model.enum(['basic', 'advanced']), + seo: model.json().nullable(), + published_at: model.text().nullable(), + archived_at: model.text().nullable(), + is_home_page: model.boolean().default(false), + + // relations fields + featured_image: model.hasOne(() => Image, { + mappedBy: 'post', + }), + authors: model.manyToMany(() => PostAuthor, { + mappedBy: 'posts', + }), + + root: model.belongsTo(() => Post).nullable(), + + sections: model.hasMany(() => PostSection), + + tags: model.manyToMany(() => PostTag, { + mappedBy: 'posts', + }), +}) diff --git a/plugins/page-builder/src/modules/page-builder/models/site-settings.ts b/plugins/page-builder/src/modules/page-builder/models/site-settings.ts index 324be546..461fb055 100644 --- a/plugins/page-builder/src/modules/page-builder/models/site-settings.ts +++ b/plugins/page-builder/src/modules/page-builder/models/site-settings.ts @@ -4,11 +4,6 @@ import { Image } from './image' export const SiteSettings = model.define('site_settings', { id: model.id({ prefix: 'site_sett' }).primaryKey(), description: model.text().nullable(), - favicon: model - .hasOne(() => Image, { - mappedBy: 'favicon_id', - }) - .nullable(), header_code: model.text().nullable(), footer_code: model.text().nullable(), storefront_url: model.text().nullable(), @@ -17,7 +12,7 @@ export const SiteSettings = model.define('site_settings', { highlight_theme_colors: model.json().nullable(), display_font: model.json().nullable(), body_font: model.json().nullable(), - include_site_name_beside_logo: model.boolean().default(false), + include_site_name_beside_logo: model.boolean(), social_instagram: model.text().nullable(), social_youtube: model.text().nullable(), social_facebook: model.text().nullable(), @@ -29,4 +24,9 @@ export const SiteSettings = model.define('site_settings', { global_css: model.text().nullable(), ga_property_id: model.text().nullable(), shipping_sort: model.text().nullable(), + + // relations + favicon: model.hasOne(() => Image, { + mappedBy: 'site_settings', + }), }) diff --git a/plugins/page-builder/src/modules/page-builder/service.ts b/plugins/page-builder/src/modules/page-builder/service.ts index 308fb745..46dac9fb 100644 --- a/plugins/page-builder/src/modules/page-builder/service.ts +++ b/plugins/page-builder/src/modules/page-builder/service.ts @@ -1,18 +1,22 @@ import { MedusaService } from '@medusajs/framework/utils' import { - Page, - PageTemplate, - PageTag, - PageSection, + PostAuthor, + Post, + PostTemplate, + PostTag, + PostSection, + Image, SiteSettings, NavigationItem, } from './models' class PageBuilderService extends MedusaService({ - Page, - PageTag, - PageSection, - PageTemplate, + PostAuthor, + Post, + PostTemplate, + PostTag, + PostSection, + Image, SiteSettings, NavigationItem, }) {} From b8a5251d31231e2830d77f525764dc72154e6148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antony=20Dur=C3=A1n?= Date: Thu, 6 Mar 2025 09:38:01 -0600 Subject: [PATCH 06/37] fix(page-builder): remove sidebar-container export --- .../page-builder/src/admin/components/templates/shell/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/page-builder/src/admin/components/templates/shell/index.ts b/plugins/page-builder/src/admin/components/templates/shell/index.ts index c11d2ee8..c55febbf 100644 --- a/plugins/page-builder/src/admin/components/templates/shell/index.ts +++ b/plugins/page-builder/src/admin/components/templates/shell/index.ts @@ -1,3 +1,2 @@ export * from './shell' export * from './main-content' -export * from './sidebar-container' From 08a47bfb64410a04e376ce50a57027306fc05c2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antony=20Dur=C3=A1n?= Date: Thu, 6 Mar 2025 09:38:37 -0600 Subject: [PATCH 07/37] chore(page-builder): upgrade Medusa dependencies to version 2.6.0 --- plugins/page-builder/package.json | 30 +- yarn.lock | 712 ++++++++++++++---------------- 2 files changed, 347 insertions(+), 395 deletions(-) diff --git a/plugins/page-builder/package.json b/plugins/page-builder/package.json index 431616e1..217ef87d 100644 --- a/plugins/page-builder/package.json +++ b/plugins/page-builder/package.json @@ -36,12 +36,12 @@ "db:generate": "DB_USERNAME=${DB_USERNAME:-postgres} DB_PASSWORD=${DB_PASSWORD:-postgres} medusa plugin:db:generate" }, "devDependencies": { - "@medusajs/admin-sdk": "2.5.1", - "@medusajs/cli": "2.5.1", - "@medusajs/framework": "2.5.1", - "@medusajs/icons": "2.5.1", - "@medusajs/medusa": "2.5.1", - "@medusajs/test-utils": "2.5.1", + "@medusajs/admin-sdk": "2.6.0", + "@medusajs/cli": "2.6.0", + "@medusajs/framework": "2.6.0", + "@medusajs/icons": "2.6.0", + "@medusajs/medusa": "2.6.0", + "@medusajs/test-utils": "2.6.0", "@mikro-orm/cli": "6.4.3", "@mikro-orm/core": "6.4.3", "@mikro-orm/knex": "6.4.3", @@ -62,13 +62,13 @@ "vite": "^5.2.11" }, "peerDependencies": { - "@medusajs/admin-sdk": "2.5.1", - "@medusajs/cli": "2.5.1", - "@medusajs/framework": "2.5.1", - "@medusajs/icons": "2.5.1", - "@medusajs/medusa": "2.5.1", - "@medusajs/test-utils": "2.5.1", - "@medusajs/ui": "4.0.3", + "@medusajs/admin-sdk": "^2.6.0", + "@medusajs/cli": "^2.6.0", + "@medusajs/framework": "^2.6.0", + "@medusajs/icons": "^2.6.0", + "@medusajs/medusa": "^2.6.0", + "@medusajs/test-utils": "^2.6.0", + "@medusajs/ui": "^4.0.6", "@mikro-orm/cli": "6.4.3", "@mikro-orm/core": "6.4.3", "@mikro-orm/knex": "6.4.3", @@ -85,7 +85,7 @@ }, "dependencies": { "@lambdacurry/medusa-plugins-sdk": "latest", - "@medusajs/js-sdk": "^2.5.1", - "@medusajs/workflows-sdk": "^2.5.1" + "@medusajs/js-sdk": "2.6.0", + "@medusajs/workflows-sdk": "2.6.0" } } diff --git a/yarn.lock b/yarn.lock index d76413bc..939f696d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1859,14 +1859,14 @@ __metadata: resolution: "@lambdacurry/medusa-page-builder@workspace:plugins/page-builder" dependencies: "@lambdacurry/medusa-plugins-sdk": "npm:latest" - "@medusajs/admin-sdk": "npm:2.5.1" - "@medusajs/cli": "npm:2.5.1" - "@medusajs/framework": "npm:2.5.1" - "@medusajs/icons": "npm:2.5.1" - "@medusajs/js-sdk": "npm:^2.5.1" - "@medusajs/medusa": "npm:2.5.1" - "@medusajs/test-utils": "npm:2.5.1" - "@medusajs/workflows-sdk": "npm:^2.5.1" + "@medusajs/admin-sdk": "npm:2.6.0" + "@medusajs/cli": "npm:2.6.0" + "@medusajs/framework": "npm:2.6.0" + "@medusajs/icons": "npm:2.6.0" + "@medusajs/js-sdk": "npm:2.6.0" + "@medusajs/medusa": "npm:2.6.0" + "@medusajs/test-utils": "npm:2.6.0" + "@medusajs/workflows-sdk": "npm:2.6.0" "@mikro-orm/cli": "npm:6.4.3" "@mikro-orm/core": "npm:6.4.3" "@mikro-orm/knex": "npm:6.4.3" @@ -1886,13 +1886,13 @@ __metadata: typescript: "npm:^5.6.2" vite: "npm:^5.2.11" peerDependencies: - "@medusajs/admin-sdk": 2.5.1 - "@medusajs/cli": 2.5.1 - "@medusajs/framework": 2.5.1 - "@medusajs/icons": 2.5.1 - "@medusajs/medusa": 2.5.1 - "@medusajs/test-utils": 2.5.1 - "@medusajs/ui": 4.0.3 + "@medusajs/admin-sdk": ^2.6.0 + "@medusajs/cli": ^2.6.0 + "@medusajs/framework": ^2.6.0 + "@medusajs/icons": ^2.6.0 + "@medusajs/medusa": ^2.6.0 + "@medusajs/test-utils": ^2.6.0 + "@medusajs/ui": ^4.0.6 "@mikro-orm/cli": 6.4.3 "@mikro-orm/core": 6.4.3 "@mikro-orm/knex": 6.4.3 @@ -2044,13 +2044,13 @@ __metadata: languageName: unknown linkType: soft -"@medusajs/admin-bundler@npm:^2.5.0, @medusajs/admin-bundler@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/admin-bundler@npm:2.5.1" +"@medusajs/admin-bundler@npm:^2.5.0, @medusajs/admin-bundler@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/admin-bundler@npm:2.6.0" dependencies: - "@medusajs/admin-shared": "npm:2.5.1" - "@medusajs/admin-vite-plugin": "npm:2.5.1" - "@medusajs/dashboard": "npm:2.5.1" + "@medusajs/admin-shared": "npm:2.6.0" + "@medusajs/admin-vite-plugin": "npm:2.6.0" + "@medusajs/dashboard": "npm:2.6.0" "@rollup/plugin-node-resolve": "npm:^16.0.0" "@vitejs/plugin-react": "npm:^4.2.1" autoprefixer: "npm:^10.4.16" @@ -2063,7 +2063,7 @@ __metadata: vite: "npm:^5.4.14" peerDependencies: react-dom: ^18.0.0 - checksum: 10c0/18f263d8d8487c297b4b24e8639a29451b2aa49b08853fc61b31de90ad0dbc467e071eacc6b358e17f9ff748e8fc10c40a7c4c72632c1909a3308b0ea1231125 + checksum: 10c0/e18125f54b326214fd219c9ec0856460e95220c95347f2158cb7f92ed5d2d60dabedab57a785dde2567b4a9d7c2fb4a4b78e3137f87b2eb556c500581332cc51 languageName: node linkType: hard @@ -2110,13 +2110,13 @@ __metadata: languageName: node linkType: hard -"@medusajs/admin-sdk@npm:2.5.1": - version: 2.5.1 - resolution: "@medusajs/admin-sdk@npm:2.5.1" +"@medusajs/admin-sdk@npm:2.6.0": + version: 2.6.0 + resolution: "@medusajs/admin-sdk@npm:2.6.0" dependencies: - "@medusajs/admin-shared": "npm:^2.5.1" + "@medusajs/admin-shared": "npm:^2.6.0" zod: "npm:3.22.4" - checksum: 10c0/4741057fef67a08fa6fab2fa89f742005d4a4e31d35687eb8539941c9f2ffba22d12803cd0c2a6d9576a213a84fe5804bf60f9ac94f0e1efd393d1cad9ffea0d + checksum: 10c0/22d268882daf0ec5a7c5b6c82ac39b0fc0984d2e5bcd0d7f3ca3e141f22889b4c533c1f560c167d34eab05d73eaabb8ad0c525ee5a0dc379f4eeb330f2b669c0 languageName: node linkType: hard @@ -2127,10 +2127,10 @@ __metadata: languageName: node linkType: hard -"@medusajs/admin-shared@npm:2.5.1, @medusajs/admin-shared@npm:^2.5.0, @medusajs/admin-shared@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/admin-shared@npm:2.5.1" - checksum: 10c0/f5b8425cbd44a2dcc96ebe86d55d409cfa04a47923f4627b3a8882818662447c512a323d6e09ebfcb4996f6c83926ca54ab8faf7ab3c3c27123a34d0cb53ab4c +"@medusajs/admin-shared@npm:2.6.0, @medusajs/admin-shared@npm:^2.5.0, @medusajs/admin-shared@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/admin-shared@npm:2.6.0" + checksum: 10c0/330f6ca753ea49f3e9f40d1b2aef01dab6615add227fa5287954ab12185889f1ec4d84f5194bf3c345004156e19bea80b6ef7fab23d62f937fb2eab40d103955 languageName: node linkType: hard @@ -2153,14 +2153,14 @@ __metadata: languageName: node linkType: hard -"@medusajs/admin-vite-plugin@npm:2.5.1": - version: 2.5.1 - resolution: "@medusajs/admin-vite-plugin@npm:2.5.1" +"@medusajs/admin-vite-plugin@npm:2.6.0": + version: 2.6.0 + resolution: "@medusajs/admin-vite-plugin@npm:2.6.0" dependencies: "@babel/parser": "npm:7.25.6" "@babel/traverse": "npm:7.25.6" "@babel/types": "npm:7.25.6" - "@medusajs/admin-shared": "npm:2.5.1" + "@medusajs/admin-shared": "npm:2.6.0" chokidar: "npm:3.5.3" fdir: "npm:6.1.1" magic-string: "npm:0.30.5" @@ -2168,20 +2168,20 @@ __metadata: picocolors: "npm:^1.1.0" peerDependencies: vite: ^5.0.0 - checksum: 10c0/fbded1c97364457470f9a70aac7f78fc7b35d1d1a69414d43d47f0decd53e5003d789b2e420a629c11b8792b1ed9e52c542eb4a0883a44285cfec7cd4d447c1c + checksum: 10c0/d7f911723cc8f0b446d1a3a2470d64a2301fc963422cbb54fd3024c64da60e2f54d33dda6d36c7f768534970bd203157a8c41ccf431b8e598d4ef60485340a57 languageName: node linkType: hard -"@medusajs/api-key@npm:^2.5.0, @medusajs/api-key@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/api-key@npm:2.5.1" +"@medusajs/api-key@npm:^2.5.0, @medusajs/api-key@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/api-key@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/c0616181a90ffd2738f621446553b958f0b7e0ab2e1df58c86ef02d45121c87f3a0a8b97b85ec5807e94793e4dc0f8b1672d49cde96500a50f3081512b240de8 + checksum: 10c0/46d6198db2e890d5796b34b4363b2bfe4f092eb04edd2883c5533cd289a01eb228481fb999c11add6c291d5f74fc40ac5297e40747ca9b49e244bda0051bf695 languageName: node linkType: hard @@ -2198,14 +2198,14 @@ __metadata: languageName: node linkType: hard -"@medusajs/auth-emailpass@npm:^2.5.0, @medusajs/auth-emailpass@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/auth-emailpass@npm:2.5.1" +"@medusajs/auth-emailpass@npm:^2.5.0, @medusajs/auth-emailpass@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/auth-emailpass@npm:2.6.0" dependencies: scrypt-kdf: "npm:^2.0.1" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/28953be54ab0f61cab8541ba721f577f9c64b44ede24e3fea0f7b87744a1feeb6d8f11eee2dd11a74a8fd2b7df783ddaa9eca613c32836ce1de8b207dc679483 + checksum: 10c0/d065dd1edbff7163adc980499e6eb219990fec4af5151161b90ff0a355da75f361b7ade1dfb7cbbfc404f22afdca1edba68525acaeb29ac462dfa35daf516dc1 languageName: node linkType: hard @@ -2220,12 +2220,12 @@ __metadata: languageName: node linkType: hard -"@medusajs/auth-github@npm:^2.5.0, @medusajs/auth-github@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/auth-github@npm:2.5.1" +"@medusajs/auth-github@npm:^2.5.0, @medusajs/auth-github@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/auth-github@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/d7b28e10dfc154f50bed9c9bef084d0acbae05bc4d24d8e38a9ff4dd307822b68624dea690a81d3dda5d9ba3cc0abbd3a351c437c7aac26555ac10f9966391e4 + checksum: 10c0/027ea828dab54e2d2c02fb9a3c73dbe45dec782c1c2aa9fca100ed82a2aedd58417e178897b6939cf100ee62939af46293d2241aabfcb980a689b24db247b311 languageName: node linkType: hard @@ -2238,14 +2238,14 @@ __metadata: languageName: node linkType: hard -"@medusajs/auth-google@npm:^2.5.0, @medusajs/auth-google@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/auth-google@npm:2.5.1" +"@medusajs/auth-google@npm:^2.5.0, @medusajs/auth-google@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/auth-google@npm:2.6.0" dependencies: jsonwebtoken: "npm:^9.0.2" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/3c980a6b4d66beee3564972f009580a7d27f98b8bd5d7f2fbf3372c27f510972a0d69188952d09c7779a71592f3e53ab24c11650c30e19522ebde01395caded8 + checksum: 10c0/c66e549b8b287ac41020ab86ec37ec66ccd57e79666e0dea8f170b019b6c9b45244800defa7b93d05c5d47522e9f1e273e9fc9baa1a2d0cf62bd1051fe3becfd languageName: node linkType: hard @@ -2260,16 +2260,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/auth@npm:^2.5.0, @medusajs/auth@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/auth@npm:2.5.1" +"@medusajs/auth@npm:^2.5.0, @medusajs/auth@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/auth@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/528563e75129a703c35b7f6cdc3d74e23b2e4a16cfbb635ee19824a139f3d5e60bcf1aee7ab3a2925503026317c223658e89a5c03ee205fa7e273d93980d9278 + checksum: 10c0/fbf700f4aefc9392579d7b625c1baa6c2bb631a45c55384e36ec93de6e9d0e91cf69b110a5e1d620792412d78a0929df7d69b1135bac67f902571b08bbde3313 languageName: node linkType: hard @@ -2286,12 +2286,12 @@ __metadata: languageName: node linkType: hard -"@medusajs/cache-inmemory@npm:^2.5.0, @medusajs/cache-inmemory@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/cache-inmemory@npm:2.5.1" +"@medusajs/cache-inmemory@npm:^2.5.0, @medusajs/cache-inmemory@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/cache-inmemory@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/42f89dc5c4a9abfd536ca67945757c312d0cb2f1134fc31bc638be29c64658f8528a2711c9f3f01851271ae9f87cabc24dae96ef5bff98f5727015566bc7a12d + checksum: 10c0/53c00859bb165f9de608f1e5accad8f4e4a3e467674f54509a74233cce3d81833be7661beecbc658d11f8e8668e30923bd413ea1aece1e09983f15619788d245 languageName: node linkType: hard @@ -2304,15 +2304,15 @@ __metadata: languageName: node linkType: hard -"@medusajs/cache-redis@npm:^2.5.0, @medusajs/cache-redis@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/cache-redis@npm:2.5.1" +"@medusajs/cache-redis@npm:^2.5.0, @medusajs/cache-redis@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/cache-redis@npm:2.6.0" dependencies: ioredis: "npm:^5.4.1" peerDependencies: "@medusajs/framework": ^2.4.0 awilix: ^8.0.1 - checksum: 10c0/227040c4160fefad87a2646e20d2a83943e034fbaa50b809708e907e7747b77b67d5e3b8b6810c3a69026fa4e283fd091e1c7ab741e7729f61ca46bc4e25a5fb + checksum: 10c0/4b6b629ae598b347a4b1df07c0e7b1fa5a3ff7df6df561f05ad69310293799861f5764def4d3715b6ecb1ebb1d190a042f722d5c90942ca2698eb85653f8bd78 languageName: node linkType: hard @@ -2328,16 +2328,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/cart@npm:^2.5.0, @medusajs/cart@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/cart@npm:2.5.1" +"@medusajs/cart@npm:^2.5.0, @medusajs/cart@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/cart@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/2c4ee76defc157cbba73a68ec17be13f013595b91237545db4ffb2e1075bc5fab4ed51c5512ae76ccb0e1f4928b2d9073d44db20a9c1a43a1e9cb4955dc0aa7a + checksum: 10c0/30282f53513e2c6050b5a49b22d3429002ed77a51e046be925efba2a049ee5d57d02f75317617ef6540fbdf54dacb9dfbc9c13f6c815bbec053bdf3282d74b63 languageName: node linkType: hard @@ -2436,12 +2436,12 @@ __metadata: languageName: node linkType: hard -"@medusajs/cli@npm:2.5.1": - version: 2.5.1 - resolution: "@medusajs/cli@npm:2.5.1" +"@medusajs/cli@npm:2.6.0": + version: 2.6.0 + resolution: "@medusajs/cli@npm:2.6.0" dependencies: - "@medusajs/telemetry": "npm:^2.5.1" - "@medusajs/utils": "npm:2.5.1" + "@medusajs/telemetry": "npm:^2.6.0" + "@medusajs/utils": "npm:2.6.0" "@types/express": "npm:^4.17.17" chalk: "npm:^4.0.0" configstore: "npm:5.0.1" @@ -2473,19 +2473,19 @@ __metadata: pg: ^8.13.0 bin: medusa: cli.js - checksum: 10c0/17ade83834331c5757aaad365aa6af3265e5b0ac340e308bc89e3546d26b3dae8463ab63ea4e62f89845e0cb7ac6be0d998408060b8cdd99f9fd357c8ca5a7ac + checksum: 10c0/44c50f167a7907ed3d50a24f4a4f273725b2acd75c341e35a8f143642d93036b313a2edc3a903427340f2a442cfd6b77dc85c31890ae0c54f05a4639b179b9b5 languageName: node linkType: hard -"@medusajs/core-flows@npm:^2.5.0, @medusajs/core-flows@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/core-flows@npm:2.5.1" +"@medusajs/core-flows@npm:^2.5.0, @medusajs/core-flows@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/core-flows@npm:2.6.0" dependencies: json-2-csv: "npm:^5.5.4" peerDependencies: "@medusajs/framework": ^2.4.0 awilix: ^8.0.1 - checksum: 10c0/03246c1aaabee8a9d632a98f64ce78964b15511d1b7e23649dd0cc37c661a1e0cae4935aba334608f32f51a60b2552c71c581537ca4ceeacf7b739138c794ba0 + checksum: 10c0/702b2960a259e02dc585a37fc5ea5dc6259805befa67e9d5d8204ec84b56e817fdd019ea82b20de8f1cf8c455c49bd223d3b896d4e0b380f3723ac170c0e53d3 languageName: node linkType: hard @@ -2501,16 +2501,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/currency@npm:^2.5.0, @medusajs/currency@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/currency@npm:2.5.1" +"@medusajs/currency@npm:^2.5.0, @medusajs/currency@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/currency@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/08a3857fc424b07fc0d98501acac84b54b79726b069fef6ba5d08fd2f85307f5a3502e2d845ae3c0ddf6077347e8f40b2587d5f6aab4586b63cb929797566e00 + checksum: 10c0/0d800dea048e0a8bb00e72bce368a0083b18a041ae5a2b4f5640673832fe39423ecf771ecbbf9f1c4464ce0d5a7b31974eb27e92173d5fe9b21008a2ceedf510 languageName: node linkType: hard @@ -2527,16 +2527,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/customer@npm:^2.5.0, @medusajs/customer@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/customer@npm:2.5.1" +"@medusajs/customer@npm:^2.5.0, @medusajs/customer@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/customer@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/a067a11c556dfe82d8f0487f6711964469fd3362b39e57d8fea042ffd5bad7d628acaf2299b010923d3def1d72dde6d48c541b38a09b264bc20e7d39ca7d019f + checksum: 10c0/c71aa4c4472158a92af3f0eefa8cc7a4c78625b44f82be262ee0f6ca114cdc495d92eb8cdf4c17013fec701acb468cd192b5df761e8138dc30e8e7e060aeecdf languageName: node linkType: hard @@ -2594,18 +2594,18 @@ __metadata: languageName: node linkType: hard -"@medusajs/dashboard@npm:2.5.1": - version: 2.5.1 - resolution: "@medusajs/dashboard@npm:2.5.1" +"@medusajs/dashboard@npm:2.6.0": + version: 2.6.0 + resolution: "@medusajs/dashboard@npm:2.6.0" dependencies: "@ariakit/react": "npm:^0.4.15" "@dnd-kit/core": "npm:^6.1.0" "@dnd-kit/sortable": "npm:^8.0.0" "@hookform/error-message": "npm:^2.0.1" "@hookform/resolvers": "npm:3.4.2" - "@medusajs/admin-shared": "npm:^2.5.1" - "@medusajs/icons": "npm:^2.5.1" - "@medusajs/js-sdk": "npm:^2.5.1" + "@medusajs/admin-shared": "npm:^2.6.0" + "@medusajs/icons": "npm:^2.6.0" + "@medusajs/js-sdk": "npm:^2.6.0" "@medusajs/ui": "npm:~4.0.6" "@tanstack/react-query": "npm:5.64.2" "@tanstack/react-table": "npm:8.20.5" @@ -2631,18 +2631,18 @@ __metadata: react-jwt: "npm:^1.2.0" react-router-dom: "npm:6.20.1" zod: "npm:3.22.4" - checksum: 10c0/fecc60f991f2d973af5e7c76488c68083035a9a5100cee487de0c80c38de108c54bc47a58ce52511bda15e43f77a388c33ca4da5f914b981a17d7d5dd0d07624 + checksum: 10c0/4a4deac59d8a8115f7336dc25a20e44cbb7e6c648945827e8d6b2adfac4144cdffd1b19c542d767820005a7a3e1dfe1b137c86fd33dbb7f03c6fd72959caec7d languageName: node linkType: hard -"@medusajs/event-bus-local@npm:^2.5.0, @medusajs/event-bus-local@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/event-bus-local@npm:2.5.1" +"@medusajs/event-bus-local@npm:^2.5.0, @medusajs/event-bus-local@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/event-bus-local@npm:2.6.0" dependencies: ulid: "npm:^2.3.0" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/372aa3368a915e89b2c5afc5e377fde6e1c3c50db616a4348b3780e5f84bba464acdac29a6fb24736f35f7cff1042eb872dee45136899bba6c22e9a9927bfd4d + checksum: 10c0/66c0e5937c1ee48ebd8e2deccfd58942e5242e2afd301c1ad7c92daefcefacf2aabe51261a711293ef199a3c2d6c88d64d96ee6741151b9823b2b50e49a8b0d4 languageName: node linkType: hard @@ -2657,16 +2657,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/event-bus-redis@npm:^2.5.0, @medusajs/event-bus-redis@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/event-bus-redis@npm:2.5.1" +"@medusajs/event-bus-redis@npm:^2.5.0, @medusajs/event-bus-redis@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/event-bus-redis@npm:2.6.0" dependencies: bullmq: "npm:5.13.0" ioredis: "npm:^5.4.1" peerDependencies: "@medusajs/framework": ^2.4.0 awilix: ^8.0.1 - checksum: 10c0/ddaf2972d9a21551d13a9290e94e808c315872c76d1ac523d9e4e9a9544aa0ff8158d1ead04c0e1fde9eb0d69044b701e20ddd4f089b1a7f1aad7d63aa734617 + checksum: 10c0/d1cb9d6e6d69a9506f1a55dee15e96b4dec10dd22561fdaf19f7e9fa1866cba2578d37d3cf38e1ed88f750bb05118c1cd88b644aa6f3350e0ab0cf6191575b09 languageName: node linkType: hard @@ -2683,12 +2683,12 @@ __metadata: languageName: node linkType: hard -"@medusajs/file-local@npm:^2.5.0, @medusajs/file-local@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/file-local@npm:2.5.1" +"@medusajs/file-local@npm:^2.5.0, @medusajs/file-local@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/file-local@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/6b3025a4e99780259fc788d92722cb1f90a64e1598b5db61c99ef8e3b3d910e199f9a50dd9d76bde38bfa8972269ecce5cf421981bf29f4f1c47e0b849684304 + checksum: 10c0/70ba24658d177d33e6f2ac0e6f5f62b063ffbce76499cf39b11ca493adcfa7ca4cdbbb8999b43356a8edf153bf27f855f63ee5831643b9a51a87b46964f7de1a languageName: node linkType: hard @@ -2701,16 +2701,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/file-s3@npm:^2.5.0, @medusajs/file-s3@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/file-s3@npm:2.5.1" +"@medusajs/file-s3@npm:^2.5.0, @medusajs/file-s3@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/file-s3@npm:2.6.0" dependencies: "@aws-sdk/client-s3": "npm:^3.556.0" "@aws-sdk/s3-request-presigner": "npm:^3.556.0" ulid: "npm:^2.3.0" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/d9118040767a75904c3c74cb91d7d82bf11e4e77e7c804e466269cb10366a3b02c90ad561204659b3d17a13dc8a520920d3c281bbbdaa68306a70c43b3f47c8f + checksum: 10c0/762e2cd1b2753f8b6e2053f34332840885ee899ae08a8f1e015a15d93b2313a91a1521871fbd14e36500a95dead291525d93c17d5637f6e2185c10a32d056d5b languageName: node linkType: hard @@ -2727,13 +2727,13 @@ __metadata: languageName: node linkType: hard -"@medusajs/file@npm:^2.5.0, @medusajs/file@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/file@npm:2.5.1" +"@medusajs/file@npm:^2.5.0, @medusajs/file@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/file@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 awilix: ^8.0.1 - checksum: 10c0/e2879d12201a055f47d6b334ab947de8b02ac01ab3fbb6bad837d4d8e4f810b61d844bf89dd9665dd52e9ca1c7c98d6c45316e545438ef913ec56f3fd3b7ba5a + checksum: 10c0/98c7c3e78c0378a2e5e2dfe3d7e799e3095dc21c76c3eaf363bd7e8c6717d53d63359656b9cdc365986a97494e2eff6003cc9cb78cef95ad6a993fe64a5115d2 languageName: node linkType: hard @@ -2847,17 +2847,17 @@ __metadata: languageName: node linkType: hard -"@medusajs/framework@npm:2.5.1": - version: 2.5.1 - resolution: "@medusajs/framework@npm:2.5.1" +"@medusajs/framework@npm:2.6.0": + version: 2.6.0 + resolution: "@medusajs/framework@npm:2.6.0" dependencies: "@jercle/yargonaut": "npm:^1.1.5" - "@medusajs/modules-sdk": "npm:^2.5.1" - "@medusajs/orchestration": "npm:^2.5.1" - "@medusajs/telemetry": "npm:^2.5.1" - "@medusajs/types": "npm:^2.5.1" - "@medusajs/utils": "npm:^2.5.1" - "@medusajs/workflows-sdk": "npm:^2.5.1" + "@medusajs/modules-sdk": "npm:^2.6.0" + "@medusajs/orchestration": "npm:^2.6.0" + "@medusajs/telemetry": "npm:^2.6.0" + "@medusajs/types": "npm:^2.6.0" + "@medusajs/utils": "npm:^2.6.0" + "@medusajs/workflows-sdk": "npm:^2.6.0" "@opentelemetry/api": "npm:^1.9.0" "@types/express": "npm:^4.17.17" chokidar: "npm:^3.4.2" @@ -2871,6 +2871,7 @@ __metadata: jsonwebtoken: "npm:^9.0.2" lodash: "npm:4.17.21" morgan: "npm:^1.9.1" + path-to-regexp: "npm:^0.1.10" tsconfig-paths: "npm:^4.2.0" zod: "npm:3.22.4" peerDependencies: @@ -2893,16 +2894,16 @@ __metadata: optional: true bin: medusa-mikro-orm: dist/mikro-orm-cli/bin.js - checksum: 10c0/09f991d12427c37ad8b5c79b4533817c44528ef362f9a3bbf330a1b54dc1eb347de3f786593476139e7581ccec8d65da4a2623821eca90e506a02fe8b8556d56 + checksum: 10c0/009faa3c8c864e0a5b5b9456487ecf7f20020acefa2e7401bad065e7492c07faa16909e9c557c78bdb17ddb2a87ef67a67b6c7b5aa0ee8062b1b644d3b23e3b9 languageName: node linkType: hard -"@medusajs/fulfillment-manual@npm:^2.5.0, @medusajs/fulfillment-manual@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/fulfillment-manual@npm:2.5.1" +"@medusajs/fulfillment-manual@npm:^2.5.0, @medusajs/fulfillment-manual@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/fulfillment-manual@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/9bb243ab3eb27ac85b553f2b88b99c65d1cafb3efde597fbd87fc36f3ae69ad73e5a98e9ef1d868b8f9c96c2ce9647f58ccdd2785dbce80d8362a67ac412a9d0 + checksum: 10c0/d81df45085e0d7f6e0f3b4bdcdde18038c82e18807484cbfa3b27c36e766a50690b5f0aabe0b9bcfe98357904d531097e13bcb46ce658b53c96ef2cffbf54ea4 languageName: node linkType: hard @@ -2915,16 +2916,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/fulfillment@npm:^2.5.0, @medusajs/fulfillment@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/fulfillment@npm:2.5.1" +"@medusajs/fulfillment@npm:^2.5.0, @medusajs/fulfillment@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/fulfillment@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/c5efcdba9c7532409c6fae8285add8cdd10416918d9e5d716741b9c679cee9eaf2c7f8f338fdee55e71b1d5ab772505aa4fc70ab6e759351c050d890f39e15eb + checksum: 10c0/9374b2edfea393500075651bcad67846396b1e4814797b94885672d9ce3b72530ae56aefbaf79fc61c6c112643679c920ae5baa1113df2f0c396f874c2ced731 languageName: node linkType: hard @@ -2959,7 +2960,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/icons@npm:2.5.1, @medusajs/icons@npm:^2.5.1": +"@medusajs/icons@npm:2.6.0, @medusajs/icons@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/icons@npm:2.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + checksum: 10c0/cb8628018398aba010bb7b1f653cb7dc91d9bd59a40f1e7ee4cdc7732559e75062db790fb609fd3f748a9b80ccc0f421267a414ed9f5a7a4e079ef643e65333e + languageName: node + linkType: hard + +"@medusajs/icons@npm:^2.5.1": version: 2.5.1 resolution: "@medusajs/icons@npm:2.5.1" peerDependencies: @@ -2968,9 +2978,9 @@ __metadata: languageName: node linkType: hard -"@medusajs/index@npm:^2.5.0, @medusajs/index@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/index@npm:2.5.1" +"@medusajs/index@npm:^2.5.0, @medusajs/index@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/index@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 @@ -2978,7 +2988,7 @@ __metadata: "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/39e8c466fb487b0a113ef0e2865bd541f45577cee863d383e8637b3a1442dc95893fe865e917b52c18b45102d5bb74321891ff5f6053b3de99714f9206fbc01f + checksum: 10c0/0988f02b8666bc04c093d3fee78c4430ccfd5eeb73955735b55909042d7d71f6a012547ace9ade4b66ee3140a31142464a3159cab3b3c90512f8a15479fcec6b languageName: node linkType: hard @@ -2996,16 +3006,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/inventory@npm:^2.5.0, @medusajs/inventory@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/inventory@npm:2.5.1" +"@medusajs/inventory@npm:^2.5.0, @medusajs/inventory@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/inventory@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/7639fc23d1ffa766207a6ce3e098ad9e5df57b15223ff24e1a02b9e3f26078404e2db8a6eec4303ad6d24771a4d55c96d0b6d53e80ea975eec9a68cb1342975c + checksum: 10c0/c821d835f60e1c73f06c6e77d97e45ef53d2a6a8cd5e71cec7e5e0be94ec84eacf5469640389885c66dd34ef03982db057353994a02e4bf0969d8a8c65607622 languageName: node linkType: hard @@ -3033,38 +3043,38 @@ __metadata: languageName: node linkType: hard -"@medusajs/js-sdk@npm:^2.5.0": - version: 2.5.0 - resolution: "@medusajs/js-sdk@npm:2.5.0" +"@medusajs/js-sdk@npm:2.6.0, @medusajs/js-sdk@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/js-sdk@npm:2.6.0" dependencies: - "@medusajs/types": "npm:^2.5.0" + "@medusajs/types": "npm:^2.6.0" fetch-event-stream: "npm:^0.1.5" qs: "npm:^6.12.1" - checksum: 10c0/d5c4a29590e1727882d4eb329292b64f8b4315ddb37dcea7bf9fb236e6ace20d5116c0fb6c64a33ac4db03b9f7c89a2e180880cd00dd10942580b659653c44ab + checksum: 10c0/7f7314e0674badedcf7f16cbfb873abd9ebc41bd720c2ea8b7cde1e0c1a37e5c9b8d0229c63691a44fe1f6c555f8cb6cdb97e81f51191e64a6df448d390c860f languageName: node linkType: hard -"@medusajs/js-sdk@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/js-sdk@npm:2.5.1" +"@medusajs/js-sdk@npm:^2.5.0": + version: 2.5.0 + resolution: "@medusajs/js-sdk@npm:2.5.0" dependencies: - "@medusajs/types": "npm:^2.5.1" + "@medusajs/types": "npm:^2.5.0" fetch-event-stream: "npm:^0.1.5" qs: "npm:^6.12.1" - checksum: 10c0/dd78040f3a07fdb6cb4e4092630243f6fc7dc692dd230b318162f39882511081c2625e1b93ac79c37343410c6acc367afce7eb8494b7dada1de3f146dc37fd34 + checksum: 10c0/d5c4a29590e1727882d4eb329292b64f8b4315ddb37dcea7bf9fb236e6ace20d5116c0fb6c64a33ac4db03b9f7c89a2e180880cd00dd10942580b659653c44ab languageName: node linkType: hard -"@medusajs/link-modules@npm:^2.5.0, @medusajs/link-modules@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/link-modules@npm:2.5.1" +"@medusajs/link-modules@npm:^2.5.0, @medusajs/link-modules@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/link-modules@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/927bf05cab78aa8babf13ab14446fc9a97b92707dce2fb54aed21d95afbc9dc849a32af26aaa30b66e10bae963e3fe20df5c285c33f5670c66af56f84793f227 + checksum: 10c0/c0acfafd2213bf97b77cf02305c76f47123c4528ff56591aec001f4aa4ca3b6bf80f4f6b94793124d3f5c43e7598b325a376456572b4483db7bdaaf917ecf52a languageName: node linkType: hard @@ -3081,12 +3091,12 @@ __metadata: languageName: node linkType: hard -"@medusajs/locking-postgres@npm:^2.5.0, @medusajs/locking-postgres@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/locking-postgres@npm:2.5.1" +"@medusajs/locking-postgres@npm:^2.5.0, @medusajs/locking-postgres@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/locking-postgres@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/63915b123c44b27b61279f716b34442a5b817b6c16ea6204d7916626365f0ee0d682117daf873e5b267268fd29a032437005bf68f508595f855c3cb26cf9d842 + checksum: 10c0/eaea765eed4997b57aed900865d863a031a40b79929eb60506f0e7440460b63e2a4e051325f66e8c3531be5ae1b0a63d249bcac980cdeb4fae6830c61a033d25 languageName: node linkType: hard @@ -3099,14 +3109,14 @@ __metadata: languageName: node linkType: hard -"@medusajs/locking-redis@npm:^2.5.0, @medusajs/locking-redis@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/locking-redis@npm:2.5.1" +"@medusajs/locking-redis@npm:^2.5.0, @medusajs/locking-redis@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/locking-redis@npm:2.6.0" dependencies: ioredis: "npm:^5.4.1" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/fb6261fc27ee9e15dea4ba56c222c7a0b5e574c18228ec49656c783ed9c60f37237ac8c09940c090910096326fe5706c83a35865a0733f8238b3b1b43861d2b1 + checksum: 10c0/fcefc4b1fdfac3ab38bce90abaf8a715b4eeb5a44abc8712eded8bad908bd54f799f773f28a53708a268d9be003522edce49778fe4f7e53c16c49c34c16f0337 languageName: node linkType: hard @@ -3121,16 +3131,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/locking@npm:^2.5.0, @medusajs/locking@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/locking@npm:2.5.1" +"@medusajs/locking@npm:^2.5.0, @medusajs/locking@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/locking@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/d60879a872cb2e6ae456982e3478d4f3e724f6112e6f09e1b403c73a7888d21977a653fbea833441cb9bfc174e29113edf4eb89bbcb494add0fb1d079a2eac6a + checksum: 10c0/6d6043bf36f40f33e340af709b7ff643abaad592e196c8259059cfa862273be6453c6c37bdc153377bdee5f6e4d789dd7e6813678cecf7712a5bc9b98541b2c2 languageName: node linkType: hard @@ -3314,55 +3324,55 @@ __metadata: languageName: node linkType: hard -"@medusajs/medusa@npm:2.5.1": - version: 2.5.1 - resolution: "@medusajs/medusa@npm:2.5.1" +"@medusajs/medusa@npm:2.6.0": + version: 2.6.0 + resolution: "@medusajs/medusa@npm:2.6.0" dependencies: "@inquirer/checkbox": "npm:^2.3.11" "@inquirer/input": "npm:^2.2.9" - "@medusajs/admin-bundler": "npm:^2.5.1" - "@medusajs/api-key": "npm:^2.5.1" - "@medusajs/auth": "npm:^2.5.1" - "@medusajs/auth-emailpass": "npm:^2.5.1" - "@medusajs/auth-github": "npm:^2.5.1" - "@medusajs/auth-google": "npm:^2.5.1" - "@medusajs/cache-inmemory": "npm:^2.5.1" - "@medusajs/cache-redis": "npm:^2.5.1" - "@medusajs/cart": "npm:^2.5.1" - "@medusajs/core-flows": "npm:^2.5.1" - "@medusajs/currency": "npm:^2.5.1" - "@medusajs/customer": "npm:^2.5.1" - "@medusajs/event-bus-local": "npm:^2.5.1" - "@medusajs/event-bus-redis": "npm:^2.5.1" - "@medusajs/file": "npm:^2.5.1" - "@medusajs/file-local": "npm:^2.5.1" - "@medusajs/file-s3": "npm:^2.5.1" - "@medusajs/fulfillment": "npm:^2.5.1" - "@medusajs/fulfillment-manual": "npm:^2.5.1" - "@medusajs/index": "npm:^2.5.1" - "@medusajs/inventory": "npm:^2.5.1" - "@medusajs/link-modules": "npm:^2.5.1" - "@medusajs/locking": "npm:^2.5.1" - "@medusajs/locking-postgres": "npm:^2.5.1" - "@medusajs/locking-redis": "npm:^2.5.1" - "@medusajs/notification": "npm:^2.5.1" - "@medusajs/notification-local": "npm:^2.5.1" - "@medusajs/notification-sendgrid": "npm:^2.5.1" - "@medusajs/order": "npm:^2.5.1" - "@medusajs/payment": "npm:^2.5.1" - "@medusajs/payment-stripe": "npm:^2.5.1" - "@medusajs/pricing": "npm:^2.5.1" - "@medusajs/product": "npm:^2.5.1" - "@medusajs/promotion": "npm:^2.5.1" - "@medusajs/region": "npm:^2.5.1" - "@medusajs/sales-channel": "npm:^2.5.1" - "@medusajs/stock-location": "npm:^2.5.1" - "@medusajs/store": "npm:^2.5.1" - "@medusajs/tax": "npm:^2.5.1" - "@medusajs/telemetry": "npm:^2.5.1" - "@medusajs/user": "npm:^2.5.1" - "@medusajs/workflow-engine-inmemory": "npm:^2.5.1" - "@medusajs/workflow-engine-redis": "npm:^2.5.1" + "@medusajs/admin-bundler": "npm:^2.6.0" + "@medusajs/api-key": "npm:^2.6.0" + "@medusajs/auth": "npm:^2.6.0" + "@medusajs/auth-emailpass": "npm:^2.6.0" + "@medusajs/auth-github": "npm:^2.6.0" + "@medusajs/auth-google": "npm:^2.6.0" + "@medusajs/cache-inmemory": "npm:^2.6.0" + "@medusajs/cache-redis": "npm:^2.6.0" + "@medusajs/cart": "npm:^2.6.0" + "@medusajs/core-flows": "npm:^2.6.0" + "@medusajs/currency": "npm:^2.6.0" + "@medusajs/customer": "npm:^2.6.0" + "@medusajs/event-bus-local": "npm:^2.6.0" + "@medusajs/event-bus-redis": "npm:^2.6.0" + "@medusajs/file": "npm:^2.6.0" + "@medusajs/file-local": "npm:^2.6.0" + "@medusajs/file-s3": "npm:^2.6.0" + "@medusajs/fulfillment": "npm:^2.6.0" + "@medusajs/fulfillment-manual": "npm:^2.6.0" + "@medusajs/index": "npm:^2.6.0" + "@medusajs/inventory": "npm:^2.6.0" + "@medusajs/link-modules": "npm:^2.6.0" + "@medusajs/locking": "npm:^2.6.0" + "@medusajs/locking-postgres": "npm:^2.6.0" + "@medusajs/locking-redis": "npm:^2.6.0" + "@medusajs/notification": "npm:^2.6.0" + "@medusajs/notification-local": "npm:^2.6.0" + "@medusajs/notification-sendgrid": "npm:^2.6.0" + "@medusajs/order": "npm:^2.6.0" + "@medusajs/payment": "npm:^2.6.0" + "@medusajs/payment-stripe": "npm:^2.6.0" + "@medusajs/pricing": "npm:^2.6.0" + "@medusajs/product": "npm:^2.6.0" + "@medusajs/promotion": "npm:^2.6.0" + "@medusajs/region": "npm:^2.6.0" + "@medusajs/sales-channel": "npm:^2.6.0" + "@medusajs/stock-location": "npm:^2.6.0" + "@medusajs/store": "npm:^2.6.0" + "@medusajs/tax": "npm:^2.6.0" + "@medusajs/telemetry": "npm:^2.6.0" + "@medusajs/user": "npm:^2.6.0" + "@medusajs/workflow-engine-inmemory": "npm:^2.6.0" + "@medusajs/workflow-engine-redis": "npm:^2.6.0" boxen: "npm:^5.0.1" chalk: "npm:^4.0.0" chokidar: "npm:^3.4.2" @@ -3395,36 +3405,17 @@ __metadata: optional: true yalc: optional: true - checksum: 10c0/395145f4f8449d5b6a9f6c46b05d1f7930503c838f9b6ff14db9e774c5e7d123c98755ee31d7e86cb88c4b38d914df35c2cbdf7cc63ac7c3a98dc4d67793b516 - languageName: node - linkType: hard - -"@medusajs/modules-sdk@npm:^2.5.0": - version: 2.5.0 - resolution: "@medusajs/modules-sdk@npm:2.5.0" - dependencies: - "@medusajs/orchestration": "npm:^2.5.0" - "@medusajs/types": "npm:^2.5.0" - "@medusajs/utils": "npm:^2.5.0" - peerDependencies: - "@mikro-orm/core": 6.4.3 - "@mikro-orm/knex": 6.4.3 - "@mikro-orm/migrations": 6.4.3 - "@mikro-orm/postgresql": 6.4.3 - awilix: ^8.0.1 - express: ^4.21.0 - pg: ^8.13.0 - checksum: 10c0/34e20d3143f4b7e6e69355d121fa7e68d74e39e4117108efadb7b4400c1ce62963196270a2a0779b26f90a780f156e6aa9f8f1603f0c823d6f705b2806a26918 + checksum: 10c0/7b95ba26ced705b62cd0f14164594f64db78d024516b8ba53a70b7d356853402e1ed739e1fba38d610b61f5dfa96d251af3ea60f03ee0aadbc8a2ff313958335 languageName: node linkType: hard -"@medusajs/modules-sdk@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/modules-sdk@npm:2.5.1" +"@medusajs/modules-sdk@npm:^2.5.0, @medusajs/modules-sdk@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/modules-sdk@npm:2.6.0" dependencies: - "@medusajs/orchestration": "npm:^2.5.1" - "@medusajs/types": "npm:^2.5.1" - "@medusajs/utils": "npm:^2.5.1" + "@medusajs/orchestration": "npm:^2.6.0" + "@medusajs/types": "npm:^2.6.0" + "@medusajs/utils": "npm:^2.6.0" peerDependencies: "@mikro-orm/core": 6.4.3 "@mikro-orm/knex": 6.4.3 @@ -3433,7 +3424,7 @@ __metadata: awilix: ^8.0.1 express: ^4.21.0 pg: ^8.13.0 - checksum: 10c0/a0b14816b6bced99388a4529d1c6bf4a2fd60072828b777d9cff54418b4ea547accddaca04a79aed2bc02c1a1e5bca8f73ccd6720cff4c537d7dfa4ecadef996 + checksum: 10c0/fb7211101ccfbd8e60db0e66a345bff7e11836efd173a164f3310e4ab2e0363c6f7b2200da8a52b2fedefd3ab1bc8ea896e9dae169732df6123343b40860308c languageName: node linkType: hard @@ -3456,12 +3447,12 @@ __metadata: languageName: node linkType: hard -"@medusajs/notification-local@npm:^2.5.0, @medusajs/notification-local@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/notification-local@npm:2.5.1" +"@medusajs/notification-local@npm:^2.5.0, @medusajs/notification-local@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/notification-local@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/a67163221e89f3c119e3681380f4adb63d2df4730bd071e509046811eee7e5a3b0fd93cb8cf96801d76c6bf3ba786be31ec7aeb7214d3922cbba8eacd55d2f0d + checksum: 10c0/870aa3c9b99368f2b0b28a1ccbb040990499aa82a473d9adc2227bf56f71d73907d1ef401bc82daf21724d3c64b95fcd1c8c798c3c437756a9bda2550e3f4db8 languageName: node linkType: hard @@ -3474,14 +3465,14 @@ __metadata: languageName: node linkType: hard -"@medusajs/notification-sendgrid@npm:^2.5.0, @medusajs/notification-sendgrid@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/notification-sendgrid@npm:2.5.1" +"@medusajs/notification-sendgrid@npm:^2.5.0, @medusajs/notification-sendgrid@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/notification-sendgrid@npm:2.6.0" dependencies: "@sendgrid/mail": "npm:^8.1.3" peerDependencies: "@medusajs/framework": ^2.4.0 - checksum: 10c0/1cf37bdd8f6982a0095012f6fac901e5028c67097e122ae4186943d7fd4a03b39ed02cee5f73d9e36a1a1daa3f2dfc755f0a69566954ce8d3c5b7dc9abb220a0 + checksum: 10c0/4ebf3b20f75642b18f3ea79e377b2840708d3962a890e1fadee6c0149bb9d89d1303f167c9f31ee7ff96e17f80f2543f43bb6194dd61b1e013d0f916d205ef1e languageName: node linkType: hard @@ -3496,16 +3487,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/notification@npm:^2.5.0, @medusajs/notification@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/notification@npm:2.5.1" +"@medusajs/notification@npm:^2.5.0, @medusajs/notification@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/notification@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/a23f0d674929fb2bb71a8f634557adc8e1380d9e726707183010bc478ea8c4d52d5ed09df91fa2a763c0bec26a132c96bb92a52acb7a52e10f3321bef16d48c1 + checksum: 10c0/b0680928f18a3f793eb97b1a7b132bd89c6754b9279df349c404db1b4ee80be5f3a207a94bc65f9c82865d27aa0f458645810ec1a61c23df19be7c0761e2004b languageName: node linkType: hard @@ -3522,30 +3513,12 @@ __metadata: languageName: node linkType: hard -"@medusajs/orchestration@npm:^2.5.0": - version: 2.5.0 - resolution: "@medusajs/orchestration@npm:2.5.0" - dependencies: - "@medusajs/types": "npm:^2.5.0" - "@medusajs/utils": "npm:^2.5.0" - peerDependencies: - "@mikro-orm/core": 6.4.3 - "@mikro-orm/knex": 6.4.3 - "@mikro-orm/migrations": 6.4.3 - "@mikro-orm/postgresql": 6.4.3 - awilix: ^8.0.1 - express: ^4.21.0 - pg: ^8.13.0 - checksum: 10c0/e84453544ec170eddf7dcd1e0aadbac83127296b694225e1ea3b9111dd2ae95542adc30c881275bc896ac94a8f48eaaed8f369db3453d33ce108977b88191275 - languageName: node - linkType: hard - -"@medusajs/orchestration@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/orchestration@npm:2.5.1" +"@medusajs/orchestration@npm:^2.5.0, @medusajs/orchestration@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/orchestration@npm:2.6.0" dependencies: - "@medusajs/types": "npm:^2.5.1" - "@medusajs/utils": "npm:^2.5.1" + "@medusajs/types": "npm:^2.6.0" + "@medusajs/utils": "npm:^2.6.0" peerDependencies: "@mikro-orm/core": 6.4.3 "@mikro-orm/knex": 6.4.3 @@ -3554,7 +3527,7 @@ __metadata: awilix: ^8.0.1 express: ^4.21.0 pg: ^8.13.0 - checksum: 10c0/77953f8b6bb1bc904722b8bd177e6e36629bceccd28e07f3c06510d0f2c357d73393b515d0de7e9a4f8a962d9c5291fc0e354e856ec1234771e269db1e661592 + checksum: 10c0/e0bbfea2ee9cde91c9c7eb9143d263b4048b93c7cd99d06071bcabbf7ed53a2c0bf7528e64ef23e68b1dea1f6849ee823c76608166110d8517eb5e174f3c07b7 languageName: node linkType: hard @@ -3576,16 +3549,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/order@npm:^2.5.0, @medusajs/order@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/order@npm:2.5.1" +"@medusajs/order@npm:^2.5.0, @medusajs/order@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/order@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/87e0cc1dc471e8099c210c80dc8cc53ee4f4478f59ef45267189901ff9fcceee8bbc21c09871cfde3aafb7a3d21544b9598b11cc937a793b36086949325490f6 + checksum: 10c0/efd70574256fe2789853c1f05d66e515cbe4fb2e2f569dfd0b35802fecf4e3dfc1be62069b4e4361af428a5f918b7bd157e28892a4cc04d26f05ae6e8e351449 languageName: node linkType: hard @@ -3602,15 +3575,15 @@ __metadata: languageName: node linkType: hard -"@medusajs/payment-stripe@npm:^2.5.0, @medusajs/payment-stripe@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/payment-stripe@npm:2.5.1" +"@medusajs/payment-stripe@npm:^2.5.0, @medusajs/payment-stripe@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/payment-stripe@npm:2.6.0" dependencies: stripe: "npm:^15.5.0" peerDependencies: "@medusajs/framework": ^2.4.0 awilix: ^8.0.1 - checksum: 10c0/d0c39b59cc4d753d77cbaa878d6a0934eb9c9a75c6976b4b18445d9e8b3f246a994631bd0ae185e598e7c6ed7c1d3603e8b94956a87cc43dc74f128c0f32711d + checksum: 10c0/dce62df1ecdaa796dfe1d28b52fb5939a06ea2a4109bce70d487e5f04e27e96b7a0f8c843dd381fed560a2bc5cf8236ca710c2c471cbe8a7df1030558fbbc5ff languageName: node linkType: hard @@ -3626,16 +3599,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/payment@npm:^2.5.0, @medusajs/payment@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/payment@npm:2.5.1" +"@medusajs/payment@npm:^2.5.0, @medusajs/payment@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/payment@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/4c7144e474ec586550c932554940dda236c83d722ac9c483b6c806f5917f9d57566269f84fab1c87f99c0d25dca6837406e56f3ec820ff19c8c9e9f168b8a929 + checksum: 10c0/79556d60796c3f7329fc23cbc2c329daa6a0e8ba3bf3674e587ef9929b8bcb616a7886b731bb42e62c5f0992cf80985f5bacde4975b70550cd4e021f7fded292 languageName: node linkType: hard @@ -3652,16 +3625,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/pricing@npm:^2.5.0, @medusajs/pricing@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/pricing@npm:2.5.1" +"@medusajs/pricing@npm:^2.5.0, @medusajs/pricing@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/pricing@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/826427039c699d41d37d906586dbb5cee15d97e087ece1c3da7c387b358068bc44b52d5e28539e5d0f009723795c00ab0fe7a9213b9acecf0d172f98448637a4 + checksum: 10c0/0ceabcea4b96c1da33c151fbefde9fb2e9eae5532bd69a7f8cfce5a01df9e2432b77f5825e5038200552e022c0e3cb9298d00af7c79b045e55e565966826e240 languageName: node linkType: hard @@ -3678,16 +3651,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/product@npm:^2.5.0, @medusajs/product@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/product@npm:2.5.1" +"@medusajs/product@npm:^2.5.0, @medusajs/product@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/product@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/403c1eb7b0e490aa1bd844d81f85160be92961a78efb5cd3d729eb03e543c2b2152f92ab95e6287548ed63d1ddedb2aec8a2ef49ab18f8da05676c7032e7a64e + checksum: 10c0/bd55f37fde198f941750023b7fbd161cbf9983d8bf80dc5c61066446189fe7ea7a44fa30b503212b6f6b567b38045e2239b22486c36171d1cbd27945d289475c languageName: node linkType: hard @@ -3704,16 +3677,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/promotion@npm:^2.5.0, @medusajs/promotion@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/promotion@npm:2.5.1" +"@medusajs/promotion@npm:^2.5.0, @medusajs/promotion@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/promotion@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/4f003f73c4ea79a62316268b600146b7782f0b6307f11b5220d83c40d05b66c1d1be66fdcd46336256ef24f2bd84df7c5babcb3e7f27675c7172d50e8ff93161 + checksum: 10c0/faf8b3578391816300cabbeebec353aa304e72e65f1eaf82043c9dbab35a83371c43cb5e9728e000f1089147ed05860f2c3840daf9420e440406972699bc4258 languageName: node linkType: hard @@ -3730,16 +3703,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/region@npm:^2.5.0, @medusajs/region@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/region@npm:2.5.1" +"@medusajs/region@npm:^2.5.0, @medusajs/region@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/region@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/0ea10a66e34a58fa12c7fc481bbe99a3e6b943a786098f210f5817bf5198f643a2379492bd8939a5f275b3f5b2095d4e87f5f1f2adb7836ed88efd7faefd5cc4 + checksum: 10c0/8213e6a66bc1af847059a9ad638c30159f0fbd5c15ebc9382aeec4dc4b201aacfc129cc5b102d3d51298b877d56338824bd58727829994a7b9af923f338c02c5 languageName: node linkType: hard @@ -3756,16 +3729,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/sales-channel@npm:^2.5.0, @medusajs/sales-channel@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/sales-channel@npm:2.5.1" +"@medusajs/sales-channel@npm:^2.5.0, @medusajs/sales-channel@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/sales-channel@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/a92e3bc079c9d51ce7436046312fb3d7d91fc70b9a54a63d7fca5196ddb86c5c1f738fde52e2081c2acc471b23024cdc1a9cc644866f483a8b78a696664cacf9 + checksum: 10c0/72ac301c5427c94cdb99d7a1df80bb45834e71ae4dfe39b25b1159c8134aee199853c374be621eb61b8fb299765ca3438e7f6db7540d62c30ab6b73e4df6d83a languageName: node linkType: hard @@ -3782,16 +3755,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/stock-location@npm:^2.5.0, @medusajs/stock-location@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/stock-location@npm:2.5.1" +"@medusajs/stock-location@npm:^2.5.0, @medusajs/stock-location@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/stock-location@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/a22fa2fec398c71fd7aef0047ad65aff3761f20f3709ed77987d731e0c54078f8004effd06ba9690c014ef4a0a27619ae7b4ffe8c2ef970a19c8da950253e5bd + checksum: 10c0/1467cc07eb001e05b1983bb97e0455c9072ec6ac144568912c6553bd92efc4f0bf6be795f07d05ae32344960225aa2fc92e0a4106e25c4dbb6edddfca204a395 languageName: node linkType: hard @@ -3808,16 +3781,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/store@npm:^2.5.0, @medusajs/store@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/store@npm:2.5.1" +"@medusajs/store@npm:^2.5.0, @medusajs/store@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/store@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/a65f5ca518c98cf9bd9a912ef5cfdaaf06e06d63b4c86091dd89c6c723e2b9065fe14fbf64acbb5a1cf3db73285f3d8bcfeb4fc464e21ddcce0d9f5745e4b86f + checksum: 10c0/8da3a3bad9dd79aafe5814e12ecbcdaf3229e769e4c65a13a43d2ccee06c3a57e8121b222087ad5b92e01aeaffc90cd015439e16a0eaac26a9957e56c012c425 languageName: node linkType: hard @@ -3834,16 +3807,16 @@ __metadata: languageName: node linkType: hard -"@medusajs/tax@npm:^2.5.0, @medusajs/tax@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/tax@npm:2.5.1" +"@medusajs/tax@npm:^2.5.0, @medusajs/tax@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/tax@npm:2.6.0" peerDependencies: "@medusajs/framework": ^2.4.0 "@mikro-orm/core": 6.4.3 "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/03fd5b99f24e2405a20f2181b3416416bc9bd53ec2492827e3216fcbe65775e30adffd7fc6e0d2250bf91ff0bf0c554ce0444ce3dafeb9e67e4f58d49adce11e + checksum: 10c0/6974db06574ffa55bb44401dd1db7a346c2b4c04b4dd69fa8e36df1bb718f908e2f5c2d357fc6cd3935a338ba39519955cfe1487100958faab4e320b950aee88 languageName: node linkType: hard @@ -3860,9 +3833,9 @@ __metadata: languageName: node linkType: hard -"@medusajs/telemetry@npm:^2.5.0, @medusajs/telemetry@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/telemetry@npm:2.5.1" +"@medusajs/telemetry@npm:^2.5.0, @medusajs/telemetry@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/telemetry@npm:2.6.0" dependencies: "@babel/runtime": "npm:^7.22.10" axios: "npm:^0.21.4" @@ -3874,7 +3847,7 @@ __metadata: is-docker: "npm:^2.2.1" remove-trailing-slash: "npm:^0.1.1" uuid: "npm:^8.3.2" - checksum: 10c0/94cbd43b89265415c753fbdd35b3769454e7c7e1478514ce5b59dee631143ba45951fd0dbeecc6f9fc6ca55b30770cd2a42c9f4b806c680deb0b1be6f91f6a81 + checksum: 10c0/005dd71ecf2f8391c0f522670fc9f355d045395ab2ebba47885424b07a57e0f7073499cc4909add35437a1b7b9c79087eccb43fe5f8089a4d290836501919674 languageName: node linkType: hard @@ -3938,9 +3911,9 @@ __metadata: languageName: node linkType: hard -"@medusajs/test-utils@npm:2.5.1": - version: 2.5.1 - resolution: "@medusajs/test-utils@npm:2.5.1" +"@medusajs/test-utils@npm:2.6.0": + version: 2.6.0 + resolution: "@medusajs/test-utils@npm:2.6.0" dependencies: "@types/express": "npm:^4.17.17" axios: "npm:^0.21.4" @@ -3955,7 +3928,7 @@ __metadata: peerDependenciesMeta: "@medusajs/medusa": optional: true - checksum: 10c0/430a7aef6323cd1d52711eef96e0928a3cea24bd68a5365a256a0a5516ae919e8535720230e224515efc47223511d6b6d7165f5f8f9627f7fcf2ac0f95cfb0a7 + checksum: 10c0/2909074822c4826843c7f6dfa4e37e825959243637d86aa915c75a52420e15c3e180128a8dbd45b366d3e2b095a95574373e728ce5cf94241e80c8a75f64eb36 languageName: node linkType: hard @@ -3977,21 +3950,21 @@ __metadata: languageName: node linkType: hard -"@medusajs/types@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/types@npm:2.5.1" +"@medusajs/types@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/types@npm:2.6.0" dependencies: bignumber.js: "npm:^9.1.2" peerDependencies: awilix: ^8.0.1 ioredis: ^5.4.1 - vite: ^5.4.14 + vite: ^5 || ^6 peerDependenciesMeta: ioredis: optional: true vite: optional: true - checksum: 10c0/98315c2aca0a3d3e12e9a3bc86a56eea58dcb5b8a1a8e7cd035a0688e8cb02881ddcf76e38dc83115f4eac96bce0e229bed542ce2c001a7f6c2ef8b501702646 + checksum: 10c0/d405ceb3dfe8647af3d4b51c6c98534eccc13867bff8d1baa8984036391beb1359fb07b67df7e05f7894f07a9581dc3944d794077c03b14e6be4a0e15c106aef languageName: node linkType: hard @@ -4075,9 +4048,9 @@ __metadata: languageName: node linkType: hard -"@medusajs/user@npm:^2.5.0, @medusajs/user@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/user@npm:2.5.1" +"@medusajs/user@npm:^2.5.0, @medusajs/user@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/user@npm:2.6.0" dependencies: jsonwebtoken: "npm:^9.0.2" peerDependencies: @@ -4086,7 +4059,7 @@ __metadata: "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/2167f315cdfce7c58869e2299e9816a6172bf556ff28ad708ec118b413e55c56a40e554fe03db3394f05dffab1ea4c9d7dd96432d02d50101767b211ca797160 + checksum: 10c0/469dffb85ae9ba2b89364c53d723030b2935500fb86f19814c3f1b332b1e25dd61bb2b552c0b4df1e5543fd1b1585711e1c72bb16906040ec4796cdc31239356 languageName: node linkType: hard @@ -4135,7 +4108,7 @@ __metadata: languageName: node linkType: hard -"@medusajs/utils@npm:2.5.0, @medusajs/utils@npm:^2.5.0": +"@medusajs/utils@npm:2.5.0": version: 2.5.0 resolution: "@medusajs/utils@npm:2.5.0" dependencies: @@ -4165,15 +4138,15 @@ __metadata: languageName: node linkType: hard -"@medusajs/utils@npm:2.5.1, @medusajs/utils@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/utils@npm:2.5.1" +"@medusajs/utils@npm:2.6.0, @medusajs/utils@npm:^2.5.0, @medusajs/utils@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/utils@npm:2.6.0" dependencies: "@graphql-codegen/core": "npm:^4.0.2" "@graphql-codegen/typescript": "npm:^4.0.9" "@graphql-tools/merge": "npm:^9.0.7" "@graphql-tools/schema": "npm:^10.0.6" - "@medusajs/types": "npm:^2.5.1" + "@medusajs/types": "npm:^2.6.0" "@types/pluralize": "npm:^0.0.33" bignumber.js: "npm:^9.1.2" dotenv: "npm:^16.4.5" @@ -4191,13 +4164,13 @@ __metadata: awilix: ^8.0.1 express: ^4.21.0 pg: ^8.13.0 - checksum: 10c0/fbd875c2e2858ef7f0a1385acfb82324772c49c2e6224980d921a8de3460f192f6502a398150cf61a985a18ffe121508e1b5a51d000a4e1f2c7149ef29d0c5ee + checksum: 10c0/86321649d20038c8921cc462f16af70539a1bb2979a801f1f66a71c44f5d35b68f8add272d9bd66c78ad2ae9958371cad7e2440755d6da46b1b884a5b9d89419 languageName: node linkType: hard -"@medusajs/workflow-engine-inmemory@npm:^2.5.0, @medusajs/workflow-engine-inmemory@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/workflow-engine-inmemory@npm:2.5.1" +"@medusajs/workflow-engine-inmemory@npm:^2.5.0, @medusajs/workflow-engine-inmemory@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/workflow-engine-inmemory@npm:2.6.0" dependencies: cron-parser: "npm:^4.9.0" ulid: "npm:^2.3.0" @@ -4207,7 +4180,7 @@ __metadata: "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/d09e6a912385bbac77bbf0ec968acf171a9115c6db0486d33d1478d0d4e6984bc2c836afaaaa2f90702968bc0c0f60c9664afe718554c3f092946fcadd9f72a1 + checksum: 10c0/6efc09304828dc525a7db9ca6a4bd9dc4bc537c585d16171d5a211f7866c744ef7fa9e050175317557764731c14690f525a2fc90e227f180cc1357677ad259fd languageName: node linkType: hard @@ -4227,9 +4200,9 @@ __metadata: languageName: node linkType: hard -"@medusajs/workflow-engine-redis@npm:^2.5.0, @medusajs/workflow-engine-redis@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/workflow-engine-redis@npm:2.5.1" +"@medusajs/workflow-engine-redis@npm:^2.5.0, @medusajs/workflow-engine-redis@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/workflow-engine-redis@npm:2.6.0" dependencies: bullmq: "npm:5.13.0" ioredis: "npm:^5.4.1" @@ -4240,7 +4213,7 @@ __metadata: "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 - checksum: 10c0/cf74adf11f811d2999b6d7024d0e39c39bc8413c1e87c476958e4c6781b1259d93fda8fd23a6beafcb1034fecbd6e549d46777eb550d4c3fd81381fa0006c0eb + checksum: 10c0/644c731081844bdcdc13cbbc7de34147d76f5bbf6ad7bad403d6a2a76bcc977a5a96a7a435728bdfbc02d900556dc8f4437eaa8620f0862e258bfbd0f571ef5a languageName: node linkType: hard @@ -4261,35 +4234,14 @@ __metadata: languageName: node linkType: hard -"@medusajs/workflows-sdk@npm:^2.5.0": - version: 2.5.0 - resolution: "@medusajs/workflows-sdk@npm:2.5.0" - dependencies: - "@medusajs/modules-sdk": "npm:^2.5.0" - "@medusajs/orchestration": "npm:^2.5.0" - "@medusajs/types": "npm:^2.5.0" - "@medusajs/utils": "npm:^2.5.0" - ulid: "npm:^2.3.0" - peerDependencies: - "@mikro-orm/core": 6.4.3 - "@mikro-orm/knex": 6.4.3 - "@mikro-orm/migrations": 6.4.3 - "@mikro-orm/postgresql": 6.4.3 - awilix: ^8.0.1 - express: ^4.21.0 - pg: ^8.13.0 - checksum: 10c0/d77747e99425e0c886579a994e783d4a7cc010fce45a3190ed780d10bd1dfb7aa0be6240ecbce07e0e9fd38a3fd5c26dc3952161b747b9c6de699960273be883 - languageName: node - linkType: hard - -"@medusajs/workflows-sdk@npm:^2.5.1": - version: 2.5.1 - resolution: "@medusajs/workflows-sdk@npm:2.5.1" +"@medusajs/workflows-sdk@npm:2.6.0, @medusajs/workflows-sdk@npm:^2.5.0, @medusajs/workflows-sdk@npm:^2.6.0": + version: 2.6.0 + resolution: "@medusajs/workflows-sdk@npm:2.6.0" dependencies: - "@medusajs/modules-sdk": "npm:^2.5.1" - "@medusajs/orchestration": "npm:^2.5.1" - "@medusajs/types": "npm:^2.5.1" - "@medusajs/utils": "npm:^2.5.1" + "@medusajs/modules-sdk": "npm:^2.6.0" + "@medusajs/orchestration": "npm:^2.6.0" + "@medusajs/types": "npm:^2.6.0" + "@medusajs/utils": "npm:^2.6.0" ulid: "npm:^2.3.0" peerDependencies: "@mikro-orm/core": 6.4.3 @@ -4299,7 +4251,7 @@ __metadata: awilix: ^8.0.1 express: ^4.21.0 pg: ^8.13.0 - checksum: 10c0/e6e449396ef07240f417ecc2cccb8409e8710ae731176bed267bb013ef47046b228e2c8877711c1d9c9b7d2a6064b9824ee97506a59980871660ae7030ed3b4f + checksum: 10c0/71cbc9e0d6c909becbfc752af53e619bf8b9318e602c7e9deded02220109c8bc5c50aaabe768051b57143094193dcd06f5f6a6df340394900004a853ff0c1397 languageName: node linkType: hard @@ -14175,7 +14127,7 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.12": +"path-to-regexp@npm:0.1.12, path-to-regexp@npm:^0.1.10": version: 0.1.12 resolution: "path-to-regexp@npm:0.1.12" checksum: 10c0/1c6ff10ca169b773f3bba943bbc6a07182e332464704572962d277b900aeee81ac6aa5d060ff9e01149636c30b1f63af6e69dd7786ba6e0ddb39d4dee1f0645b From 8fab899e30edf7b9e24aeae116b052fc9f2edc58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antony=20Dur=C3=A1n?= Date: Thu, 6 Mar 2025 10:51:53 -0600 Subject: [PATCH 08/37] temporary fix(page-builder): convert page with dynamic params to static due to issue --- .../routes/content/editor/{[id] => test}/page.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) rename plugins/page-builder/src/admin/routes/content/editor/{[id] => test}/page.tsx (72%) diff --git a/plugins/page-builder/src/admin/routes/content/editor/[id]/page.tsx b/plugins/page-builder/src/admin/routes/content/editor/test/page.tsx similarity index 72% rename from plugins/page-builder/src/admin/routes/content/editor/[id]/page.tsx rename to plugins/page-builder/src/admin/routes/content/editor/test/page.tsx index 097e2d9e..c207651d 100644 --- a/plugins/page-builder/src/admin/routes/content/editor/[id]/page.tsx +++ b/plugins/page-builder/src/admin/routes/content/editor/test/page.tsx @@ -20,20 +20,24 @@ export async function loader({ params }: LoaderFunctionArgs) { const PostDetailsPage = () => { const { id } = useParams() console.log("🚀 ~ PostDetailsPage ~ id:", id) - const postData = useLoaderData() as Awaited> - console.log("🚀 ~ PostDetailsPage ~ post:", postData) + // const postData = useLoaderData() as Awaited> + // console.log("🚀 ~ PostDetailsPage ~ post:", postData) + const pageName = "Test Page" return ( + {/* EditorModal.Title is required by EditorModal.Content */} + -

    {postData.post?.title}

    -

    {postData.post?.description}

    + {/*

    {postData.post?.title}

    +

    {postData.post?.description}

    */} +

    {pageName}

    From dd687f21d1dd68af7b6b0f017f46035b5e331499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antony=20Dur=C3=A1n?= Date: Thu, 6 Mar 2025 17:22:06 -0600 Subject: [PATCH 09/37] refactor(page-builder): restructure editor route components and providers --- .../src/admin/components/atoms/icon/icon.tsx | 20 -- .../src/admin/components/atoms/index.ts | 7 - .../src/admin/components/molecules/index.ts | 9 - .../molecules/nav-item/nav-item.tsx | 187 ------------------ .../src/admin/components/organisms/index.ts | 12 -- .../static-sidebar-container.tsx | 24 --- .../src/admin/components/templates/index.ts | 2 - .../templates/post-layout/post-layout.tsx | 16 -- .../admin/components/templates/shell/index.ts | 2 - .../components/templates/shell/shell.tsx | 23 --- plugins/page-builder/src/admin/lib/client.ts | 12 -- .../src/admin/providers/sidebar/index.ts | 3 - .../editor/components}/breadcrumbs.tsx | 3 - .../editor/components}/editor-modal.tsx | 3 +- .../editor/components}/editor-sidebar.tsx | 21 +- .../editor/components/editor-top-bar.tsx} | 8 +- .../editor/components}/main-content.tsx | 7 +- .../content/editor/components/nav-item.tsx | 37 ++++ .../editor/components/post-editor-layout.tsx | 20 ++ .../components}/post-settings-sidebar.tsx | 10 +- .../editor/components/sidebar-container.tsx} | 32 ++- .../editor/components}/sidebar-toggle.tsx | 5 +- .../editor/hooks}/use-editor-sidebar.tsx | 2 +- .../editor}/hooks/use-loading-state.ts | 0 .../providers}/editor-sidebar-context.tsx | 0 .../providers}/editor-sidebar-provider.tsx | 0 .../admin/routes/content/editor/test/page.tsx | 14 +- 27 files changed, 109 insertions(+), 370 deletions(-) delete mode 100644 plugins/page-builder/src/admin/components/atoms/icon/icon.tsx delete mode 100644 plugins/page-builder/src/admin/components/atoms/index.ts delete mode 100644 plugins/page-builder/src/admin/components/molecules/index.ts delete mode 100644 plugins/page-builder/src/admin/components/molecules/nav-item/nav-item.tsx delete mode 100644 plugins/page-builder/src/admin/components/organisms/index.ts delete mode 100644 plugins/page-builder/src/admin/components/organisms/sidebar-container/static-sidebar-container.tsx delete mode 100644 plugins/page-builder/src/admin/components/templates/index.ts delete mode 100644 plugins/page-builder/src/admin/components/templates/post-layout/post-layout.tsx delete mode 100644 plugins/page-builder/src/admin/components/templates/shell/index.ts delete mode 100644 plugins/page-builder/src/admin/components/templates/shell/shell.tsx delete mode 100644 plugins/page-builder/src/admin/lib/client.ts delete mode 100644 plugins/page-builder/src/admin/providers/sidebar/index.ts rename plugins/page-builder/src/admin/{components/molecules/breadcrumbs => routes/content/editor/components}/breadcrumbs.tsx (97%) rename plugins/page-builder/src/admin/{components/organisms/editor-modal => routes/content/editor/components}/editor-modal.tsx (98%) rename plugins/page-builder/src/admin/{components/organisms/editor-sidebar => routes/content/editor/components}/editor-sidebar.tsx (63%) rename plugins/page-builder/src/admin/{components/organisms/top-bar/top-bar.tsx => routes/content/editor/components/editor-top-bar.tsx} (74%) rename plugins/page-builder/src/admin/{components/templates/shell => routes/content/editor/components}/main-content.tsx (75%) create mode 100644 plugins/page-builder/src/admin/routes/content/editor/components/nav-item.tsx create mode 100644 plugins/page-builder/src/admin/routes/content/editor/components/post-editor-layout.tsx rename plugins/page-builder/src/admin/{components/organisms/post-settings-sidebar => routes/content/editor/components}/post-settings-sidebar.tsx (69%) rename plugins/page-builder/src/admin/{components/organisms/sidebar-container/drawer-sidebar-container.tsx => routes/content/editor/components/sidebar-container.tsx} (61%) rename plugins/page-builder/src/admin/{components/molecules/sidebar-toggle => routes/content/editor/components}/sidebar-toggle.tsx (89%) rename plugins/page-builder/src/admin/{providers/sidebar => routes/content/editor/hooks}/use-editor-sidebar.tsx (90%) rename plugins/page-builder/src/admin/{ => routes/content/editor}/hooks/use-loading-state.ts (100%) rename plugins/page-builder/src/admin/{providers/sidebar => routes/content/editor/providers}/editor-sidebar-context.tsx (100%) rename plugins/page-builder/src/admin/{providers/sidebar => routes/content/editor/providers}/editor-sidebar-provider.tsx (100%) diff --git a/plugins/page-builder/src/admin/components/atoms/icon/icon.tsx b/plugins/page-builder/src/admin/components/atoms/icon/icon.tsx deleted file mode 100644 index 69d0c6e6..00000000 --- a/plugins/page-builder/src/admin/components/atoms/icon/icon.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { ReactNode } from "react" - -type ItemType = "core" | "extension" | "setting" - -/** - * Icon component that handles different display styles based on item type - */ -export const Icon = ({ icon, type }: { icon?: ReactNode; type: ItemType }) => { - if (!icon) { - return null - } - - return type === "extension" ? ( -
    -
    {icon}
    -
    - ) : ( - icon - ) -} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/atoms/index.ts b/plugins/page-builder/src/admin/components/atoms/index.ts deleted file mode 100644 index ebcad1bc..00000000 --- a/plugins/page-builder/src/admin/components/atoms/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Atoms are the basic building blocks of the UI. - * They are the smallest, indivisible components that can be reused across the application. - */ - -// Export atoms as they are created -export * from './icon/icon' diff --git a/plugins/page-builder/src/admin/components/molecules/index.ts b/plugins/page-builder/src/admin/components/molecules/index.ts deleted file mode 100644 index 4949bd45..00000000 --- a/plugins/page-builder/src/admin/components/molecules/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Molecules are groups of atoms bonded together. - * They are relatively simple combinations of UI components that function together as a unit. - */ - -// Export molecules as they are created -export * from './breadcrumbs/breadcrumbs' -export * from './sidebar-toggle/sidebar-toggle' -export * from './nav-item/nav-item' diff --git a/plugins/page-builder/src/admin/components/molecules/nav-item/nav-item.tsx b/plugins/page-builder/src/admin/components/molecules/nav-item/nav-item.tsx deleted file mode 100644 index ad9e5d66..00000000 --- a/plugins/page-builder/src/admin/components/molecules/nav-item/nav-item.tsx +++ /dev/null @@ -1,187 +0,0 @@ -import { Text, clx } from "@medusajs/ui" -import { Collapsible as RadixCollapsible } from "radix-ui" -import { - ReactNode, - useCallback, - useEffect, - useState, -} from "react" -import { NavLink, useLocation } from "react-router-dom" -import { Icon } from "../../atoms" - -type ItemType = "core" | "extension" | "setting" - -type NestedItemProps = { - label: string - to: string -} - -export type INavItem = { - icon?: ReactNode - label: string - to: string - items?: NestedItemProps[] - type?: ItemType - from?: string - nested?: string -} - -const BASE_NAV_LINK_CLASSES = - "text-ui-fg-subtle transition-fg hover:bg-ui-bg-subtle-hover flex items-center gap-x-2 rounded-md py-0.5 pl-0.5 pr-2 outline-none [&>svg]:text-ui-fg-subtle focus-visible:shadow-borders-focus" -const ACTIVE_NAV_LINK_CLASSES = - "bg-ui-bg-base shadow-elevation-card-rest text-ui-fg-base hover:bg-ui-bg-base" -const NESTED_NAV_LINK_CLASSES = "pl-[34px] pr-2 py-1 w-full text-ui-fg-muted" -const SETTING_NAV_LINK_CLASSES = "pl-2 py-1" - -const getIsOpen = ( - to: string, - items: NestedItemProps[] | undefined, - pathname: string -) => { - return [to, ...(items?.map((i) => i.to) ?? [])].some((p) => - pathname.startsWith(p) - ) -} - -/** - * Navigation item component with support for nested items - */ -export const NavItem = ({ - icon, - label, - to, - items, - type = "core", - from, -}: INavItem) => { - const { pathname } = useLocation() - const [open, setOpen] = useState(getIsOpen(to, items, pathname)) - - useEffect(() => { - setOpen(getIsOpen(to, items, pathname)) - }, [pathname, to, items]) - - const navLinkClassNames = useCallback( - ({ - to, - isActive, - isNested = false, - isSetting = false, - }: { - to: string - isActive: boolean - isNested?: boolean - isSetting?: boolean - }) => { - if (["core", "setting"].includes(type)) { - isActive = pathname.startsWith(to) - } - - return clx(BASE_NAV_LINK_CLASSES, { - [NESTED_NAV_LINK_CLASSES]: isNested, - [ACTIVE_NAV_LINK_CLASSES]: isActive, - [SETTING_NAV_LINK_CLASSES]: isSetting, - }) - }, - [type, pathname] - ) - - const isSetting = type === "setting" - - return ( -
    - { - return clx(navLinkClassNames({ isActive, isSetting, to }), { - "max-lg:hidden": !!items?.length, - }) - }} - > - {type !== "setting" && ( -
    - -
    - )} - - {label} - -
    - {items && items.length > 0 && ( - - -
    - -
    - - {label} - -
    - -
    -
      -
    • - { - return clx( - navLinkClassNames({ - to, - isActive, - isSetting, - isNested: true, - }) - ) - }} - > - - {label} - - -
    • - {items.map((item) => { - return ( -
    • - { - return clx( - navLinkClassNames({ - to: item.to, - isActive, - isSetting, - isNested: true, - }) - ) - }} - > - - {item.label} - - -
    • - ) - })} -
    -
    -
    -
    - )} -
    - ) -} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/organisms/index.ts b/plugins/page-builder/src/admin/components/organisms/index.ts deleted file mode 100644 index 3865e903..00000000 --- a/plugins/page-builder/src/admin/components/organisms/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Organisms are complex UI components composed of groups of molecules and/or atoms. - * They form distinct sections of the interface. - */ - -// Export organisms as they are created -export * from './top-bar/top-bar' -export * from './editor-modal/editor-modal' -export * from './sidebar-container/static-sidebar-container' -export * from './sidebar-container/drawer-sidebar-container' -export * from './editor-sidebar/editor-sidebar' -export * from './post-settings-sidebar/post-settings-sidebar' diff --git a/plugins/page-builder/src/admin/components/organisms/sidebar-container/static-sidebar-container.tsx b/plugins/page-builder/src/admin/components/organisms/sidebar-container/static-sidebar-container.tsx deleted file mode 100644 index 5a31be30..00000000 --- a/plugins/page-builder/src/admin/components/organisms/sidebar-container/static-sidebar-container.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { clx } from "@medusajs/ui" -import { PropsWithChildren } from "react" -import { useEditorSidebar } from "../../../providers/sidebar" - -/** - * Static sidebar container component that displays content in a permanent sidebar - * Only visible on desktop (lg breakpoint and above) - */ -export const StaticSidebarContainer = ({ children, side = "left" }: PropsWithChildren & { side?: "left" | "right" }) => { - const { left, right } = useEditorSidebar() - const isOpen = side === "left" ? left.static : right.static - - return ( -
    - {children} -
    - ) -} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/templates/index.ts b/plugins/page-builder/src/admin/components/templates/index.ts deleted file mode 100644 index a4ef7df2..00000000 --- a/plugins/page-builder/src/admin/components/templates/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './post-layout/post-layout' -export * from './shell/shell' diff --git a/plugins/page-builder/src/admin/components/templates/post-layout/post-layout.tsx b/plugins/page-builder/src/admin/components/templates/post-layout/post-layout.tsx deleted file mode 100644 index 4c941947..00000000 --- a/plugins/page-builder/src/admin/components/templates/post-layout/post-layout.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { PropsWithChildren } from "react" -import { Shell } from "../shell/shell" -import { EditorSidebar } from "../../organisms/editor-sidebar/editor-sidebar" -import { PostSettingsSidebar } from "../../organisms/post-settings-sidebar/post-settings-sidebar" - -/** - * Post layout template for the post editor - * Provides the main layout structure with sidebars - */ -export const PostLayout = ({ children }: PropsWithChildren) => { - return ( - } rightSidebar={}> - {children} - - ) -} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/components/templates/shell/index.ts b/plugins/page-builder/src/admin/components/templates/shell/index.ts deleted file mode 100644 index c55febbf..00000000 --- a/plugins/page-builder/src/admin/components/templates/shell/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './shell' -export * from './main-content' diff --git a/plugins/page-builder/src/admin/components/templates/shell/shell.tsx b/plugins/page-builder/src/admin/components/templates/shell/shell.tsx deleted file mode 100644 index 924aac59..00000000 --- a/plugins/page-builder/src/admin/components/templates/shell/shell.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { PropsWithChildren, ReactNode } from "react" -import { TooltipProvider } from "@medusajs/ui" -import { MainContent } from "./main-content" - -type ShellProps = PropsWithChildren & { - leftSidebar?: ReactNode - rightSidebar?: ReactNode -} - -/** - * Shell layout component that provides a consistent layout across the admin dashboard. - */ -export const Shell = ({ children, leftSidebar, rightSidebar }: ShellProps) => { - return ( - -
    - {leftSidebar} - {children} - {rightSidebar} -
    -
    - ) -} \ No newline at end of file diff --git a/plugins/page-builder/src/admin/lib/client.ts b/plugins/page-builder/src/admin/lib/client.ts deleted file mode 100644 index 4be38dad..00000000 --- a/plugins/page-builder/src/admin/lib/client.ts +++ /dev/null @@ -1,12 +0,0 @@ -import Medusa from '@medusajs/js-sdk' - -declare const __BACKEND_URL__: string | undefined - -export const backendUrl = __BACKEND_URL__ ?? 'http://localhost:9000' - -export const sdk = new Medusa({ - baseUrl: backendUrl, - auth: { - type: 'session', - }, -}) diff --git a/plugins/page-builder/src/admin/providers/sidebar/index.ts b/plugins/page-builder/src/admin/providers/sidebar/index.ts deleted file mode 100644 index fbf096f2..00000000 --- a/plugins/page-builder/src/admin/providers/sidebar/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './editor-sidebar-context' -export * from './editor-sidebar-provider' -export * from './use-editor-sidebar' diff --git a/plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx b/plugins/page-builder/src/admin/routes/content/editor/components/breadcrumbs.tsx similarity index 97% rename from plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx rename to plugins/page-builder/src/admin/routes/content/editor/components/breadcrumbs.tsx index a1d04bd5..8cfd0b12 100644 --- a/plugins/page-builder/src/admin/components/molecules/breadcrumbs/breadcrumbs.tsx +++ b/plugins/page-builder/src/admin/routes/content/editor/components/breadcrumbs.tsx @@ -7,9 +7,6 @@ type Crumb = { path?: string } -/** - * Breadcrumbs component for navigation - */ export const Breadcrumbs = () => { const data = useLoaderData() as any diff --git a/plugins/page-builder/src/admin/components/organisms/editor-modal/editor-modal.tsx b/plugins/page-builder/src/admin/routes/content/editor/components/editor-modal.tsx similarity index 98% rename from plugins/page-builder/src/admin/components/organisms/editor-modal/editor-modal.tsx rename to plugins/page-builder/src/admin/routes/content/editor/components/editor-modal.tsx index 318d2eb1..d24b3d4a 100644 --- a/plugins/page-builder/src/admin/components/organisms/editor-modal/editor-modal.tsx +++ b/plugins/page-builder/src/admin/routes/content/editor/components/editor-modal.tsx @@ -1,7 +1,6 @@ "use client" -import { XMark } from "@medusajs/icons" -import { clx, IconButton } from "@medusajs/ui" +import { clx } from "@medusajs/ui" import { Dialog as RadixDialog } from "radix-ui" import * as React from "react" diff --git a/plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx b/plugins/page-builder/src/admin/routes/content/editor/components/editor-sidebar.tsx similarity index 63% rename from plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx rename to plugins/page-builder/src/admin/routes/content/editor/components/editor-sidebar.tsx index 73176404..1ad9e60e 100644 --- a/plugins/page-builder/src/admin/components/organisms/editor-sidebar/editor-sidebar.tsx +++ b/plugins/page-builder/src/admin/routes/content/editor/components/editor-sidebar.tsx @@ -1,13 +1,8 @@ import { SquareTwoStackSolid } from "@medusajs/icons" -import { NavItem } from "../../molecules/nav-item/nav-item" -import { DrawerSidebarContainer } from "../sidebar-container/drawer-sidebar-container" -import { StaticSidebarContainer } from "../sidebar-container/static-sidebar-container" -/** - * EditorSidebar is a responsive sidebar for the page builder - * - Rendered as a static sidebar on desktop screens - * - Rendered as a drawer on mobile/smaller screens - */ +import { SidebarContainer } from "./sidebar-container" +import { INavItem, NavItem } from "./nav-item" + export const EditorSidebar = () => { const sidebarContent = (