Difference between revisions of "AppSuite:Extending the UI (best practices)"

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

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
       } 
   })