# Migration from 4.1

## Designer Toolbar

The toolbar is configurable. You have to specify them in the `appmixer.ui.Designer` constructor, otherwise, it will be empty. More information [here](https://docs.appmixer.com/6.0/v4.2/appmixer-sdk/api-reference/designer#appmixer-ui-designer).

```javascript
/* Create "Designer". */
var designer = appmixer.ui.Designer({
    el: '#your-designer',
    options: {
        menu: [
            { label: 'Rename', event: 'flow:rename' },
            { label: 'Insights Logs', event: 'flow:insights-logs' },
            { label: 'Clone', event: 'flow:clone' },
            { label: 'Share', event: 'flow:share' },
            { label: 'Export to SVG', event: 'flow:export-svg' },
            { label: 'Export to PNG', event: 'flow:export-png' },
            { label: 'Print', event: 'flow:print' }
        ],
        // buttons in the toolbar
        toolbar: [
            ['undo', 'redo'],
            ['zoom-to-fit', 'zoom-in', 'zoom-out'],
            ['logs']
        ]
    }
});
```

## Custom Inspector Fields

The *props* structure for Custom Inspector Fields was changed. Although the same data is available inside the fields, it is accessed a bit differently. Until the 4.0 version the *props* definition looked like this:

```
props: {
   value: { type: null, required: false },
   variables: { type: Object, default: () => ({}) },
   inputManifest: { type: Object, default: () => ({}) },
   descriptorPath: { type: String, default: '' },
   errors: { type: Array, default: () => ([]) },
   disabled: { type: Boolean, default: false }
}
```

This is how it looks in 4.1:

```
props: {
    context: { type: Object },
    value: { type: null, required: false },
    errors: { type: Array, default: () => ([]) },
    disabled: { type: Boolean, default: false },
}
```

The `context` object contains the following properties:

* componentId
* inputManifest
* componentManifest
* descriptorPath
* variables

&#x20;As you can see, the `context` object now contains the contextual data - i.e. the data from the component to which the input belongs. The same data as before remains available, and access to the `componentId` and `componentManifest` is now available as well. So if you have references to `inputManifest`, `descriptorPath` or `variables`, change them and refer to these properties inside the `context` object. For example, if we had this code:

```javascript
computed: {
    config() {
        return this.inputManifest.config;
    },
},
```

You have to update it to:

```javascript
computed: {
    config() {
        return this.context.inputManifest.config;
    },
},
```

## Slack app

Migrate the legacy Slack applications. The Slack Appmixer module in 4.1 does not work with newly registered Slack applications. We upgraded the module to the newest Slack API. Unfortunately, it is no longer compatible with legacy Slack apps. More information can be found in the [Slack](https://docs.appmixer.com/6.0/v4.2/app-registration/slack#slack-app-migration) section.
