Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/frontend-build-pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
push:
branches:
- "[0-9]+.[0-9]+"
- "[0-9]+.x"
- "feature-*"
- "nightly"
# TEMP (remove before merge): regenerate build-dist/build-<id>.zip on every push to
Expand Down
File renamed without changes.
84 changes: 5 additions & 79 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,84 +1,10 @@
# Contributing to Pimcore
As an open core project we love to work together with our community to improve and develop our products.
It's also important for us to make clear that **we're not working for you or your company**,
but we enjoy to work together to solve issues or improve the product.

## Contributing Pull Requests
We gladly accept community pull requests. This is the preferred way to contribute to Pimcore.
There are a few necessary steps before we can accept a pull request:

> **Note:** Before opening a PR, also see our [Pull Request Guidelines](https://github.com/orgs/pimcore/discussions/19239) for the automated checks your PR must pass.
## Contributing Studio Pull Requests
We gladly accept community pull requests. This is the preferred way to contribute to Pimcore. There are a few necessary steps before we can accept a pull request:

* [Fork us!](https://help.github.com/articles/fork-a-repo/)
* Select the right branch. `main`(`2026.x`) for features and improvements or latest maintenance branch for bug fixes (`2026.2`)
* Code! Follow the coding standards defined [here](https://github.com/pimcore/pimcore/blob/2026.x/.php-cs-fixer.dist.php) and [here](https://github.com/pimcore/pimcore/blob/2026.x/doc/19_Development_Tools_and_Details/29_Testing/02_Core_Tests.md#perform-phpstan-analysis)
* Select the right branch. `main`(`2026.x`) for features and improvements or latest maintenance branch for bug fixes (`2025.4`)
* [Send a pull request](https://help.github.com/articles/using-pull-requests/) from your fork’s branch to our repo branch.
* [Sign the CLA](https://cla-assistant.io/pimcore/pimcore) - see also below.
* Ensure that Github pipelines pass (linter, frontend build...)


## Bug Reports
**Please provide a fix for the bug as a pull request (PR) whenever possible!**
If you've created a pull request, it's not necessary anymore to create an issue for the bug.

* Only file an issue if you're not able to fix the bug and provide the patch as a pull request.
* Please keep in mind that the Pimcore team will only work on system critical and security bugs.
* [Open an issue](https://github.com/pimcore/platform-version/issues) here on GitHub.
* Report security issues only by using [security advisories](https://github.com/pimcore/platform-version/security/advisories).
* Please be patient as not all items will be tested immediately - remember, pimcore is open core and free of charge.
* Occasionally we'll close issues if they appear stale or are too vague - please don't take this personally!
Please feel free to re-open issues we've closed if there's something we've missed and they still need to be addressed.

### Package Types
Please note that we categorize our packages into two types, as indicated in the 'About' section of each GitHub repository.
This categorization helps us prioritize and focus our resources effectively:

* **Core Packages**: These are packages under active development by the Pimcore team, and of course we also welcome and incorporate contributions from the community.
* **Community Packages**: These packages are not currently being actively developed by the Pimcore team. However, we remain committed to their basic maintenance, as well as to reviewing and accepting pull requests, especially for critical bug fixes, and will release new versions as needed.

### Inactive Issue Closing Policy
Pimcore uses a bot that closes abandoned issues after a period of inactivity.
If an issue was not labeled as "Priority" or "Backlog" by us,
this means that we're not going to work on that anytime soon.
In case of a bug report, you can create a pull request fixing the issue instead,
which will be then reviewed as soon as possible.
If you're interested in contributing a feature, please contact us first,
before creating a pull request, we'll then decide whether we'd accept it or not.

## Contributor License Agreement
The following terms are used throughout this agreement:

* **You** - the person or legal entity including its affiliates asked to accept this agreement. An affiliate is any
entity that controls or is controlled by the legal entity, or is under common control with it.

* **Project** - is an umbrella term that refers to any and all Pimcore projects.

* **Contribution** - any type of work that is submitted to a Project, including any modifications or additions to
existing work.

* **Submitted** - conveyed to a Project via a pull request, commit, issue, or any form of electronic, written, or
verbal communication with Pimcore, contributors or maintainers.

#### 1. Grant of Copyright License.
Subject to the terms and conditions of this agreement, You grant to the Projects’ maintainers, contributors, users and
to Pimcore a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce,
prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your contributions and such
derivative works. Except for this license, You reserve all rights, title, and interest in your contributions.

#### 2. Grant of Patent License.
Subject to the terms and conditions of this agreement, You grant to the Projects’ maintainers, contributors, users and
to Pimcore a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section)
patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer your contributions, where
such license applies only to those patent claims licensable by you that are necessarily infringed by your contribution
or by combination of your contribution with the project to which this contribution was submitted.

If any entity institutes patent litigation - including cross-claim or counterclaim in a lawsuit - against You alleging
that your contribution or any project it was submitted to constitutes or is responsible for direct or contributory
patent infringement, then any patent licenses granted to that entity under this agreement shall terminate as of the
date such litigation is filed.

#### 3. Source of Contribution.
Your contribution is either your original creation, based upon previous work that, to the best of your knowledge, is
covered under an appropriate open source license and you have the right under that license to submit that work with
modifications, whether created in whole or in part by you, or you have clearly identified the source of the contribution
and any license or other restriction (like related patents, trademarks, and license agreements) of which you are
personally aware.
For details please check also the contributing docs of [pimcore/pimcore](https://github.com/pimcore/pimcore/blob/2026.x/CONTRIBUTING.md).
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ export interface ManyToManyRelationGridProps {
handleOrderChange: (data: ManyToManyRelationValue) => void
pathFormatterConfig?: { name: string | undefined, class: string | undefined }
enableRowVirtualizer: boolean
hideOpenButton?: boolean
}

export const ManyToManyRelationGrid = forwardRef(function ManyToManyRelationGrid (props: ManyToManyRelationGridProps, ref: MutableRefObject<HTMLDivElement>): React.JSX.Element {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,18 +75,15 @@ export const useColumns = (props: UseColumnsProps): UseColumnsReturn => {
? [...props.columnDefinition]
: defaultColumns

const showActionsColumn = props.hideOpenButton !== true || props.assetInlineDownloadAllowed || props.disabled !== true

const actionsColumn = columnHelper.accessor('actions', {
header: t('actions'),
size: 110,
cell: (info) => {
const rowIndex = info.row.index
const rowValue = info.row.original as DisplayManyToManyRelationValueItem

const buttons: ReactElement[] = []

if (props.hideOpenButton !== true) {
columns.push(
columnHelper.accessor('actions', {
header: t('actions'),
size: 110,
cell: (info) => {
const rowIndex = info.row.index
const rowValue = info.row.original as DisplayManyToManyRelationValueItem

const buttons: ReactElement[] = []
buttons.push(
<Tooltip
key="open"
Expand All @@ -106,69 +103,65 @@ export const useColumns = (props: UseColumnsProps): UseColumnsReturn => {
/>
</Tooltip>
)
}

if (props.assetInlineDownloadAllowed && rowValue.type === 'asset') {
buttons.push(
<Tooltip
key="download"
title={ t('download') }
>
<IconButton
aria-label={ t('aria.asset.image-sidebar.tab.details.download-thumbnail') }
icon={ { value: 'download' } }
onClick={ () => {
download(
rowValue.id.toString()
)
} }
type="link"
if (props.assetInlineDownloadAllowed && rowValue.type === 'asset') {
buttons.push(
<Tooltip
key="download"
title={ t('download') }
>
<IconButton
aria-label={ t('aria.asset.image-sidebar.tab.details.download-thumbnail') }
icon={ { value: 'download' } }
onClick={ () => {
download(
rowValue.id.toString()
)
} }
type="link"
/>
</Tooltip>
)
}

if (props.disabled !== true) {
buttons.push(
<Tooltip
key="remove"
title={ t('remove') }
>
<IconButton
icon={ { value: 'trash' } }
onClick={ () => {
confirm({
title: t('remove'),
content: t('delete-confirmation-advanced', {
type: t('relation'),
value: rowValue.originalPath ?? rowValue.fullPath,
interpolation: { escapeValue: false }
}),
onOk: () => {
props.deleteItem(rowIndex)
}
})
} }
type="link"
/>
</Tooltip>
)
}

return (
<Box padding="mini">
<ButtonGroup
items={ buttons }
noSpacing
/>
</Tooltip>
</Box>
)
}

if (props.disabled !== true) {
buttons.push(
<Tooltip
key="remove"
title={ t('remove') }
>
<IconButton
icon={ { value: 'trash' } }
onClick={ () => {
confirm({
title: t('remove'),
content: t('delete-confirmation-advanced', {
type: t('relation'),
value: rowValue.originalPath ?? rowValue.fullPath,
interpolation: { escapeValue: false }
}),
onOk: () => {
props.deleteItem(rowIndex)
}
})
} }
type="link"
/>
</Tooltip>
)
}

return (
<Box padding="mini">
<ButtonGroup
items={ buttons }
noSpacing
/>
</Box>
)
}
})

if (showActionsColumn) {
columns.push(actionsColumn)
}
})
)

return {
columns
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ export interface ManyToManyRelationClassDefinitionProps {
height: number | string | null
assetInlineDownloadAllowed?: boolean | null
onUpdateCellData?: (event: OnUpdateCellDataEvent) => void
hideOpenButton?: boolean
}

export interface ManyToManyRelationProps extends IRelationAllowedTypesDataComponent, ManyToManyRelationClassDefinitionProps {
Expand Down Expand Up @@ -115,7 +114,6 @@ export const ManyToManyRelation = ({ enableRowDrag = true, ...props }: ManyToMan
enrichRowData={ props.enrichRowData }
handleOrderChange={ onOrderChange }
height={ props.height }
hideOpenButton={ props.hideOpenButton }
hint={ props.hint }
inherited={ props.inherited }
onUpdateCellData={ handleUpdateCellData }
Expand Down
2 changes: 1 addition & 1 deletion assets/js/src/core/components/modal/modal.styles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export const useStyle = createStyles(({ token, css }) => {
display: inline-flex;
flex-direction: column;
align-items: start;
gap: ${token.marginXXS}px;
gap: ${token.marginSM}px;

.ant-modal-header {
margin-bottom: 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ export const DynamicGroupContent = ({ dynamicTypeRegistryId, id, showTitle = fal
), [memoizedValues, items, onDragEnd, sensors, dynamicTypeRegistryId])

return (
<Box padding={ { x: 'mini', y: 'extra-small' } }>
<Box padding={ { bottom: 'mini' } }>
<Space
className="w-full"
direction="vertical"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,6 @@ export const useStyles = createStyles(({ css, token }) => {
dynamicGroupItem: css`
background-color: ${token.colorFillAdditional};
border-radius: ${token.borderRadius}px;

.ant-form-item {
margin-bottom: 0;
}

.ant-form-item + .ant-form-item {
margin-top: ${token.marginXS}px;
}
`
}
})
3 changes: 1 addition & 2 deletions assets/js/src/core/components/pipeline/pipeline.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import { isEqual } from 'lodash'
export interface PipelineItem {
id: string
component: ReactNode
noDivider?: boolean
}

export interface PipelineProps {
Expand Down Expand Up @@ -70,7 +69,7 @@ const Pipeline = ({ items, value: baseValue, onChange }: PipelineProps): React.J
<div key={ item.id }>
{item.component}

{!isLastItem && item.noDivider !== true && (
{!isLastItem && (
<Divider
style={ { margin: 0 } }
theme='secondary'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@ import { createStyles } from '@Pimcore/modules/ant-design/styles/create-styles'
export const useStyles = createStyles(({ css, token }) => ({
dividerContainer: css`
position: relative;
min-width: 16px;
min-width: 24px;
outline: none;
padding-top: ${token.paddingXXS}px;
padding-bottom: ${token.paddingXXS}px;
`,

resizable: css`
Expand All @@ -26,9 +24,8 @@ export const useStyles = createStyles(({ css, token }) => ({
divider: css`
position: absolute;
left: 50%;
top: ${token.paddingXXS}px;
width: 1px;
height: calc(100% - ${token.paddingXXS * 2}px);
height: 100%;
overflow: hidden;
background-color: ${token.Divider.colorSplit};
`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,18 @@ export const useStyles = createStyles(({ token, css }) => {
return {
stackListItem: css`
border-radius: 4px;
border: 1px solid ${token.colorBorderSecondary};
border: 1px solid ${token.colorBorder};
background-color: ${token.colorBgContainer};

.stack-list-item__title {
display: flex;
align-items: center;
padding: 4px ${token.paddingXS}px 4px 0;
gap: 2px;
padding: 4px;
}

.stack-list-item__body {
padding: 0 ${token.paddingXS}px;
padding: 0 4px 4px 4px;

.ant-picker {
width: 100%;
Expand All @@ -34,15 +35,11 @@ export const useStyles = createStyles(({ token, css }) => {
.stack-list-item__content {
flex: 1;
min-width: 0; // allows the content to shrink and enables text ellipsis

.ant-tag {
margin-inline-end: 0;
}
}

&.stack-list-item {
.ant-collapse.ant-collapse-small>.ant-collapse-item>.ant-collapse-header {
padding: 0 ${token.paddingXS}px 0 0;
padding: 0;
}

.ant-collapse.collapse-item--theme-card-with-highlight.collapse-item--bordered, .ant-collapse.collapse-item--theme-default.collapse-item--bordered {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,11 @@ export const StackListItem = (props: StackListItemProps): React.JSX.Element => {
style={ style }
>
<CollapseItem
className={ styles.stackListItem }
contentPadding={ 'none' }
defaultActive={ defaultActive }
extra={ renderRightToolbar }
extraPosition='end'
hasContentSeparator={ false }
label={ <>{leftSidebarContent}</> }
size='small'
>
Expand Down
Loading
Loading