Skip to content

Commit 4df09b3

Browse files
[Data Object Grid][Advanced columns] Add improvements (#2322)
* added the useTransformersMenuItems hook * added the translations * updated the useTransformersMenuItems by adding the fallback for groupping * Automatic frontend build * added the group prop inside the dyn types * updated the DynamicGroupDropdown * updated the type * fixed the Sonar error * Automatic frontend build --------- Co-authored-by: ValeriaMaltseva <[email protected]>
1 parent 37117fd commit 4df09b3

File tree

708 files changed

+22597
-16
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

708 files changed

+22597
-16
lines changed

assets/js/src/core/components/pipeline/item/dynamic-group/dynamic-group-dropdown.tsx

Lines changed: 65 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,27 @@
88
* @license Pimcore Open Core License (POCL)
99
*/
1010

11+
import React from 'react'
12+
import { isNil, isNull } from 'lodash'
13+
import { type MenuProps } from 'antd'
14+
import { useTranslation } from 'react-i18next'
1115
import { useInjection } from '@Pimcore/app/depency-injection'
12-
import { Dropdown, type DropdownProps } from '@Pimcore/components/dropdown/dropdown'
16+
import { Dropdown } from '@Pimcore/components/dropdown/dropdown'
1317
import { useNumberedList } from '@Pimcore/components/form/controls/numbered-list/provider/numbered-list/use-numbered-list'
1418
import { type DynamicTypePipelineRegistry } from '@Pimcore/modules/element/dynamic-types/definitions/pipelines/dynamic-type-pipeline-registry'
15-
import React from 'react'
1619
import { usePipelineConfig } from '../../provider/pipeline-config/use-pipeline-config'
1720
import { type DynamicTypePipelineAbstract } from '@Pimcore/modules/element/dynamic-types/definitions/pipelines/dynamic-type-pipeline-abstract'
18-
import { useTranslation } from 'react-i18next'
1921

2022
export interface DynamicGroupDropdownProps {
2123
children: React.ReactNode
2224
dynamicTypeRegistryId: string
2325
}
2426

27+
interface IGroupedTree {
28+
dynamicTypes?: DynamicTypePipelineAbstract[]
29+
[groupKey: string]: any
30+
}
31+
2532
export const DynamicGroupDropdown = ({ children, dynamicTypeRegistryId }: DynamicGroupDropdownProps): React.JSX.Element => {
2633
const registry = useInjection<DynamicTypePipelineRegistry>(dynamicTypeRegistryId)
2734
const { operations } = useNumberedList()
@@ -32,22 +39,65 @@ export const DynamicGroupDropdown = ({ children, dynamicTypeRegistryId }: Dynami
3239
return dynamicType.isAvailableForSelection(config)
3340
})
3441

35-
const items: DropdownProps['menu']['items'] = availableDynamicTypes.map((dynamicType) => ({
36-
key: dynamicType.id,
37-
label: t(`grid.advanced-column.advancedColumns.${dynamicType.id}`),
38-
onClick: () => {
39-
operations.add({
40-
key: dynamicType.id
42+
const groupedTree: IGroupedTree = {}
43+
44+
availableDynamicTypes.forEach(dynamicType => {
45+
let groupId: string[] = []
46+
47+
if (!isNull(dynamicType.group)) {
48+
if (Array.isArray(dynamicType.group)) {
49+
groupId = dynamicType.group
50+
} else {
51+
groupId = [dynamicType.group]
52+
}
53+
}
54+
55+
let currentLevel = groupedTree
56+
57+
groupId.forEach(groupKey => {
58+
if (isNil(currentLevel[groupKey])) {
59+
currentLevel[groupKey] = {}
60+
}
61+
62+
currentLevel = currentLevel[groupKey]
63+
})
64+
65+
if (isNil(currentLevel.dynamicTypes)) {
66+
currentLevel.dynamicTypes = []
67+
}
68+
69+
currentLevel.dynamicTypes.push(dynamicType)
70+
})
71+
72+
const buildMenuItemsFromTree = (group: IGroupedTree): NonNullable<MenuProps['items']> => {
73+
const items: NonNullable<MenuProps['items']> = []
74+
75+
if (!isNil(group.dynamicTypes)) {
76+
group.dynamicTypes.forEach(dynamicType => {
77+
items.push({
78+
key: dynamicType.id,
79+
label: t(`grid.advanced-column.advancedColumns.${dynamicType.id}`),
80+
onClick: () => { operations.add({ key: dynamicType.id }) }
81+
})
4182
})
4283
}
43-
}))
84+
85+
Object.entries(group).forEach(([groupKey, childNode]) => {
86+
if (groupKey === 'dynamicTypes') return
87+
items.push({
88+
key: `${groupKey}-group`,
89+
label: t(`grid.advanced-column.advancedColumns.group.${groupKey}`),
90+
children: buildMenuItemsFromTree(childNode as IGroupedTree)
91+
})
92+
})
93+
94+
return items
95+
}
96+
97+
const items = buildMenuItemsFromTree(groupedTree)
4498

4599
return (
46-
<Dropdown
47-
menu={ {
48-
items
49-
} }
50-
>
100+
<Dropdown menu={ { items } }>
51101
{children}
52102
</Dropdown>
53103
)

assets/js/src/core/modules/element/dynamic-types/definitions/pipelines/dynamic-type-pipeline-abstract.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { type ReactElement } from 'react'
1515
@injectable()
1616
export abstract class DynamicTypePipelineAbstract implements DynamicTypeAbstract {
1717
abstract readonly id: string
18+
readonly group: string | string[] | null = null
1819

1920
abstract getComponent (): ReactElement
2021

assets/js/src/core/modules/element/dynamic-types/definitions/pipelines/grid/source-fields/components/simple-field/simple-field.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ export const DynamicTypePipelineGridSourceFieldsSimpleFieldComponent = (): React
3434
label={ t('field') }
3535
name={ 'field' }
3636
>
37-
<Select options={ sourceFieldOptions } />
37+
<Select
38+
options={ sourceFieldOptions }
39+
showSearch
40+
/>
3841
</Form.Item>
3942
)
4043
}

assets/js/src/core/modules/element/dynamic-types/definitions/pipelines/grid/transformers/types/anonymizer/anonymizer.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { DynamicTypePipelineGridTransformersAnonymizerComponent } from '@Pimcore
1616
@injectable()
1717
export class DynamicTypePipelineGridTransformersAnonymizer extends DynamicTypePipelineAbstract {
1818
readonly id = 'anonymizer'
19+
readonly group = 'string'
1920

2021
getComponent (): ReactElement {
2122
return (

assets/js/src/core/modules/element/dynamic-types/definitions/pipelines/grid/transformers/types/blur/blur.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { DynamicTypePipelineGridTransformersBlurComponent } from '@Pimcore/modul
1616
@injectable()
1717
export class DynamicTypePipelineGridTransformersBlur extends DynamicTypePipelineAbstract {
1818
readonly id = 'blur'
19+
readonly group = 'string'
1920

2021
getComponent (): ReactElement {
2122
return (

assets/js/src/core/modules/element/dynamic-types/definitions/pipelines/grid/transformers/types/boolean-formatter/boolean-formatter.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { DynamicTypePipelineGridTransformersBooleanFormatterComponent } from '@P
1616
@injectable()
1717
export class DynamicTypePipelineGridTransformersBooleanFormatter extends DynamicTypePipelineAbstract {
1818
readonly id = 'booleanFormatter'
19+
readonly group = 'boolean'
1920

2021
getComponent (): ReactElement {
2122
return (

assets/js/src/core/modules/element/dynamic-types/definitions/pipelines/grid/transformers/types/change-case/change-case.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { injectable } from 'inversify'
1616
@injectable()
1717
export class DynamicTypePipelineGridTransformersChangeCase extends DynamicTypePipelineAbstract {
1818
readonly id = 'caseChange'
19+
readonly group = 'string'
1920

2021
getComponent (): ReactElement {
2122
return (

assets/js/src/core/modules/element/dynamic-types/definitions/pipelines/grid/transformers/types/combine/combine.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { DynamicTypePipelineGridTransformersCombineComponent } from '../../compo
1616
@injectable()
1717
export class DynamicTypePipelineGridTransformersCombine extends DynamicTypePipelineAbstract {
1818
readonly id = 'combine'
19+
readonly group = 'string'
1920

2021
getComponent (): ReactElement {
2122
return (

assets/js/src/core/modules/element/dynamic-types/definitions/pipelines/grid/transformers/types/date-formatter/date-formatter.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { DynamicTypePipelineGridTransformersDateFormatterComponent } from '@Pimc
1616
@injectable()
1717
export class DynamicTypePipelineGridTransformersDateFormatter extends DynamicTypePipelineAbstract {
1818
readonly id = 'dateFormatter'
19+
readonly group = 'date'
1920

2021
getComponent (): ReactElement {
2122
return (

assets/js/src/core/modules/element/dynamic-types/definitions/pipelines/grid/transformers/types/element-counter/element-counter.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { DynamicTypePipelineAbstract } from '../../../../dynamic-type-pipeline-a
1515
@injectable()
1616
export class DynamicTypePipelineGridTransformersElementCounter extends DynamicTypePipelineAbstract {
1717
readonly id = 'elementCounter'
18+
readonly group = 'other'
1819

1920
getComponent (): ReactElement {
2021
return <></>

0 commit comments

Comments
 (0)