Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
a0d4d2a
feat(dashboard): Send only changed fields on detail page updates
grolmus Jul 3, 2026
5a1a980
test(dashboard): Assert collection update sends only changed fields
grolmus Jul 3, 2026
30d4403
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 10, 2026
1ba7f8c
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 10, 2026
e74de26
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 10, 2026
337b2f7
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 10, 2026
d9eed44
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 10, 2026
3da49cf
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 10, 2026
0b17520
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 10, 2026
53aecd0
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 10, 2026
9805bd3
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 13, 2026
92a45c7
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 13, 2026
4999f61
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 13, 2026
07560cd
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 14, 2026
c2422f3
fix(core): Prevent ReDoS in SQLite regex filters using RE2 (#4956)
michaelbromley Jul 14, 2026
8a75615
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 14, 2026
9110df6
feat(cli): Create initial migration from an empty database (#4959)
michaelbromley Jul 14, 2026
00777cf
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 14, 2026
0337e67
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 14, 2026
90b9f51
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 14, 2026
3598a6f
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 14, 2026
c747326
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 14, 2026
8ba0751
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 14, 2026
8df0c94
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 14, 2026
9f273b4
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 14, 2026
3205ef8
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 15, 2026
e858c4c
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 15, 2026
00554bd
Merge remote-tracking branch 'origin/minor' into mgrolmus/oss-567-das…
grolmus Jul 15, 2026
e5f9203
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 15, 2026
c42452f
feat(dashboard): Migrate to Vendure Design System v2 (#4957)
dlhck Jul 15, 2026
6925a10
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 15, 2026
741a51a
test(dashboard): Isolate OSS-567 product-update test from shared seed…
grolmus Jul 15, 2026
785b37d
feat(cli): Show one-time GitHub star prompt on shutdown (#4973)
dlhck Jul 15, 2026
1f93ce1
feat(core,email-plugin,dashboard): Add administrator password reset f…
dlhck Jul 15, 2026
fb8d65c
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 15, 2026
d7ba55e
feat(dashboard): Insights page improvements (widget visibility, multi…
dlhck Jul 16, 2026
ac19000
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 16, 2026
88f5205
chore(repo): Resolve master to minor back-merge
dlhck Jul 16, 2026
6fd3502
chore(repo): Resolve master to minor back-merge (#4982)
dlhck Jul 16, 2026
e126616
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 16, 2026
f7ae0e7
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 16, 2026
75d0e46
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 16, 2026
d960e38
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 16, 2026
0c62ef4
feat(dashboard): Product list, product detail & variants editor impro…
dlhck Jul 16, 2026
749b404
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 16, 2026
f2a74fd
fix(core): Assign default roles when creating a Channel (#4980)
michaelbromley Jul 16, 2026
2853cf5
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 16, 2026
9a7b973
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 16, 2026
55d21b0
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 16, 2026
b2c2213
feat(dashboard): Facets & collections UI/UX improvements (#4984)
dlhck Jul 17, 2026
27c02ca
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 17, 2026
5f3bd7b
feat(dashboard): Product variant & option group UX improvements (#4985)
dlhck Jul 17, 2026
a890c15
Merge remote-tracking branch 'origin/master' into minor
vendure-ci-automation-bot[bot] Jul 17, 2026
41c91d9
refactor(dashboard): make data table views opt-in (#4993)
dlhck Jul 17, 2026
31fecd1
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 17, 2026
e8cafbf
feat(dashboard): improve order detail layout (#4991)
dlhck Jul 17, 2026
cc0a072
fix(dashboard): aggregate order metrics in database (#4994)
dlhck Jul 17, 2026
321cfb3
feat(dashboard): improve asset management views (#4992)
dlhck Jul 17, 2026
dd397b2
docs: Regenerate manifest.json
vendure-ci-automation-bot[bot] Jul 17, 2026
5bce81b
Merge branch 'minor' into mgrolmus/oss-567-dashboard-form-engine-resu…
grolmus Jul 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 14 additions & 0 deletions .github/workflows/build_and_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,19 @@ jobs:
- name: Check i18n catalogs are in sync
working-directory: packages/dashboard
run: bash scripts/check-i18n-sync.sh
dashboard-lint:
name: dashboard lint
needs: detect-changes
if: needs.detect-changes.outputs.dashboard == 'true'
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
- uses: ./.github/actions/setup
- name: Lint dashboard
working-directory: packages/dashboard
run: bun run lint
dashboard-e2e:
name: dashboard e2e (${{ matrix.shard }})
needs: detect-changes
Expand Down Expand Up @@ -321,6 +334,7 @@ jobs:
- build
- unit-tests
- dashboard-i18n
- dashboard-lint
- dashboard-e2e
- sonarqube
- e2e-sqljs
Expand Down
236 changes: 179 additions & 57 deletions bun.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions bunfig.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
[install]
minimumReleaseAge = 604800
minimumReleaseAgeExcludes = [
"@vendure-io/design-lint",
"@vendure-io/design-tokens",
"@vendure-io/docs-generator",
"@vendure-io/ui",
Expand Down
9 changes: 8 additions & 1 deletion docs/docs/guides/core-concepts/email/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,20 @@ export const config: VendureConfig = {
fromAddress: '"MyShop" <noreply@myshop.com>', // [!code highlight]
verifyEmailAddressUrl: 'https://www.myshop.com/verify', // [!code highlight]
passwordResetUrl: 'https://www.myshop.com/password-reset', // [!code highlight]
changeEmailAddressUrl: 'https://www.myshop.com/verify-email-address-change' // [!code highlight]
changeEmailAddressUrl: 'https://www.myshop.com/verify-email-address-change', // [!code highlight]
adminPasswordResetUrl: 'https://my-server.com/dashboard/reset-password' // [!code highlight]
}, // [!code highlight]
}),
],
};
```

:::note
The `adminPasswordResetUrl` variable is used by the `adminPasswordResetHandler` (one of the default email handlers since v3.8.0)
and should point to the password reset page of your Dashboard. If it is not set, the reset link in the
"admin-password-reset" email will not work.
:::

### Email integrations

The EmailPlugin is designed to be flexible enough to work with many different email services. The default
Expand Down
4 changes: 4 additions & 0 deletions docs/docs/guides/developer-guide/cli/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,9 @@ npx vendure migrate --revert

# Generate migration with custom output directory
npx vendure migrate -g my-migration -o ./custom/migrations

# Generate a complete baseline migration against an empty shadow database
npx vendure migrate -g initial --from-empty
```

#### Migrate Command Options
Expand All @@ -167,6 +170,7 @@ npx vendure migrate -g my-migration -o ./custom/migrations
| `-r` | `--run` | Run all pending migrations | `vendure migrate -r` |
| | `--revert` | Revert the last migration | `vendure migrate --revert` |
| `-o` | `--output-dir <path>` | Custom output directory for migrations | `vendure migrate -g my-migration -o ./migrations` |
| | `--from-empty` | Generate a complete baseline migration by diffing against an empty [shadow database](/developer-guide/migrations/#generating-a-baseline-migration-for-an-existing-project) | `vendure migrate -g initial --from-empty` |

## The Schema Command

Expand Down
24 changes: 24 additions & 0 deletions docs/docs/guides/developer-guide/migrations/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,30 @@ export const config: VendureConfig = {
};
```

## The initial migration

A fresh project created with `@vendure/create` ships with an **initial migration** that creates the entire database schema. This matters for production: the first time you deploy against a new, empty database the schema is created by running migrations, so you never need to enable `synchronize` — not even for the first deploy.

:::info
Without an initial migration, a fresh deployment against an empty database would start with no tables at all, because `synchronize` is (correctly) disabled. Shipping the initial migration is what makes the first deploy work.
:::

### Generating a baseline migration for an existing project

`generateMigration` compares your configuration against the schema of the _currently configured_ database. Run it against a database that already contains the schema and it finds no differences, so it cannot produce an initial migration. This is a problem if you have an existing project with no initial migration and need to create one.

For this case, use the `--from-empty` flag:

:::cli
Run `npx vendure migrate --generate initial --from-empty`
:::

Instead of diffing against your configured database, `--from-empty` diffs your configuration against a temporary, empty "shadow" database of the same type, producing a complete migration that recreates the whole schema from scratch. This is the same approach used by tools such as Prisma and Atlas.

:::note
For PostgreSQL and MySQL/MariaDB, `--from-empty` creates and drops a temporary database on the same server, so the configured database user must have permission to create databases. For SQLite an in-memory database is used.
:::

## Migration workflow

This section assumes a standard Vendure installation based on `@vendure/create`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ This lets the dashboard know how your component should be rendered in certain co

- **`isListInput`**: Declare whether your component is intended for list fields. Use `'dynamic'` if it can handle both list and non-list fields.
- **`isFullWidth`**: When `true`, the dashboard will render the field so it spans the full width of the standard 2-column detail form grids (e.g. `DetailFormGrid`).
- **`summary`**: A component rendering a compact, read-only summary of the field's current value. Used to label the value chips when your component is used for a [configurable operation argument](#configurable-operation-components). It may use hooks and data fetching, e.g. to resolve stored IDs to display names.
- **`popoverSize`**: When your component is used for a configurable operation argument, it renders inside a popover. Set to `'lg'` if it needs more room than the default width.

```tsx
import { DashboardFormComponentProps } from '@vendure/dashboard';
Expand Down Expand Up @@ -192,6 +194,32 @@ const customShippingCalculator = new ShippingCalculator({
});
```

### How operation arguments are rendered

Configurable operations render as a one-line sentence based on the operation's description template, where
each argument appears as an inline value chip. Clicking a chip opens a popover containing the argument's
registered form component — your component receives exactly the same props as in any other context, so no
changes are needed for it to work there.

Two optional `metadata` properties let you refine how your component behaves in this context:

- Without a `summary`, the chip label falls back to the raw value (or a count for list values). Provide a
`summary` component to render something more meaningful — this matters especially for components that
store entity IDs, since the summary can resolve them to display names.
- If your component needs more horizontal space than the default popover provides, set `popoverSize: 'lg'`.

```tsx title="src/plugins/my-plugin/dashboard/components/color-picker.tsx"
ColorPickerComponent.metadata = {
summary: ({ value }) => (
<span className="inline-flex items-center gap-1.5">
<span className="inline-block h-3 w-3 rounded-sm border" style={{ backgroundColor: value }} />
{value}
</span>
),
popoverSize: 'lg',
};
```

## Replacing Native Detail-Page Fields

Use this path when you want to replace the rendered input for a native field on an existing detail page, such as `Product.description`, `Product.slug`, or `Customer.emailAddress`. These overrides are targeted to a specific page, block, and field.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ Most generated-style detail pages use `blockId: 'main-form'` for their main form
| Standard data table list pages | `list-table` |
| Insights | `widgets` |
| Asset list | `asset-gallery` |
| Product detail | `enabled-toggle`, `main-form`, `custom-fields`, `product-variants-table`, `generate-variants`, `option-groups`, `facet-values`, `channels`, `assets` |
| Product detail | `main-form`, `custom-fields`, `product-variants-table`, `generate-variants`, `option-groups`, `facet-values`, `channels`, `assets` |
| Manage product variants | `option-groups`, `product-variants` |
| Product variant detail | `enabled`, `options`, `main-form`, `custom-fields`, `price-and-tax`, `stock`, `facet-values`, `parent-product`, `assets` |
| Collection detail | `privacy`, `main-form`, `custom-fields`, `filters`, `assets`, `contents` |
Expand Down
Loading
Loading