Skip to content

Commit

Permalink
Add configurable parent method call after deleting element
Browse files Browse the repository at this point in the history
[Issue] Samsung#279
[Problem] Some complex widgets require removing elements
          through its API. Otherwise widget look is broken.
[Solution] Call given parent method on widget if required

Signed-off-by: Pawel Kaczmarczyk <p.kaczmarczy@samsung.com>
  • Loading branch information
pkaczmarczy committed Sep 5, 2019
1 parent aa14975 commit ab97730
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 3 deletions.
2 changes: 1 addition & 1 deletion design-editor/src/pane/component-generator.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ class ComponentGenerator {
return {
constructor: info.options.generator.constructor,
parameter: info.options.generator.parameter,
dependencyComponent: info.options.generator['dependency-component'],
dependencyComponent: info.options['dependency-component'],
parentMethodToCall: info.options.generator['parent-call-method']
};
}
Expand Down
45 changes: 44 additions & 1 deletion design-editor/src/pane/design-editor-element.js
Original file line number Diff line number Diff line change
Expand Up @@ -801,14 +801,57 @@ class DesignEditor extends DressElement {
this._$iframe.contents().find('head').append($('<link>').attr('rel', 'stylesheet').attr('href', dest));
}

/**
* Tries to remove element from TAU widget.
* This method calls configured widget methods
* designed to remove items from complex widgets.
* @param {HTMLElement} element
* @returns {Boolean} True if element has been succesfuly removed.
*/
_removeElementUsingTAU(element) {
const getComponentPackages = packageManager.getPackages(Package.TYPE.COMPONENT);
const packageInfo = getComponentPackages.getPackageByElement(element);

if (packageInfo.options.destroyer && packageInfo.options['dependency-component']
&& packageInfo.options.destroyer['parent-call-method']) {

const dependencyComponentName = packageInfo.options['dependency-component'];
const dependencyComponentPackage = getComponentPackages.get(dependencyComponentName);
const dependencyComponentElement = element.closest(dependencyComponentPackage.options.selector);

if (dependencyComponentElement) {
const dependencyComponentInfo = getComponentPackages.getPackageByElement(dependencyComponentElement),
parentWidgetConstructorName = dependencyComponentInfo
&& dependencyComponentInfo.options
&& dependencyComponentInfo.options.generator
&& dependencyComponentInfo.options.generator.constructor;

const method = parentWidgetConstructorName.split('.')
.reduce((prev, curr) => prev[curr], this._$iframe[0].contentWindow);

const dependencyWidget = method(dependencyComponentElement);

dependencyWidget[packageInfo.options.destroyer['parent-call-method']](element);
return true;
}
}

return false;
}

/**
* Callback for event delete element
* @param {number} id
*/
_onElementDeleted(id) {
const element = this._getElementById(id);

element.remove();
// Attempt to remove element by TAU widget method
// if it fails (i.e widget has no such method)
// element is strictly removed from document
if (!this._removeElementUsingTAU(element[0])) {
element.remove();
}

const packageInfo = packageManager.getPackages(Package.TYPE.COMPONENT).getPackageByElement(element);
const externalResources = packageInfo.options.externalResources;
Expand Down
5 changes: 4 additions & 1 deletion tau-component-packages/components/selectoritem/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,17 @@
"text",
"closet-image"
],
"dependency-component": "selector",
"generator": {
"dependency-component": "selector",
"constructor": "",
"parameter": {
"options": {}
},
"parent-call-method": "addItem"
},
"destroyer": {
"parent-call-method": "removeItemByElement"
},
"class": [],
"attributes": {
"data-title": {
Expand Down

0 comments on commit ab97730

Please sign in to comment.