Skip to content

Commit f247b57

Browse files
authored
1689 alphabetic permission selection (#3656)
* fix ordering of selected permissions alphabetically * add alphabetic ordering to all selected items * fix type issues * Automatic frontend build
1 parent 966ad83 commit f247b57

753 files changed

Lines changed: 30546 additions & 27 deletions

File tree

Some content is hidden

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

assets/js/src/core/modules/user/management/detail/tabs/settings/components/form/customisation-accordion.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ const CustomisationAccordion = ({ isAdmin, ...props }: ICustomisationAccordion):
3232
const { getRoleCollection } = useRoleHelper()
3333
const { getPerspectiveConfigCollection } = usePerspectives()
3434

35+
const sortByLabel = (values: Array<string | number>, options: Array<{ value: string | number, label: string }>): Array<string | number> => {
36+
const labelMap = new Map(options.map((o) => [o.value, o.label ?? '']))
37+
return [...values].sort((a, b) => (labelMap.get(a) ?? '').localeCompare(labelMap.get(b) ?? ''))
38+
}
39+
3540
useEffect(() => {
3641
if (perspectiveOptions.length === 0) {
3742
getPerspectiveConfigCollection().then((data) => {
@@ -118,6 +123,7 @@ const CustomisationAccordion = ({ isAdmin, ...props }: ICustomisationAccordion):
118123
<Form.Item
119124
label={ t('user-management.roles') }
120125
name="roles"
126+
normalize={ (values: Array<string | number>) => sortByLabel(values, roleOptions as Array<{ value: string | number, label: string }>) }
121127
>
122128
<Select
123129
mode="multiple"
@@ -129,6 +135,7 @@ const CustomisationAccordion = ({ isAdmin, ...props }: ICustomisationAccordion):
129135
<Form.Item
130136
label={ t('user-management.perspectives') }
131137
name="perspectives"
138+
normalize={ (values: Array<string | number>) => sortByLabel(values, perspectiveOptions as Array<{ value: string | number, label: string }>) }
132139
>
133140
<Select
134141
mode="multiple"

assets/js/src/core/modules/user/management/detail/tabs/settings/components/form/permissions-accordion.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ const PermissionsAccordion = ({ permissions, ...props }: IPermissionsAccordionPr
2828
label: t(`user-management.permissions.${permission.key}`)
2929
})
3030

31+
const sortByTranslatedLabel = (values: string[]): string[] => {
32+
return [...values].sort((a, b) =>
33+
t(`user-management.permissions.${a}`).localeCompare(t(`user-management.permissions.${b}`))
34+
)
35+
}
36+
3137
const content = [
3238
{
3339
key: '1',
@@ -36,6 +42,7 @@ const PermissionsAccordion = ({ permissions, ...props }: IPermissionsAccordionPr
3642
<>
3743
<Form.Item
3844
name="permissionsDefault"
45+
normalize={ sortByTranslatedLabel }
3946
>
4047
<Select
4148
dataTestId="permissions-select-default"
@@ -48,6 +55,7 @@ const PermissionsAccordion = ({ permissions, ...props }: IPermissionsAccordionPr
4855
</Form.Item>
4956
<Form.Item
5057
name="permissionsBundles"
58+
normalize={ sortByTranslatedLabel }
5159
>
5260
<Select
5361
dataTestId="permissions-select-bundles"

assets/js/src/core/modules/user/management/detail/tabs/settings/components/form/types-classes-accordion.tsx

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,21 @@ const TypesAndClassesAccordion = (): React.JSX.Element => {
2323
const { data: classesData, isLoading: classesLoading } = useClassDefinitionCollectionQuery()
2424
const { data: documentTypesData, isLoading: documentTypesLoading } = useDocumentDocTypeListQuery({})
2525

26+
const sortByLabel = (values: string[], options: Array<{ value: string, label: string }>): string[] => {
27+
const labelMap = new Map(options.map((o) => [o.value, o.label ?? '']))
28+
return [...values].sort((a, b) => (labelMap.get(a) ?? '').localeCompare(labelMap.get(b) ?? ''))
29+
}
30+
31+
const docTypeOptions: Array<{ label: string, value: string }> = documentTypesData?.items.map((item) => ({
32+
label: item.name ?? '',
33+
value: item.id
34+
})).sort((a, b) => a.label.localeCompare(b.label)) ?? []
35+
36+
const classOptions: Array<{ label: string, value: string }> = classesData?.items.map((item) => ({
37+
label: item.name ?? '',
38+
value: item.id
39+
})).sort((a, b) => a.label.localeCompare(b.label)) ?? []
40+
2641
const content = [
2742
{
2843
key: '1',
@@ -31,27 +46,23 @@ const TypesAndClassesAccordion = (): React.JSX.Element => {
3146
<>
3247
<Form.Item
3348
name="docTypes"
49+
normalize={ (values: string[]) => sortByLabel(values, docTypeOptions) }
3450
>
3551
<Select
3652
disabled={ documentTypesLoading }
3753
mode="multiple"
38-
options={ documentTypesData?.items.map((item) => ({
39-
label: item.name,
40-
value: item.id
41-
})).sort((a, b) => (a.label ?? '').localeCompare(b.label ?? '')) }
54+
options={ docTypeOptions }
4255
placeholder={ t('user-management.doc-types') }
4356
></Select>
4457
</Form.Item>
4558
<Form.Item
4659
name="classes"
60+
normalize={ (values: string[]) => sortByLabel(values, classOptions) }
4761
>
4862
<Select
4963
disabled={ classesLoading }
5064
mode="multiple"
51-
options={ classesData?.items.map((item) => ({
52-
label: item.name,
53-
value: item.id
54-
})).sort((a, b) => (a.label ?? '').localeCompare(b.label ?? '')) }
65+
options={ classOptions }
5566
placeholder={ t('user-management.classes') }
5667
></Select>
5768
</Form.Item>

assets/js/src/core/modules/user/management/detail/tabs/settings/settings-container.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ const SettingsContainer = ({ ...props }): React.JSX.Element => {
6464
allowDirtyClose: openedUser?.allowDirtyClose,
6565
closeWarning: openedUser?.closeWarning,
6666
roles: openedUser?.roles ?? [],
67-
permissionsDefault: Array.isArray(openedUser?.permissions) ? openedUser.permissions.filter((permission) => permissions.default.some((defaultPermission) => defaultPermission.key === permission)) : [],
68-
permissionsBundles: Array.isArray(openedUser?.permissions) ? openedUser.permissions.filter((permission) => permissions.bundles.some((defaultPermission) => defaultPermission.key === permission)) : []
67+
permissionsDefault: Array.isArray(openedUser?.permissions) ? openedUser.permissions.filter((permission) => permissions.default.some((defaultPermission) => defaultPermission.key === permission)).sort((a, b) => t(`user-management.permissions.${a}`).localeCompare(t(`user-management.permissions.${b}`))) : [],
68+
permissionsBundles: Array.isArray(openedUser?.permissions) ? openedUser.permissions.filter((permission) => permissions.bundles.some((defaultPermission) => defaultPermission.key === permission)).sort((a, b) => t(`user-management.permissions.${a}`).localeCompare(t(`user-management.permissions.${b}`))) : []
6969
})
7070
}
7171
}, [openedUser, isLoading, permissions])

assets/js/src/core/modules/user/management/detail/tabs/workspaces/components/special-settings.tsx

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,26 @@ const SpecialSettings = ({ localizedView, localizedEdit, layouts, onValuesChange
3535

3636
const [form] = Form.useForm()
3737

38+
const languageOptions: Array<{ value: string, label: string }> = validLanguages.map((lang: string) => ({
39+
value: lang,
40+
label: getDisplayName(lang) ?? lang
41+
})).sort((a, b) => a.label.localeCompare(b.label))
42+
43+
const layoutOptions: Array<{ value: string, label: string }> = data?.items.map((layout) => ({
44+
value: layout.id,
45+
label: layout.name ?? ''
46+
})).sort((a, b) => a.label.localeCompare(b.label)) ?? []
47+
48+
const sortByLabel = (values: string[], options: Array<{ value: string, label: string }>): string[] => {
49+
const labelMap = new Map(options.map((o) => [o.value, o.label ?? '']))
50+
return [...values].sort((a, b) => (labelMap.get(a) ?? '').localeCompare(labelMap.get(b) ?? ''))
51+
}
52+
3853
useEffect(() => {
3954
form.setFieldsValue({
40-
localizedView,
41-
localizedEdit,
42-
layouts
55+
localizedView: sortByLabel(localizedView, languageOptions),
56+
localizedEdit: sortByLabel(localizedEdit, languageOptions),
57+
layouts: sortByLabel(layouts, layoutOptions)
4358
})
4459
}, [])
4560

@@ -64,27 +79,23 @@ const SpecialSettings = ({ localizedView, localizedEdit, layouts, onValuesChange
6479
<Form.Item
6580
label={ t('user-management.workspaces.localized-fields.view') }
6681
name="localizedView"
82+
normalize={ (values: string[]) => sortByLabel(values, languageOptions) }
6783
>
6884
<Select
6985
mode="multiple"
70-
options={ validLanguages.map((lang: string) => ({
71-
value: lang,
72-
label: getDisplayName(lang)
73-
})).sort((a, b) => (a.label ?? 'UNKNOWN').localeCompare(b.label ?? 'UNKNOWN')) }
86+
options={ languageOptions }
7487
placeholder={ t('user-management.workspaces.localized-fields.view') }
7588
></Select>
7689
</Form.Item>
7790

7891
<Form.Item
7992
label={ t('user-management.workspaces.localized-fields.edit') }
8093
name="localizedEdit"
94+
normalize={ (values: string[]) => sortByLabel(values, languageOptions) }
8195
>
8296
<Select
8397
mode="multiple"
84-
options={ validLanguages.map((lang: string) => ({
85-
value: lang,
86-
label: getDisplayName(lang)
87-
})).sort((a, b) => (a.label ?? 'UNKNOWN').localeCompare(b.label ?? 'UNKNOWN')) }
98+
options={ languageOptions }
8899
placeholder={ t('user-management.workspaces.localized-fields.edit') }
89100
></Select>
90101
</Form.Item>
@@ -105,13 +116,11 @@ const SpecialSettings = ({ localizedView, localizedEdit, layouts, onValuesChange
105116
children: <Form.Item
106117
label={ t('user-management.workspaces.custom-layouts.select') }
107118
name="layouts"
119+
normalize={ (values: string[]) => sortByLabel(values, layoutOptions) }
108120
>
109121
<Select
110122
mode="multiple"
111-
options={ data?.items.map((layout) => ({
112-
value: layout.id,
113-
label: layout.name
114-
})).sort((a, b) => (a.label ?? '').localeCompare(b.label ?? '')) }
123+
options={ layoutOptions }
115124
placeholder={ t('user-management.workspaces.custom-layouts.select') }
116125
></Select>
117126
</Form.Item>

assets/js/src/core/modules/user/roles/detail/tabs/settings/components/form/general-accordion.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ const GeneralAccordion = (): React.JSX.Element => {
4545
}
4646
}, [id])
4747

48+
const sortByLabel = (values: any[]): any[] => {
49+
const labelMap = new Map(perspectiveOptions.map((o) => [o.value, o.label ?? '']))
50+
return [...values].sort((a, b) => (labelMap.get(a) ?? '').localeCompare(labelMap.get(b) ?? ''))
51+
}
52+
4853
const content = [
4954
{
5055
key: '1',
@@ -54,6 +59,7 @@ const GeneralAccordion = (): React.JSX.Element => {
5459
<Form.Item
5560
label={ t('user-management.perspectives') }
5661
name="perspectives"
62+
normalize={ sortByLabel }
5763
>
5864
<Select
5965
mode="multiple"

assets/js/src/core/modules/user/roles/detail/tabs/settings/settings-container.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ import { useSettings } from '@Pimcore/modules/app/settings/hooks/use-settings'
2222
import { useRoleDraft } from '@Pimcore/modules/user/roles/hooks/use-roles-draft'
2323
import { getGroupedPermissions } from '@Pimcore/modules/user/management/detail/tabs/settings/settings-helper'
2424
import { useUserManagementHelper } from '@Pimcore/modules/user/hooks/use-user-management-helper'
25+
import { useTranslation } from 'react-i18next'
2526

2627
const SettingsContainer = ({ ...props }): React.JSX.Element => {
28+
const { t } = useTranslation()
2729
const { validLanguages } = useSettings()
2830
const [form] = Form.useForm()
2931
const { id } = useRoleContext()
@@ -38,8 +40,8 @@ const SettingsContainer = ({ ...props }): React.JSX.Element => {
3840
classes: role?.classes ?? [],
3941
docTypes: role?.docTypes,
4042
perspectives: role?.perspectives ?? [],
41-
permissionsDefault: Array.isArray(role?.permissions) ? role.permissions.filter((permission) => permissions.default.some((defaultPermission) => defaultPermission.key === permission)) : [],
42-
permissionsBundles: Array.isArray(role?.permissions) ? role.permissions.filter((permission) => permissions.bundles.some((defaultPermission) => defaultPermission.key === permission)) : []
43+
permissionsDefault: Array.isArray(role?.permissions) ? role.permissions.filter((permission) => permissions.default.some((defaultPermission) => defaultPermission.key === permission)).sort((a, b) => t(`user-management.permissions.${a}`).localeCompare(t(`user-management.permissions.${b}`))) : [],
44+
permissionsBundles: Array.isArray(role?.permissions) ? role.permissions.filter((permission) => permissions.bundles.some((defaultPermission) => defaultPermission.key === permission)).sort((a, b) => t(`user-management.permissions.${a}`).localeCompare(t(`user-management.permissions.${b}`))) : []
4345
})
4446
}
4547
}, [role, isLoading])

public/build/ceded516-0636-4197-beae-ad757b75f41f/documentEditorIframe.html

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/build/ceded516-0636-4197-beae-ad757b75f41f/entrypoints.json

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/build/ceded516-0636-4197-beae-ad757b75f41f/exposeRemote.js

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)