AppSuite:Extending the UI (best practices): Difference between revisions
From Open-Xchange
| No edit summary | No edit summary | ||
| Line 9: | Line 9: | ||
| __TOC__ | __TOC__ | ||
| === scenario: writing extension in general === | |||
| ''separate extension declaration and logic for reusability'' | |||
| * example: io.ox/mail/common-extensions.js and io.ox/mail/detail/view.js | |||
| <code> | |||
|     var fnProcess = function (baton) { ... }; | |||
|     // use function within some extension | |||
|     ext.point('io.ox/mail/detail/content').extend({ | |||
|         id: 'links', | |||
|         index: 100, | |||
|         process: fnProcess | |||
|     }); | |||
|     // use function within another extension | |||
|     ext.point('io.ox/mail/detail/content').extend({ | |||
|         id: 'images', | |||
|         index: 100, | |||
|         process: fnProcess | |||
|     }); | |||
| </code> | |||
| === scenario: hide/show action === | === scenario: hide/show action === | ||
Revision as of 11:24, 12 August 2015
API status: In Development
Extension points:
Best practices
Best practices
Abstract
The extension points system allows different strategies to realize the desired behavior. This is a list of solutions for common scenarios pointing out also some disadvantages of different solutions.
scenario: writing extension in general
separate extension declaration and logic for reusability
- example: io.ox/mail/common-extensions.js and io.ox/mail/detail/view.js
   var fnProcess = function (baton) { ... };
   // use function within some extension
   ext.point('io.ox/mail/detail/content').extend({
       id: 'links',
       index: 100,
       process: fnProcess
   });
   // use function within another extension
   ext.point('io.ox/mail/detail/content').extend({
       id: 'images',
       index: 100,
       process: fnProcess
   });
scenario: hide/show action
simply register a fresh new extension with an index less than the original action extension.
   // original extension
   new Action('io.ox/mail/actions/compose', {
       id: 'compose',
       index: 100,
       requires: function () {
           return true;
       },
       ...
   });
   // your extension to hide it
   ext.point('io.ox/mail/actions/compose').extend({
       // must be a different id than used in original extension
       id: 'compose_preprocess',
       // important: must be smaller than the one used in original extension
       index: 50,
       requires: function (e) {
           // is your condition meet?
           if (myCondition = true) {
               // stop propagation to suppress execution of
               // requires-handlers of extensions with a higher index
               e.stopPropagation();
               // force hide (or force show by using 'return true')
               return false;
           }
       }
   });
unfavorable variants
using ext.point(...).replace
- original requires function is replaced and can not be accessed anymore
- also copy and paste it contents does not help cause future changes are not carried over automatically
- see documentation for .replace
   // please do not use replace to overwrite 'requires'
   ext.point('io.ox/mail/actions/compose').replace({ 
       id: 'compose',
       requires: function () {
           // my custom logic
       } 
   })