---
# System prepended metadata

title: Changesets

---

# Changesets

## Manipulations
|Name|key|has target element|Undo/Redo|unset js|
|-----|-----|-----|-----|-----|
|Edit Content|`apply-content`|:heavy_check_mark:|:heavy_check_mark:|:white_check_mark:|
|Edit Style|`apply-styles`|:heavy_check_mark:|:heavy_check_mark:|:white_check_mark:|
|Edit HTML|`apply-html`|:heavy_check_mark:|:heavy_check_mark:|:white_check_mark:|
|Keyword Insertion|`apply-content`|:heavy_check_mark:|:heavy_check_mark:|:white_check_mark:|
|Hide Element|`apply-hide`|:heavy_check_mark:|:heavy_check_mark:|:white_check_mark:|
|Remove Element|`apply-remove`|:heavy_check_mark:|:heavy_check_mark:|:white_check_mark:|
|Hide Element|`apply-hide`|:heavy_check_mark:|:heavy_check_mark:|:white_check_mark:|
|Add CSS|`apply-css`|:white_check_mark:|:white_check_mark:|:white_check_mark:|
|Add JS|`apply-js`|:white_check_mark:|:white_check_mark:|:white_check_mark:|
|Extension|`apply-extension`|:white_check_mark:|:white_check_mark:|:heavy_check_mark:|

## Some points
* We should have _one_ solution for all of our manipulations
* Changesets should not necessarily require a target element
* Something that has been handled as a changeset, does not necessarily require history functionality
* existing variations will be stored as javascript

## Suggested solution
 - css, javascript and extensions will be stored separately in backend
 - css, javascript and extensions will not be added to history
 - A changeset type `javascript` is added, which will handle custom javascript functionality.

_changeset_
```json
[{
    selector: null,
    changes: {
        [type]: {
            value: code
        }
    }
}]
```

_composedChange handler_
```javascript=
case 'javascript':
  if(change.property === 'createElement') {
    const { type, value } = change.value;
    const createdElement = document.createElement(type);
    createdElement.innerHTML = value;
    document.body.appendChild(createdElement)
  }
  break;
```

## Tasks
- [x] create fields css, javascipt, extensions
- [x] update VariationController@store
- [x] update VariationController@update
- [x] store existing variations as javascript
- [x] remove code ouput
- [x] store css code in css field
- [x] store javascript code in javascript field
- [x] update VariationController@deliver
- [x] enable keyword insertion in VariationController@deliver for changesets


## Tasks for extensions
- [x] store extensions config in extensions field
- [x] create new lerna package @varify.io/extenions
- [x] implement `apply-extensions` in `clickHandler()`
- [x] implement in xhr request in edit mode
- [x] ensure it's not added to history
- [x] update `VariationController@delivery`
- [ ] reduce size of initial payload in `varify.js`
- [x] disable editor before all scripts have loaded