feat: add i18n to option labels in version comparison (#1477)
This commit is contained in:
@@ -0,0 +1,10 @@
|
|||||||
|
@import '../../../../../../scss/styles.scss';
|
||||||
|
|
||||||
|
.select-diff {
|
||||||
|
&__locale-label {
|
||||||
|
margin-right: base(.25);
|
||||||
|
background: var(--theme-elevation-100);
|
||||||
|
padding: base(.25);
|
||||||
|
border-radius: $style-radius-m;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import ReactDiffViewer, { DiffMethod } from 'react-diff-viewer';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import type { i18n as Ii18n } from 'i18next';
|
||||||
|
import Label from '../../Label';
|
||||||
|
import { diffStyles } from '../styles';
|
||||||
|
import { Props } from '../types';
|
||||||
|
import { getTranslation } from '../../../../../../../utilities/getTranslation';
|
||||||
|
import { OptionObject, SelectField } from '../../../../../../../fields/config/types';
|
||||||
|
|
||||||
|
import './index.scss';
|
||||||
|
|
||||||
|
const baseClass = 'select-diff';
|
||||||
|
|
||||||
|
const getOptionsToRender = (value: string, options: SelectField['options'], hasMany: boolean): string | OptionObject | (OptionObject | string)[] => {
|
||||||
|
if (hasMany && Array.isArray(value)) {
|
||||||
|
return value.map((val) => options.find((option) => (typeof option === 'string' ? option : option.value) === val));
|
||||||
|
}
|
||||||
|
return options.find((option) => (typeof option === 'string' ? option : option.value) === value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const getTranslatedOptions = (options: string | OptionObject | (OptionObject | string)[], i18n: Ii18n): string => {
|
||||||
|
if (Array.isArray(options)) {
|
||||||
|
return options.map((option) => (typeof option === 'string' ? option : getTranslation(option.label, i18n))).join(', ');
|
||||||
|
}
|
||||||
|
return typeof options === 'string' ? options : getTranslation(options.label, i18n);
|
||||||
|
};
|
||||||
|
|
||||||
|
const Select: React.FC<Props> = ({ field, locale, version, comparison, diffMethod }) => {
|
||||||
|
let placeholder = '';
|
||||||
|
const { t, i18n } = useTranslation('general');
|
||||||
|
|
||||||
|
if (version === comparison) placeholder = `[${t('noValue')}]`;
|
||||||
|
|
||||||
|
const comparisonToRender = typeof comparison !== 'undefined' ? getTranslatedOptions(getOptionsToRender(comparison, field.options, field.hasMany), i18n) : placeholder;
|
||||||
|
const versionToRender = typeof version !== 'undefined' ? getTranslatedOptions(getOptionsToRender(version, field.options, field.hasMany), i18n) : placeholder;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={baseClass}>
|
||||||
|
<Label>
|
||||||
|
{locale && (
|
||||||
|
<span className={`${baseClass}__locale-label`}>{locale}</span>
|
||||||
|
)}
|
||||||
|
{getTranslation(field.label, i18n)}
|
||||||
|
</Label>
|
||||||
|
<ReactDiffViewer
|
||||||
|
styles={diffStyles}
|
||||||
|
compareMethod={DiffMethod[diffMethod]}
|
||||||
|
oldValue={comparisonToRender}
|
||||||
|
newValue={typeof versionToRender !== 'undefined' ? versionToRender : placeholder}
|
||||||
|
splitView
|
||||||
|
hideLineNumbers
|
||||||
|
showDiffOnly={false}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Select;
|
||||||
@@ -3,6 +3,7 @@ import Nested from './Nested';
|
|||||||
import Iterable from './Iterable';
|
import Iterable from './Iterable';
|
||||||
import Relationship from './Relationship';
|
import Relationship from './Relationship';
|
||||||
import Tabs from './Tabs';
|
import Tabs from './Tabs';
|
||||||
|
import Select from './Select';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
text: Text,
|
text: Text,
|
||||||
@@ -11,14 +12,14 @@ export default {
|
|||||||
email: Text,
|
email: Text,
|
||||||
code: Text,
|
code: Text,
|
||||||
checkbox: Text,
|
checkbox: Text,
|
||||||
radio: Text,
|
radio: Select,
|
||||||
row: Nested,
|
row: Nested,
|
||||||
collapsible: Nested,
|
collapsible: Nested,
|
||||||
group: Nested,
|
group: Nested,
|
||||||
array: Iterable,
|
array: Iterable,
|
||||||
blocks: Iterable,
|
blocks: Iterable,
|
||||||
date: Text,
|
date: Text,
|
||||||
select: Text,
|
select: Select,
|
||||||
richText: Text,
|
richText: Text,
|
||||||
relationship: Relationship,
|
relationship: Relationship,
|
||||||
upload: Relationship,
|
upload: Relationship,
|
||||||
|
|||||||
@@ -50,6 +50,31 @@ const DraftPosts: CollectionConfig = {
|
|||||||
type: 'textarea',
|
type: 'textarea',
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'radio',
|
||||||
|
type: 'radio',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
value: 'test',
|
||||||
|
label: { en: 'Test en', es: 'Test es' },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'select',
|
||||||
|
type: 'select',
|
||||||
|
hasMany: true,
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
value: 'test1',
|
||||||
|
label: { en: 'Test1 en', es: 'Test1 es' },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'test2',
|
||||||
|
label: { en: 'Test2 en', es: 'Test2 es' },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,13 @@
|
|||||||
* - navigate to versions
|
* - navigate to versions
|
||||||
* - versions view accurately shows number of versions
|
* - versions view accurately shows number of versions
|
||||||
* - compare
|
* - compare
|
||||||
|
* - iterable
|
||||||
|
* - nested
|
||||||
|
* - relationship
|
||||||
|
* - select w/ i18n options (label: { en: 'example', ... })
|
||||||
|
* - tabs
|
||||||
|
* - text
|
||||||
|
* - richtext
|
||||||
* - restore version
|
* - restore version
|
||||||
* - specify locales to show
|
* - specify locales to show
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user