-
Notifications
You must be signed in to change notification settings - Fork 54
BREAKING CHANGE until 2.0.0
We planned to merge the following PR with breaking changes:
- PR: feat(TUI-298): update headings font size
- PR: feat(CMF/TUI-305): omitCMFProps is the default now
- PR: chore(CMF/TUI-271): extract router as cmfModule
how to pre release:
-
update all corresponding PRs with master
-
create a
tmp/ui-2-pre-release
branch from master -
merge the following branch in it
-
jmfrancois/chore/tui-271-router
-
jmfrancois/feat/cmf/omit-props-default-true
-
jmfrancois/feat/tui-298-heading-font-size
then at the root:
yarn
-
npm run publish
(select major pre release)
- Component: ObjectViewer
- PR: feat(ObjectViewer): improve a11y
- Changes: This impacts only the component. If you use the cmf container, it works as expected.
Before | After | Explanation |
---|---|---|
props.onMouseOver |
- | Not accessible. This would introduce performance issues with keyboad navigation. But this is not used, so let's remove it. |
props.onSelect(event, jsonpath) |
props.onSelect(event, { jsonpath }) |
This simplifies the code. This is triggered through TreeGesture HOC that takes an item and pass it through to the props callback. This is simple and compatible with TreeView and the new ObjectViewer apis. |
- | Required props.onToggleAllSiblings(event, siblings)
|
This is for accessibility. It is triggered on * keydown to expand all the nodes at the same level |
has been removed. |
Before
import ObjectViewer from '@talend/react-components/lib/ObjectViewer';
class MyComponent extends React.Component {
...
mouseOverHandler(event, item) {}
selectHandler(event, jsonpath) {}
render() {
return (
<ObjectViewer
onMouseOver={this.mouseOverHandler}
onSelect=(this.selectHandler}
...
/>
);
}
}
After
import ObjectViewer from '@talend/react-components/lib/ObjectViewer';
class MyComponent extends React.Component {
...
selectHandler(event, jsonpath) {}
toggleAllHandler(event, itemsToToggle) {}
render() {
return (
<ObjectViewer
onSelect=(this.selectHandler}
onToggleAllSiblings={this.toggleAllHandler}
...
/>
);
}
}
- Component : Container/HeaderBar
- PR fix(Container) HeaderBar API remote response handling
- Changes : Backend response has changed, adaptation were needed to handle the response and properly inject data into the component.
Before (backend response)
[
{
"name": "Management Console",
"uri": "https://www.talend.com/products#tmc",
"icon": "tmc"
},
...
]
After
[
{
"id": "TMC",
"name": "Management Console",
"url": "https://www.talend.com/products#tmc",
"icon": "tmc"
},
...
]
- Component: UIForm
- PR feat(forms/conditions/TCOMP-1029): add jsonLogic condition
- Changes: conditions expression for widget rendering is now based on http://jsonlogic.com/
{
values: [undefined],
path: 'undefined',
}
After:
{
'==': [{ var: 'undefined' }, undefined],
}
- Component: Treeview
- PR: feat(component/TabBar): improve a11y and feat(ObjectViewer): improve a11y
- Changes: This impacts only the component. If you use the cmf container, it works as expected.
Before | After | Explanation |
---|---|---|
props.onClick |
props.onToggle |
This api was awful, ask anyone when is it triggered (select/toggle ?) |
props.structure[].selected |
props.selectedId |
|
props.structure[].toggled |
props.structure[].isOpened |
Toggle means the switch of a 2-state element. Toggled is not explicit at all (opened/closed/depending-on-initial-state ?) |
onToggle/onSelect (item) |
onToggle/onSelect (event, item) |
This is to align the apis so we can wrap them with the same HOC as ObjectViewer for gesture |
- | Required props.onToggleAllSiblings(event, siblings)
|
This is for accessibility. It is triggered on * keydown to expand all the nodes at the same level |
Before
import TreeView from '@talend/react-components/lib/TreeView'
class MyComponent extends React.Component {
...
toggleHandler(item) {}
selectHandler(item) {}
render() {
const structure = [{ id: 'first', name: 'awesome folder', selected: true, toggled: true }];
return (
<TreeView
structure={structure}
onClick={this.toggleHandler}
onSelect={this.selectHandler}
...
/>
);
}
}
After
import TreeView from '@talend/react-components/lib/TreeView'
class MyComponent extends React.Component {
...
toggleHandler(event, item) {}
toggleAllHandler(event, itemsToToggle) {}
selectHandler(event, item) {}
render() {
const structure = [{ id: 'first', name: 'awesome folder', isOpened: true }];
return (
<TreeView
structure={structure}
selectedId={'first'}
onToggle={this.toggleHandler}
onToggleAllSiblings={this.toggleAllHandler}
onSelect={this.selectHandler}
...
/>
);
}
}
- Component: TabBar
- PR: feat(component/TabBar): improve a11y
- Changes:
Change 1:
The component was only a bar, with buttons, but not anymore. It takes a props.children to properly place it in the selected tab panel.
Before
<TabBar items={items} selectedKey={selectedKey} ... />
{items.map(({ item, index }) => {
if (selectedKey !== item.key) {
return null;
}
return (
<div key={index} aria-describedby={item.id}>
My Tab {item.label} content
</div>
);
})}
After
const selectedItem = items.find(item => selectedKey === item.key);
<TabBar items={items} selectedKey={selectedKey} ... >
My Tab {selectedItem.label} content
</TabBar
Change 2:
TabBar doesn't pass items id anymore. They are generated based on the id passed to TabBar.
Before
const items = [
{ id: 'my-custom-tab-1', key: '1', label: 'Tab 1' },
{ id: 'my-custom-tab-2', key: '2', label: 'Tab 2' },
{ id: 'my-custom-tab-3', key: '3', label: 'Tab 3' },
];
<TabBar items={items} ... />
After
const items = [
{ key: '1', label: 'Tab 1' },
{ key: '2', label: 'Tab 2' },
{ key: '3', label: 'Tab 3' },
];
<TabBar id="my-custom" items={items} ... />
Note:
If you still want to manage the panels outside, you can still generate the tab ids to match your panels aria-describedby
.
function generateChildId(key, kind) {
if (kind === 'tab') {
return `my-custom-id-${key}`;
}
return null;
}
<TabBar items={items} generateChildId={generateChildId} ... />
- Forms: UIForm
- PR: chore(UIForms): enhance uischema condition format
- Changes:
conditions
uiSchema entry is now an object supporting recursivity.
- Component: PieChartIcon
- PR: feat(PieChart): improve a11y
- Changes:
Extra props provided to the component are now spread on the svg element, not the span container.
Example:
import PieChart from '@talend/react-components/lib/PieChart';
<PieChart aria-label='My text alternative' />
Before
<span arial-label='My text alternative'>
<svg></svg>
<span></span>
</span>
After
<span>
<svg arial-label='My text alternative'></svg>
<span></span>
</span>
- Container: SubHeaderBar
- PR: feat(containers/editabletext): create container #1601
- Changes:
editMode
flag is no longer managed by the SubHeaderBar container, but by the new EditableText container. The getEditMode
selector has been removed.
- Component: cmfConnect
- PR: chore(TUI-142/cmf): remove deprecated getCollection #1408
- Changes:
Remove it from CMF.
Before
function MyComponent(props) {
return <ul>{props.getCollection('foo').map((item, key) => <li key={key}>item.get('label')</li>}</ul>
}
export default cmfConnect({})(MyComponent);
After
function MyComponent(props) {
return <ul>{props.foo.map((item, key) => <li key={key}>item.get('label')</li>}</ul>
}
function mapStateToProps(state) {
return { foo: state.cmf.collections.get('foo') };
}
export default cmfConnect({ mapStateToProps })(MyComponent);
- Component: TreeView
- PR: chore(components/treeview): remove deprecated code
- Changes
Props | Status | Alternative |
---|---|---|
itemSelectCallback | Removed | onSelect |
itemToggleCallback | Removed | onClick |
- Theme: Navbar
- PR: fix(theme/navbar): buttons line-height
- Changes : Navbar must contains
.btn.btn-link
in order to preserve line-height and to display icons correctly
- Component: Notification
- PR: chore: react-addons-css-transition-group to react-transition-group
- Changes : Notification component needs
react-transition-group
instead ofreact-addons-css-transition-group
to work. You need to update your app dependencies
Before :
{
"dependencies": {
"react-addons-css-transition-group": "15.6.2"
}
}
After :
{
"dependencies": {
"react-transition-group": "^2.3.1"
}
}
- Package: CMF
- PR: chore(cmf): simplify imports
- Changes : You can't import api anymore.
Before:
import { api } from '@talend-react-cmf';
After:
import api from '@talend-react-cmf';
A codemode has been provided by the PR:
cd ui/scripts/cmf
yarn
jscodeshift -t api_to_index.js ../../../YOUR_SRC_FOLDER
- Component: Forms
- PR: chore: upgrade react-jsonschema-form
- Changes : we upgraded react-jsonSchema-form to 1.0.0. They switched their validation to ajv (https://github.com/mozilla-services/react-jsonschema-form/releases/tag/v1.0.0). The boolean required property is invalid This is conform to json schema spec
Before
{
"jsonSchema": {
"title": "Form with live validation",
"type": "object",
"properties": {
"name": {
"title": "Name",
"type": "string",
"minLength": 3,
"required": true
},
"email": {
"title": "Email",
"type": "string",
"pattern": "^\\S+@\\S+$",
"minLength": 5,
"required": true
}
}
}
}
After
{
"jsonSchema": {
"title": "Form with live validation",
"type": "object",
"required": ["name", "email"],
"properties": {
"name": {
"title": "Name",
"type": "string",
"minLength": 3
},
"email": {
"title": "Email",
"type": "string",
"pattern": "^\\S+@\\S+$",
"minLength": 5
}
}
}
}
- component: Form (in packages/forms)
- PR: https://github.com/Talend/ui/pull/1282
- Changes:
Adapt the component Form.js to call onChange and onSubmit with the same number of parameter as UIForm component. First is the event or null (we don't have the event with RJSF).
Function | Before | After |
---|---|---|
onChange | props.onChange(...args) |
props.onChange(null, ...args) |
onSubmit | props.onSubmit(changes) |
props.onSubmit(null, changes) |
- icons
- PR: feat: delete deprecated logo-(dp|ic|mc).svg
- Changes:
Icon | Changes |
---|---|
logo-dp | Removed. Use `tdp-(colored |
logo-ic | Removed. Use `tic-(colored |
logo-mc | Removed. Use `tmc-(colored |
- component: ActionDropdown
- PR: https://github.com/Talend/ui/pull/1207
- Changes:
on settings, the actionCreator's props or payload is not supported anymore.
Before | After |
---|---|
actionCreator:'myactionCreator' | onClickActionCreator:'myactionCreator' |
- component: Dialog
- PR: fix(components/Dialog): spread props
- Changes:
Before | After |
---|---|
props.bsDialogProps | all props are just spread to the Modal component |
Before
const bsDialogProps = {
dialogClassName: 'tmc-conductor-dialog',
keyboard: true,
onHide: dispatchProps.cancelItemsRemove,
};
return <Dialog bsDialogProps={bsDialogProps}/>
after
const bsDialogProps = {
dialogClassName: 'tmc-conductor-dialog',
keyboard: true,
onHide: dispatchProps.cancelItemsRemove,
};
return <Dialog {...bsDialogProps} />
(#1172) adding additional headers from middleware configuration. Before the action headers replaced the default one (if passed), since that PR they are spreaded. One of the issue you might encountered is that the Content-Type attribute in the default header is not overriden anymore so your request which uses formData might not work anymore. Since the Content-Type needs to be left empty in order for the browser to fill all related headers, there's no workaround if you encountered this issue, (#1210) will fix that issue and remove the Content-Type in case there's a formData passed (just like in sagas/http.js).
(#1156) have change the modal CSS to align it to guideline. If you have custom CSS or if you import some of the file directly it can be broken:
@talend/react-components/src/ConfirmDialog/ConfirmDialog.scss
has been deleted
- component: HeaderBar
- PR: feat(components/HeaderBar): app switcher in brand section
- Changes:
App switcher is now in Brand section. If you have an app switcher (props.product
), avoid passing props.brand.onClick
. In that case you'll have the onClick execution everytime you open the app switcher.
You may have issue in your tests with bootstrap component. Before:
import { NavItem } from '@talend/react-components';
import { NavItem as BootstrapNavItem } from '@talend/react-components';
NavItem === BootstrapNavItem; // true
After
import { NavItem } from '@talend/react-components';
import { NavItem as BootstrapNavItem } from '@talend/react-components';
import wrap from '@talend/react-components/lib/wrap'
;
NavItem === BootstrapNavItem; // false
NavItem === wrap(BootstrapNavItem, 'NavItem'); // true
- component: Action
- PR: fix(Action): use the new Inject API
- Changes:
Before | After |
---|---|
props.renderers | props.getComponent |
props.name | no more resolve use actionId or componentId with "props" settings |
props.available as string | not supported anymore use props.availableExpression |
props.active as string | not supported anymore use props.activeExpression |
props.disabled as string | not supported anymore use props.disabledExpression |
props.inProgress as string | not supported anymore use props.inProgressExpression |
- icon: AWS-kinesis
- PR: chore(icons): update AWS-kinesis.svg
- Change: name change
Before
AWS-kinesis.svg
After
aws-kinesis.svg
- Typeahead: new flag to manage the display mode
- PR: fix(components/typeahead): use a flag for the display mode
- Change: flag instead of onToggle presence
Before
<Typeahead onToggle={func} /> // button
<Typeahead onToggle={undefined} /> // input
After
<Typeahead onToggle={func} docked /> // button
<Typeahead onToggle={func} /> // input
-
docked === true && onToggle !== undefined
: the toggle button is displayed -
docked !== true || onToggle === undefined
: the typeahead input is displayed
- Component: TabBar
- PR: fix(components/tabbar): rename selected property
- Change:
selected
has been renamed byselectedKey
Before | After |
---|---|
props.selected | props.selectedKey |
- Component: Drawer
- PR: fix(components/tabbar): rename selected property
- Change:
selected
has been renamed byselectedKey
for drawer's tabs
Before | After |
---|---|
props.tabs.selected | props.tabs.selectedKey |
- Component: Layout
- PR: fix(components/tabbar): rename selected property
- Change:
selected
has been renamed byselectedKey
for layout's tabs
Before | After |
---|---|
props.tabs.selected | props.tabs.selectedKey |
- cmf: route onLeave/onEnter
- PR: feat(cmf): route onEnter/onLeave with dispatch
- Change: onEnter/onLeave arguments have changed
Before
function onEnter(nextState, replace) { }
function onLeave(nextState, replace) { }
After
function onEnter(router, dispatch)
{ const { nextState, replace } = router; }
function onLeave(router, dispatch) { }
- cmf: selectors
- PR: https://github.com/Talend/ui/pull/1055
- Change: move to collections
name | new location |
---|---|
getCollectionFromPath | selectors.collections.find |
findCollectionPathListItem | selectors.collections.findListItem |
-
cmf: putActionCreator
-
Change: move from api.saga.putActionCreator to api.sagas.putActionCreator
-
Container: DeleteResource
-
Changes: deleteResource Saga params has changed
name | change |
---|---|
+ sagaParams | object spread to get uri / resource type / redirectUrl / resourcePath & routerParamsAttribute |
- uri | moved in object param |
- resourceType | moved in object param |
- resourcePath | moved in object param |
- Component: SubHeaderBar
- PR: https://github.com/Talend/ui/pull/1041
- Changes: props components has change
name | change |
---|---|
props.components | replaced by the new Inject API |
props.left | added with the same API has the ActionBar |
props.center | added with the same API has the ActionBar |
props.right | added with the same API has the ActionBar |
Check the component doc Check the Inject component doc
- Component: HeaderBar
- PR: https://github.com/Talend/ui/pull/1037
- Changes: Items in help dropdown are moved to information dropdown
- CMF: cmfConnect
- PR: https://github.com/Talend/ui/pull/1046
- Changes: Spread viewProps in mapStateToProps
Spread viewProps when calling mapStateToProps so more stuff can be handled. For example, currently cmf only handle expression on first level of props, with this change, we can do expression evaluation under props.list for List component.
- Container: Form
- PR: https://github.com/Talend/ui/pull/1031
- Changes: With Form container in default export, we must have form as dependency on the project that import containers. Remove Form from default export and import it à la lodash when you need it.
Before
import { Form } from '@talend/react-containers'
After
import Form from '@talend/react-containers/lib/Form'
- Component: Typeahead
- PR: chore: upgrade react-autowhatever
- Changes : we upgraded React-autowhatever from 7.0.0 to 10.1.0. We ensured old props compatibility, but overriding some props have been changed.
Before | After |
---|---|
props.theme.itemFocused | props.theme.itemHighlighted |
- Component: Form's Datalist widget
- PR: [chore(react): Updates to React 16(https://github.com/Talend/ui/pull/761)
- Changes : we upgraded React-autowhatever from 7.0.0 to 10.1.0. Custom item container have api changes
Now containerProps are in a nested object
props.containerProps
instead of directly inprops
.
Before
function renderItemsContainer({ children, ...containerProps }) {
return (
<div {...containerProps}>
{children}
</div>
);
}
function CustomDatalist() {
return (
<DatalistWidget
{...otherProps}
renderItemsContainer={renderItemsContainer}
/>
);
}
After
function renderItemsContainer({ children, containerProps }) {
return (
<div {...containerProps}>
{children}
</div>
);
}
- Component: CollapsiblePanel
- PR: feat(components/collapsiblepanel): style update
- Changes :
Old Props | New props |
---|---|
selected | status |
- Component: Status
- PR: feat(components/collapsiblepanel): style update
- Changes : Status component has no longer default export. import Status from '../Status'; ---> import { Status, getbsStyleFromStatus } from '../Status';
- Container: HeaderBar
- PR fix(component/containers): add number of missings displayName
- Change
Display name of this component was HeaderBar
now Container(HeaderBar)
Change made for consistency, and also because HeaderBar
is already in use inside the component repository.
- Container: DeleteResource
- PR fix(container/deleteResource): change so keyboard shortcut can be supported
- Changes
The parameter used to properly compute resource information and how to call the URL to delete resource have moved from view settings to a saga factory
see documentation added on how to use this peculiar container
- Containers: need to be configured
- PR feat(containers): register all containers
- Changes:
Before Containers was working on it's own. Now you need to register them in your configure.js (it's CMF)
import { registerAllContainers } from '@talend/react-containers/lib/register';
registerAllContainers();
- CMF: HTTP middleware
- PR feat(cmf/http): CSRFToken support
- Changes:
Some constant from CMF/middlewares/http/constants are renamed
Before | After |
---|---|
HTTP_REQUEST | ACTION_TYPE_HTTP_REQUEST |
HTTP_RESPONSE | ACTION_TYPE_HTTP_RESPONSE |
HTTP_ERRORS | ACTION_TYPE_HTTP_ERRORS |
- Component: Slider
- PR: fix: remove Slider from the global export
- Changes :
Before | After |
---|---|
import { Slider } from '@talend/react-component'; | import Slider from '@talend/react-component/lib/Slider' |
- Component: TreeView
- PR: feat(SelectObject): display results as ListGroupItem
- Changes :
Before | After |
---|---|
generated id was undefined-add on the add button if no was given | no id is generated for the the add button |
- Component: ListView
- PR: feat(ListView): i18n
- Changes :
Before | After |
---|---|
emptyLabel | i18next t() fn will do the magic trick by providing LISTVIEW_EMPTY
|
noResultLabel | i18next t() fn will do the magic trick by providing LISTVIEW_NO_RESULT
|
toggleAllLabel | i18next t() fn will do the magic trick by providing LISTVIEW_ITEMS_TOGGLE_ALL
|
searchPlaceholder | i18next t() fn will do the magic trick by providing LISTVIEW_HEADERINPUT_SEARCH_PLACEHOLDER
|
- Component: SidePanel
- PR: feat(components/sidepanel): accept custom action ids
- Changes :
Before this, action ids were ignored. Now, if an id is provided per action, it will be used instead of the label ; so it could break some QA tests.
- Component: SidePanel
- PR: feat(SidePanel): i18n
- Changes :
Before | After |
---|---|
expandTitle | i18next t() fn will do the magic trick by providing SIDEPANEL_EXPAND
|
collapseTitle | i18next t() fn will do the magic trick by providing SIDEPANEL_COLLAPSE
|
- PR 807 [enhancement(component/Headerbar): small change]
The brand of the header bar used name
to be rendered as the application title.
Using containers and cmf, name
is used to resolve CMFAction
from the registry.
To be able to use name to describe the CMFAction associated to the Brand section of the header bar,
label
has to be used for application title rendering and name
to resolve CMFAction
- PR #634 [feat(VirtualizedList): adapt and enhance component objects]
List component object has entirely changed.
Before
<dependency>
<groupId>com.talend</groupId>
<artifactId>component-objects</artifactId>
<version>1.0.0</version>
</dependency>
import com.talend.component.*;
After
<dependency>
<groupId>org.talend</groupId>
<artifactId>component-objects</artifactId>
<version>0.97.0</version>
</dependency>
import org.talend.component.*;
Explanation : this aligns the package name with all talend projects, and align version to Talend/ui
Before
this.driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
After
// removed this configuration
Explanation : when the component-objects were instantiated, it was overriding the timeout configuration of the WebDriver. This should not be here, and only managed by the test project.
Before
list.getItems(); // this returns all buttons in the table title cells
After
List<WebElement> titles = list
.getTable(optional_id) // get the table display component object
.getItems() // get all the items rows
.stream()
.map(Item::getTitle) // get the title button of each items
.collect(Collectors.toList());
// no simple way, must take all items, map them to all titles, map them to all actions...
List<WebElement> actions = list
.getTable(optional_id) // get the table display component object
.getItems() // get all the items rows
.stream()
.map(item -> item.getCell(columnKey).getActions()) // get the title cell
.flatMap(List::stream) // flatten
.collect(Collectors.toList());
Explanation : getting all title buttons and actions is not a real use case. There are more api method to do more precise things.
Before
final WebElement actionButton = list.getItemActionButton(label, listType, action);
// move mouse to button to trigger mouseover and click
final Actions action = new Actions(driver);
action.moveToElement(actionButton).click().build().perform();
After
final Item item = list
.getTable(optional_id) // get the table display component object
.getItem(titleLabel); // get item row that fit the provided title label
// if you need to get the title button
final WebElement titleButton = item.getTitle();
// if you need to click on title button
item.clickOnTitle();
// if you need to get an item action
final WebElement actionButton = item.getAction(part_of_id_to_match); // the id was "listType:action" before
// if you need to click on an action
item.clickOnAction(part_of_id_to_match); // the id was "listType:action" before
Explanation :
- the buttons should have ids or part of ids that are similar
- listType and action parameters are specific to a project. They are used to create the id.
Before
final boolean exists = list.hasItem(titleLabel);
After
final boolean exists = list.getTable().hasItem(titleLabel);
- PR #629 [feat(theme): update colors]
4 colors are gone :
- $limeade : replace by $rio-grande
- $pirate-gold : not used
- $mine-shaft : replace by $dove-gray
- $smalt-blue : not used
- PR #364 [feat: onTrigger !== onChange]
Form on change was binded not on underlying onChange api but, on trigger api.
Old on change behavior was migrated to onTrigger property. On change underlying behavior is now bound to onChange
Before
<Form
data={schema}
onChange={this.onChange}
onSubmit={this.onSubmit}
actions={this.formActions(this.props.definition, this.props.formData.label, onCancelAction)}
buttonBlockClass={buttonBlockClass}
/>
After
<Form
data={schema}
onTrigger={this.onTrigger}
onSubmit={this.onSubmit}
actions={this.formActions(this.props.definition, this.props.formData.label, onCancelAction)}
buttonBlockClass={buttonBlockClass}
/>
Can even use real
onChange
<Form
data={schema}
onChange={this.onChange}
onTrigger={this.onTrigger}
onSubmit={this.onSubmit}
actions={this.formActions(this.props.definition, this.props.formData.label, onCancelAction)}
buttonBlockClass={buttonBlockClass}
/>
- cmf: collectionAction.mutateCollection
- PR: feat(CMF): mutate collections based on their ids
- Changes: the operations are now based on the items ids
The mutateCollection operations |
Old format | New format |
---|---|---|
delete | Array of index | Array of item id |
update | Map of key/value = index/item | Map of key/value = id/item |
-
containers: getActionProps
-
Changes: this function doesn't exists anymore. Please use getActionsProps instead.
-
Component: TreeView
-
removed removeCallback in favor of custom actions
- Component: List
- PR: feat(List): filter dock mode
- Changes : props.toolbar.onFilter was taking (value, event) args, it's now aligned with other components (event, value)
- Action structure must be in payload
- PR 135
- Changes:
actions['menu:first'] = {
label: 'First',
icon: 'talend-streams',
- type: 'MENU_TEST',
+ payload: {
+ type: 'MENU_',
+ },
};