Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 1 | /** |
| 2 | * The plugin system is based |
| 3 | * on registered widgets (iframes) from |
| 4 | * foreign services. |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 5 | * The widget component represents a single iframe and is |
| 6 | * implemented as a view object. |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 7 | * |
| 8 | * @author Nils Diewald |
| 9 | */ |
| 10 | |
Akron | 22598cd | 2019-12-09 14:59:03 +0100 | [diff] [blame] | 11 | define(["view","plugin/service","util"], function (viewClass, serviceClass) { |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 12 | "use strict"; |
| 13 | |
| 14 | return { |
| 15 | |
| 16 | /** |
| 17 | * Create new widget |
| 18 | */ |
Akron | 7991b19 | 2018-07-09 17:28:43 +0200 | [diff] [blame] | 19 | create : function (name, src, id) { |
Akron | 22598cd | 2019-12-09 14:59:03 +0100 | [diff] [blame] | 20 | return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(name, src, id).upgradeTo(this)._init(); |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 21 | }, |
| 22 | |
Akron | e8e2c95 | 2018-07-04 13:43:12 +0200 | [diff] [blame] | 23 | // Initialize widget |
Akron | 22598cd | 2019-12-09 14:59:03 +0100 | [diff] [blame] | 24 | _init : function () { |
| 25 | this.isWidget = true; |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 26 | return this; |
| 27 | }, |
| 28 | |
| 29 | /** |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 30 | * The element of the widget as embedded in the view |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 31 | */ |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 32 | show : function () { |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 33 | |
Akron | 22598cd | 2019-12-09 14:59:03 +0100 | [diff] [blame] | 34 | if (this._load) |
| 35 | return this._load; |
Akron | 8d646d7 | 2018-07-08 13:45:53 +0200 | [diff] [blame] | 36 | |
Akron | 22598cd | 2019-12-09 14:59:03 +0100 | [diff] [blame] | 37 | let obj = this.load(); |
Akron | 6f557e3 | 2020-09-09 16:11:01 +0200 | [diff] [blame] | 38 | obj.setAttribute('loading', 'lazy'); |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 39 | |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 40 | // Per default there should at least be a button |
| 41 | // for settings, if the plugin requires settings. |
| 42 | // Otherwise a button indicating this is a plugin |
| 43 | // is a nice idea as well. |
Akron | 22598cd | 2019-12-09 14:59:03 +0100 | [diff] [blame] | 44 | |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 45 | this.actions.add( |
| 46 | this.name, ['button-icon', 'plugin'], function (e) { |
Akron | 8d646d7 | 2018-07-08 13:45:53 +0200 | [diff] [blame] | 47 | |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 48 | // Temporary |
| 49 | window.alert("Basic information about this plugin"); |
Akron | 8d646d7 | 2018-07-08 13:45:53 +0200 | [diff] [blame] | 50 | }.bind(this)); |
| 51 | |
Akron | 22598cd | 2019-12-09 14:59:03 +0100 | [diff] [blame] | 52 | return obj; |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 53 | }, |
| 54 | |
| 55 | // Resize iframe |
| 56 | resize : function (data) { |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 57 | this.show().style.height = data.height + 'px'; |
Akron | a99315e | 2018-07-03 22:56:45 +0200 | [diff] [blame] | 58 | }, |
| 59 | |
Akron | 4a70387 | 2018-07-26 10:59:41 +0200 | [diff] [blame] | 60 | |
| 61 | // On closing the widget view |
| 62 | onClose : function () { |
| 63 | if (this._mgr) { |
Akron | 22598cd | 2019-12-09 14:59:03 +0100 | [diff] [blame] | 64 | this._mgr._closeService(this._id); |
Akron | 4a70387 | 2018-07-26 10:59:41 +0200 | [diff] [blame] | 65 | this._mgr = undefined; |
| 66 | }; |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 67 | } |
| 68 | } |
| 69 | }); |