Skip to content

Commit 1223599

Browse files
authored
[codemod] Add pickers rename-default-toolbar-title-localeText codemod (#7752)
1 parent b7e10e7 commit 1223599

File tree

11 files changed

+165
-8
lines changed

11 files changed

+165
-8
lines changed

CHANGELOG.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,8 +1368,7 @@ We'd like to offer a big thanks to the 9 contributors who made this release poss
13681368
- The toolbar related translation keys have been renamed to better fit their usage:
13691369

13701370
```diff
1371-
// Same on all other pickers
1372-
<DatePicker
1371+
<LocalizationProvider
13731372
localeText={{
13741373
- datePickerDefaultToolbarTitle: 'Date Picker',
13751374
+ datePickerToolbarTitle: 'Date Picker',

docs/data/migration/migration-pickers-v5/migration-pickers-v5.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -479,11 +479,11 @@ For example, the `ToolbarComponent` has been replaced by a `Toolbar` component s
479479
/>
480480
```
481481

482-
- The toolbar related translation keys have been renamed to better fit their usage:
482+
- The toolbar related translation keys have been renamed to better fit their usage:
483483

484484
```diff
485-
<DatePicker
486-
localeText={{
485+
<LocalizationProvider
486+
localeText={{
487487
- datePickerDefaultToolbarTitle: 'Date Picker',
488488
+ datePickerToolbarTitle: 'Date Picker',
489489

@@ -495,7 +495,7 @@ For example, the `ToolbarComponent` has been replaced by a `Toolbar` component s
495495

496496
- dateRangePickerDefaultToolbarTitle: 'Date Range Picker',
497497
+ dateRangePickerToolbarTitle: 'Date Range Picker',
498-
}}
498+
}}
499499
/>
500500
```
501501

packages/x-codemod/README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ The list includes these transformers
9696
- [`replace-arrows-button-slot`](#replace-arrows-button-slot)
9797
- [`rename-should-disable-time`](#rename-should-disable-time)
9898
- [`rename-inputFormat-prop`](#rename-inputFormat-prop)
99+
- [`rename-default-toolbar-title-localeText`](#rename-default-toolbar-title-localeText)
99100

100101
#### `adapter-change-import`
101102

@@ -357,6 +358,29 @@ Replace `inputFormat` prop with `format`.
357358
npx @mui/x-codemod v6.0.0/pickers/rename-inputFormat-prop <path>
358359
```
359360

361+
#### `rename-default-toolbar-title-localeText`
362+
363+
Rename toolbar related translation keys, removing `Default` part from them to better fit their usage.
364+
365+
```diff
366+
<LocalizationProvider
367+
localeText={{
368+
- datePickerDefaultToolbarTitle: 'Date Picker',
369+
+ datePickerToolbarTitle: 'Date Picker',
370+
- timePickerDefaultToolbarTitle: 'Time Picker',
371+
+ timePickerToolbarTitle: 'Time Picker',
372+
- dateTimePickerDefaultToolbarTitle: 'Date Time Picker',
373+
+ dateTimePickerToolbarTitle: 'Date Time Picker',
374+
- dateRangePickerDefaultToolbarTitle: 'Date Range Picker',
375+
+ dateRangePickerToolbarTitle: 'Date Range Picker',
376+
}}
377+
/>
378+
```
379+
380+
```sh
381+
npx @mui/x-codemod v6.0.0/pickers/rename-default-toolbar-title-localeText <path>
382+
```
383+
360384
#### `rename-components-to-slots`
361385

362386
Renames the `components` and `componentsProps` props to `slots` and `slotProps`, respectively.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import type { Collection, JSCodeshift } from 'jscodeshift';
2+
3+
interface RenamePropsArgs {
4+
root: Collection<any>;
5+
componentNames: string[];
6+
nestedProps: Record<string, Record<string, any>>;
7+
j: JSCodeshift;
8+
}
9+
10+
export default function renameNestedProps({
11+
root,
12+
componentNames,
13+
nestedProps,
14+
j,
15+
}: RenamePropsArgs) {
16+
return root
17+
.find(j.JSXElement)
18+
.filter((path) => componentNames.includes((path.value.openingElement.name as any).name))
19+
.find(j.JSXAttribute)
20+
.filter((attribute) => Object.keys(nestedProps).includes(attribute.node.name.name as string))
21+
.forEach((attribute) => {
22+
Object.entries(nestedProps).forEach(([rootPropName, props]) => {
23+
if (
24+
attribute.node.name.name === rootPropName &&
25+
attribute.node.value?.type === 'JSXExpressionContainer' &&
26+
attribute.node.value?.expression.type === 'ObjectExpression'
27+
) {
28+
const existingProperties = attribute.node.value.expression.properties;
29+
existingProperties.forEach((property) => {
30+
if (
31+
property.type === 'Property' &&
32+
property.key.type === 'Identifier' &&
33+
props[property.key.name]
34+
) {
35+
property.key.name = props[property.key.name];
36+
}
37+
});
38+
}
39+
});
40+
});
41+
}

packages/x-codemod/src/v6.0.0/pickers/preset-safe/actual.spec.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ const theme = createTheme({});
1111
function App() {
1212
return (
1313
<ThemeProvider theme={theme}>
14-
<LocalizationProvider dateAdapter={DayjsUtils} locale="fr">
14+
<LocalizationProvider
15+
dateAdapter={DayjsUtils}
16+
locale="fr"
17+
localeText={{
18+
datePickerDefaultToolbarTitle: 'Pick a Date',
19+
}}
20+
>
1521
<CalendarPicker
1622
date={null}
1723
onChange={() => {}}

packages/x-codemod/src/v6.0.0/pickers/preset-safe/expected.spec.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ const theme = createTheme({});
1111
function App() {
1212
return (
1313
<ThemeProvider theme={theme}>
14-
<LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale="fr">
14+
<LocalizationProvider
15+
dateAdapter={AdapterDayjs}
16+
adapterLocale="fr"
17+
localeText={{
18+
datePickerToolbarTitle: 'Pick a Date',
19+
}}
20+
>
1521
<DateCalendar
1622
value={null}
1723
onChange={() => {}}

packages/x-codemod/src/v6.0.0/pickers/preset-safe/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import transformMigrateToComponentsComponentsProps from '../migrate-to-component
99
import transformReplaceArrowsButtonSlot from '../replace-arrows-button-slot';
1010
import transformRenameShouldDisableTime from '../rename-should-disable-time';
1111
import transformRenameInputFormatProp from '../rename-inputFormat-prop';
12+
import transformRenameDefaultToolbarTitleLocaleText from '../rename-default-toolbar-title-localeText';
1213

1314
import { JsCodeShiftAPI, JsCodeShiftFileInfo } from '../../../types';
1415

@@ -27,6 +28,7 @@ export default function transformer(file: JsCodeShiftFileInfo, api: JsCodeShiftA
2728
file.source = transformReplaceArrowsButtonSlot(file, api, options);
2829
file.source = transformRenameShouldDisableTime(file, api, options);
2930
file.source = transformRenameInputFormatProp(file, api, options);
31+
file.source = transformRenameDefaultToolbarTitleLocaleText(file, api, options);
3032

3133
return file.source;
3234
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<LocalizationProvider
2+
localeText={{
3+
start: 'Check-in',
4+
datePickerDefaultToolbarTitle: 'Pick a Date',
5+
timePickerDefaultToolbarTitle: 'Pick a Time',
6+
dateTimePickerDefaultToolbarTitle: 'Pick a Date and Time',
7+
dateRangePickerDefaultToolbarTitle: 'Pick a Date Range',
8+
}}
9+
>
10+
<DatePicker />
11+
</LocalizationProvider>;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<LocalizationProvider
2+
localeText={{
3+
start: 'Check-in',
4+
datePickerToolbarTitle: 'Pick a Date',
5+
timePickerToolbarTitle: 'Pick a Time',
6+
dateTimePickerToolbarTitle: 'Pick a Date and Time',
7+
dateRangePickerToolbarTitle: 'Pick a Date Range',
8+
}}
9+
>
10+
<DatePicker />
11+
</LocalizationProvider>;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import type { JsCodeShiftAPI, JsCodeShiftFileInfo } from '../../../types';
2+
import renameNestedProps from '../../../util/renameNestedProps';
3+
4+
const propsToRename = {
5+
localeText: {
6+
datePickerDefaultToolbarTitle: 'datePickerToolbarTitle',
7+
timePickerDefaultToolbarTitle: 'timePickerToolbarTitle',
8+
dateTimePickerDefaultToolbarTitle: 'dateTimePickerToolbarTitle',
9+
dateRangePickerDefaultToolbarTitle: 'dateRangePickerToolbarTitle',
10+
},
11+
};
12+
13+
export default function transformer(file: JsCodeShiftFileInfo, api: JsCodeShiftAPI, options: any) {
14+
const j = api.jscodeshift;
15+
const root = j(file.source);
16+
17+
const printOptions = options.printOptions || {
18+
quote: 'single',
19+
trailingComma: true,
20+
};
21+
22+
renameNestedProps({
23+
root,
24+
componentNames: ['LocalizationProvider'],
25+
nestedProps: propsToRename,
26+
j,
27+
});
28+
29+
return root.toSource(printOptions);
30+
}

0 commit comments

Comments
 (0)