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 | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 11 | define(["view","util"], function (viewClass) { |
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 | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 20 | return Object.create(viewClass)._init(['widget']).upgradeTo(this)._init(name, src, id); |
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 | 7991b19 | 2018-07-09 17:28:43 +0200 | [diff] [blame] | 24 | _init : function (name, src, id) { |
| 25 | this.name = name; |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 26 | this.src = src; |
| 27 | this.id = id; |
| 28 | return this; |
| 29 | }, |
| 30 | |
| 31 | /** |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 32 | * The element of the widget as embedded in the view |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 33 | */ |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 34 | show : function () { |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 35 | |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 36 | if (this._show) |
| 37 | return this._show; |
Akron | 8d646d7 | 2018-07-08 13:45:53 +0200 | [diff] [blame] | 38 | |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 39 | // Spawn new iframe |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 40 | var i = document.createElement('iframe'); |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 41 | i.setAttribute('allowTransparency',"true"); |
| 42 | i.setAttribute('frameborder', 0); |
| 43 | i.setAttribute('sandbox','allow-scripts'); |
Akron | e8e2c95 | 2018-07-04 13:43:12 +0200 | [diff] [blame] | 44 | i.style.height = '0px'; |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 45 | i.setAttribute('name', this.id); |
| 46 | i.setAttribute('src', this.src); |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 47 | |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 48 | // Per default there should at least be a button |
| 49 | // for settings, if the plugin requires settings. |
| 50 | // Otherwise a button indicating this is a plugin |
| 51 | // is a nice idea as well. |
Akron | 8d646d7 | 2018-07-08 13:45:53 +0200 | [diff] [blame] | 52 | |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 53 | this.actions.add( |
| 54 | this.name, ['button-icon', 'plugin'], function (e) { |
Akron | 8d646d7 | 2018-07-08 13:45:53 +0200 | [diff] [blame] | 55 | |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 56 | // Temporary |
| 57 | window.alert("Basic information about this plugin"); |
Akron | 8d646d7 | 2018-07-08 13:45:53 +0200 | [diff] [blame] | 58 | }.bind(this)); |
| 59 | |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 60 | this._show = i; |
| 61 | return i; |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 62 | }, |
| 63 | |
| 64 | // Resize iframe |
| 65 | resize : function (data) { |
Akron | e1c27f6 | 2018-07-20 11:42:59 +0200 | [diff] [blame] | 66 | this.show().style.height = data.height + 'px'; |
Akron | a99315e | 2018-07-03 22:56:45 +0200 | [diff] [blame] | 67 | }, |
| 68 | |
Akron | 4a70387 | 2018-07-26 10:59:41 +0200 | [diff] [blame] | 69 | |
| 70 | // On closing the widget view |
| 71 | onClose : function () { |
| 72 | if (this._mgr) { |
| 73 | this._mgr._closeWidget(this._id); |
| 74 | this._mgr = undefined; |
| 75 | }; |
Akron | a6c32b9 | 2018-07-02 18:39:42 +0200 | [diff] [blame] | 76 | } |
| 77 | } |
| 78 | }); |