##// END OF EJS Templates
Merge pull request #9967 from user5061/master...
Matthias Bussonnier -
r22910:4fd45e58 merge
parent child Browse files
Show More
@@ -1,321 +1,322 b''
1 Migrating Widgets to IPython 3
1 Migrating Widgets to IPython 3
2 ==============================
2 ==============================
3
3
4 Upgrading Notebooks
4 Upgrading Notebooks
5 -------------------
5 -------------------
6
6
7 1. The first thing you'll notice when upgrading an IPython 2.0 widget
7 1. The first thing you'll notice when upgrading an IPython 2.0 widget
8 notebook to IPython 3.0 is the "Notebook converted" dialog. Click
8 notebook to IPython 3.0 is the "Notebook converted" dialog. Click
9 "ok".
9 "ok".
10 2. All of the widgets distributed with IPython have been renamed. The
10 2. All of the widgets distributed with IPython have been renamed. The
11 "Widget" suffix was removed from the end of the class name. i.e.
11 "Widget" suffix was removed from the end of the class name. i.e.
12 ``ButtonWidget`` is now ``Button``.
12 ``ButtonWidget`` is now ``Button``.
13 3. ``ContainerWidget`` was renamed to ``Box``.
13 3. ``ContainerWidget`` was renamed to ``Box``.
14 4. ``PopupWidget`` was removed from IPython. If you use the
14 4. ``PopupWidget`` was removed from IPython, because bootstrapjs was
15 problematic (creates global variables, etc.). If you use the
15 ``PopupWidget``, try using a ``Box`` widget instead. If your notebook
16 ``PopupWidget``, try using a ``Box`` widget instead. If your notebook
16 can't live without the popup functionality, subclass the ``Box``
17 can't live without the popup functionality, subclass the ``Box``
17 widget (both in Python and JS) and use JQuery UI's ``draggable()``
18 widget (both in Python and JS) and use JQuery UI's ``draggable()``
18 and ``resizable()`` methods to mimic the behavior.
19 and ``resizable()`` methods to mimic the behavior.
19 5. ``add_class`` and ``remove_class`` were removed. More often than not
20 5. ``add_class`` and ``remove_class`` were removed. More often than not
20 a new attribute exists on the widget that allows you to achieve the
21 a new attribute exists on the widget that allows you to achieve the
21 same explicitly. i.e. the ``Button`` widget now has a
22 same explicitly. i.e. the ``Button`` widget now has a
22 ``button_style`` attribute which you can set to 'primary', 'success',
23 ``button_style`` attribute which you can set to 'primary', 'success',
23 'info', 'warning', 'danger', or '' instead of using ``add_class`` to
24 'info', 'warning', 'danger', or '' instead of using ``add_class`` to
24 add the bootstrap class. ``VBox`` and ``HBox`` classes (flexible
25 add the bootstrap class. ``VBox`` and ``HBox`` classes (flexible
25 ``Box`` subclasses) were added that allow you to avoid using
26 ``Box`` subclasses) were added that allow you to avoid using
26 ``add_class`` and ``remove_class`` to make flexible box model
27 ``add_class`` and ``remove_class`` to make flexible box model
27 layouts. As a last resort, if you can't find a built in attribute for
28 layouts. As a last resort, if you can't find a built in attribute for
28 the class you want to use, a new ``_dom_classes`` list trait was
29 the class you want to use, a new ``_dom_classes`` list trait was
29 added, which combines ``add_class`` and ``remove_class`` into one
30 added, which combines ``add_class`` and ``remove_class`` into one
30 stateful list.
31 stateful list.
31 6. ``set_css`` and ``get_css`` were removed in favor of explicit style
32 6. ``set_css`` and ``get_css`` were removed in favor of explicit style
32 attributes - ``visible``, ``width``, ``height``, ``padding``,
33 attributes - ``visible``, ``width``, ``height``, ``padding``,
33 ``margin``, ``color``, ``background_color``, ``border_color``,
34 ``margin``, ``color``, ``background_color``, ``border_color``,
34 ``border_width``, ``border_radius``, ``border_style``,
35 ``border_width``, ``border_radius``, ``border_style``,
35 ``font_style``, ``font_weight``, ``font_size``, and ``font_family``
36 ``font_style``, ``font_weight``, ``font_size``, and ``font_family``
36 are a few. If you can't find a trait to see the css attribute you
37 are a few. If you can't find a trait to see the css attribute you
37 need, you can, in order of preference, (A) subclass to create your
38 need, you can, in order of preference, (A) subclass to create your
38 own custom widget, (B) use CSS and the ``_dom_classes`` trait to set
39 own custom widget, (B) use CSS and the ``_dom_classes`` trait to set
39 ``_dom_classes``, or (C) use the ``_css`` dictionary to set CSS
40 ``_dom_classes``, or (C) use the ``_css`` dictionary to set CSS
40 styling like ``set_css`` and ``get_css``.
41 styling like ``set_css`` and ``get_css``.
41 7. For selection widgets, such as ``Dropdown``, the ``values`` argument
42 7. For selection widgets, such as ``Dropdown``, the ``values`` argument
42 has been renamed to ``options``.
43 has been renamed to ``options``.
43
44
44 Upgrading Custom Widgets
45 Upgrading Custom Widgets
45 ------------------------
46 ------------------------
46
47
47 Javascript
48 Javascript
48 ~~~~~~~~~~
49 ~~~~~~~~~~
49
50
50 1. If you are distributing your widget and decide to use the deferred
51 1. If you are distributing your widget and decide to use the deferred
51 loading technique (preferred), you can remove all references to the
52 loading technique (preferred), you can remove all references to the
52 WidgetManager and the register model/view calls (see the Python
53 WidgetManager and the register model/view calls (see the Python
53 section below for more information).
54 section below for more information).
54 2. In 2.0 require.js was used incorrectly, that has been fixed and now
55 2. In 2.0 require.js was used incorrectly, that has been fixed and now
55 loading works more like Python's import. Requiring
56 loading works more like Python's import. Requiring
56 ``widgets/js/widget`` doesn't import the ``WidgetManager`` class,
57 ``widgets/js/widget`` doesn't import the ``WidgetManager`` class,
57 instead it imports a dictionary that exposes the classes within that
58 instead it imports a dictionary that exposes the classes within that
58 module:
59 module:
59
60
60 .. code:: javascript
61 .. code:: javascript
61
62
62 {
63 {
63 'WidgetModel': WidgetModel,
64 'WidgetModel': WidgetModel,
64 'WidgetView': WidgetView,
65 'WidgetView': WidgetView,
65 'DOMWidgetView': DOMWidgetView,
66 'DOMWidgetView': DOMWidgetView,
66 'ViewList': ViewList,
67 'ViewList': ViewList,
67 }
68 }
68
69
69 If you decide to continue to use the widget registry (by registering
70 If you decide to continue to use the widget registry (by registering
70 your widgets with the manager), you can import a dictionary with a
71 your widgets with the manager), you can import a dictionary with a
71 handle to the WidgetManager class by requiring
72 handle to the WidgetManager class by requiring
72 ``widgets/js/manager``. Doing so will import:
73 ``widgets/js/manager``. Doing so will import:
73
74
74 .. code:: javascript
75 .. code:: javascript
75
76
76 {'WidgetManager': WidgetManager}
77 {'WidgetManager': WidgetManager}
77
78
78 3. Don't rely on the ``IPython`` namespace for anything. To inherit from
79 3. Don't rely on the ``IPython`` namespace for anything. To inherit from
79 the DOMWidgetView, WidgetView, or WidgetModel, require
80 the DOMWidgetView, WidgetView, or WidgetModel, require
80 ``widgets/js/widget`` as ``widget``. If you were inheriting from
81 ``widgets/js/widget`` as ``widget``. If you were inheriting from
81 DOMWidgetView, and the code looked like this:
82 DOMWidgetView, and the code looked like this:
82
83
83 .. code:: javascript
84 .. code:: javascript
84
85
85 IPython.DOMWidgetView.extend({...})
86 IPython.DOMWidgetView.extend({...})
86
87
87 It would become this:
88 It would become this:
88
89
89 .. code:: javascript
90 .. code:: javascript
90
91
91 widget.DOMWidgetView.extend({...})
92 widget.DOMWidgetView.extend({...})
92
93
93 4. Custom models are encouraged. When possible, it's recommended to move
94 4. Custom models are encouraged. When possible, it's recommended to move
94 your code into a custom model, so actions are performed 1 time,
95 your code into a custom model, so actions are performed 1 time,
95 instead of N times where N is the number of displayed views.
96 instead of N times where N is the number of displayed views.
96
97
97 Python
98 Python
98 ~~~~~~
99 ~~~~~~
99
100
100 Generally, custom widget Python code can remain unchanged. If you
101 Generally, custom widget Python code can remain unchanged. If you
101 distribute your custom widget, you may be using ``display`` and
102 distribute your custom widget, you may be using ``display`` and
102 ``Javascript`` to publish the widget's Javascript to the front-end. That
103 ``Javascript`` to publish the widget's Javascript to the front-end. That
103 is no longer the recommended way of distributing widget Javascript.
104 is no longer the recommended way of distributing widget Javascript.
104 Instead have the user install the Javascript to his/her nbextension
105 Instead have the user install the Javascript to his/her nbextension
105 directory or their profile's static directory. Then use the new
106 directory or their profile's static directory. Then use the new
106 ``_view_module`` and ``_model_module`` traitlets in combination with
107 ``_view_module`` and ``_model_module`` traitlets in combination with
107 ``_view_name`` and ``_model_name`` to instruct require.js on how to load
108 ``_view_name`` and ``_model_name`` to instruct require.js on how to load
108 the widget's Javascript. The Javascript is then loaded when the widget
109 the widget's Javascript. The Javascript is then loaded when the widget
109 is used for the first time.
110 is used for the first time.
110
111
111 Details
112 Details
112 -------
113 -------
113
114
114 Asynchronous
115 Asynchronous
115 ~~~~~~~~~~~~
116 ~~~~~~~~~~~~
116
117
117 In the IPython 2.x series the only way to register custom widget views
118 In the IPython 2.x series the only way to register custom widget views
118 and models was to use the registry in the widget manager. Unfortunately,
119 and models was to use the registry in the widget manager. Unfortunately,
119 using this method made distributing and running custom widgets difficult. The widget
120 using this method made distributing and running custom widgets difficult. The widget
120 maintainer had to either use the rich display framework to push the
121 maintainer had to either use the rich display framework to push the
121 widget's Javascript to the notebook or instruct the users to install the
122 widget's Javascript to the notebook or instruct the users to install the
122 Javascript by hand in a custom profile. With the first method, the
123 Javascript by hand in a custom profile. With the first method, the
123 maintainer would have to be careful about when the Javascript was pushed
124 maintainer would have to be careful about when the Javascript was pushed
124 to the front-end. If the Javascript was pushed on Python widget
125 to the front-end. If the Javascript was pushed on Python widget
125 ``import``, the widgets wouldn't work after page refresh. This is
126 ``import``, the widgets wouldn't work after page refresh. This is
126 because refreshing the page does not restart the kernel, and the Python
127 because refreshing the page does not restart the kernel, and the Python
127 ``import`` statement only runs once in a given kernel instance (unless
128 ``import`` statement only runs once in a given kernel instance (unless
128 you reload the Python modules, which isn't straight forward). This meant
129 you reload the Python modules, which isn't straight forward). This meant
129 the maintainer would have to have a separate ``push_js()`` method that
130 the maintainer would have to have a separate ``push_js()`` method that
130 the user would have to call after importing the widget's Python code.
131 the user would have to call after importing the widget's Python code.
131
132
132 Our solution was to add support for loading widget views and models
133 Our solution was to add support for loading widget views and models
133 using require.js paths. Thus the comm and widget frameworks now support
134 using require.js paths. Thus the comm and widget frameworks now support
134 lazy loading. To do so, everything had to be converted to asynchronous
135 lazy loading. To do so, everything had to be converted to asynchronous
135 code. HTML5 promises are used to accomplish that
136 code. HTML5 promises are used to accomplish that
136 (`#6818 <https://github.com/ipython/ipython/pull/6818>`__,
137 (`#6818 <https://github.com/ipython/ipython/pull/6818>`__,
137 `#6914 <https://github.com/ipython/ipython/pull/6914>`__).
138 `#6914 <https://github.com/ipython/ipython/pull/6914>`__).
138
139
139 Symmetry
140 Symmetry
140 ~~~~~~~~
141 ~~~~~~~~
141
142
142 In IPython 3.0, widgets can be instantiated from the front-end
143 In IPython 3.0, widgets can be instantiated from the front-end
143 (`#6664 <https://github.com/ipython/ipython/pull/6664>`__). On top of
144 (`#6664 <https://github.com/ipython/ipython/pull/6664>`__). On top of
144 this, a widget persistence API was added
145 this, a widget persistence API was added
145 (`#7163 <https://github.com/ipython/ipython/pull/7163>`__,
146 (`#7163 <https://github.com/ipython/ipython/pull/7163>`__,
146 `#7227 <https://github.com/ipython/ipython/pull/7227>`__). With the
147 `#7227 <https://github.com/ipython/ipython/pull/7227>`__). With the
147 widget persistence API, you can persist your widget instances using
148 widget persistence API, you can persist your widget instances using
148 Javascript. This makes it easy to persist your widgets to your notebook
149 Javascript. This makes it easy to persist your widgets to your notebook
149 document (with a small amount of custom JS). By default, the widgets are
150 document (with a small amount of custom JS). By default, the widgets are
150 persisted to your web browsers local storage which makes them reappear
151 persisted to your web browsers local storage which makes them reappear
151 when your refresh the page.
152 when your refresh the page.
152
153
153 Smaller Changes
154 Smaller Changes
154 ~~~~~~~~~~~~~~~
155 ~~~~~~~~~~~~~~~
155
156
156 - Latex math is supported in widget ``description``\ s
157 - Latex math is supported in widget ``description``\ s
157 (`#5937 <https://github.com/ipython/ipython/pull/5937>`__).
158 (`#5937 <https://github.com/ipython/ipython/pull/5937>`__).
158 - Widgets can be display more than once within a single container
159 - Widgets can be display more than once within a single container
159 widget (`#5963 <https://github.com/ipython/ipython/pull/5963>`__,
160 widget (`#5963 <https://github.com/ipython/ipython/pull/5963>`__,
160 `#6990 <https://github.com/ipython/ipython/pull/6990>`__).
161 `#6990 <https://github.com/ipython/ipython/pull/6990>`__).
161 - ``FloatRangeSlider`` and ``IntRangeSlider`` were added
162 - ``FloatRangeSlider`` and ``IntRangeSlider`` were added
162 (`#6050 <https://github.com/ipython/ipython/pull/6050>`__).
163 (`#6050 <https://github.com/ipython/ipython/pull/6050>`__).
163 - "Widget" was removed from the ends of all of the widget class names
164 - "Widget" was removed from the ends of all of the widget class names
164 (`#6125 <https://github.com/ipython/ipython/pull/6125>`__).
165 (`#6125 <https://github.com/ipython/ipython/pull/6125>`__).
165 - ``ContainerWidget`` was renamed to ``Box``
166 - ``ContainerWidget`` was renamed to ``Box``
166 (`#6125 <https://github.com/ipython/ipython/pull/6125>`__).
167 (`#6125 <https://github.com/ipython/ipython/pull/6125>`__).
167 - ``HBox`` and ``VBox`` widgets were added
168 - ``HBox`` and ``VBox`` widgets were added
168 (`#6125 <https://github.com/ipython/ipython/pull/6125>`__).
169 (`#6125 <https://github.com/ipython/ipython/pull/6125>`__).
169 - ``add\_class`` and ``remove\_class`` were removed in favor of a
170 - ``add\_class`` and ``remove\_class`` were removed in favor of a
170 ``_dom_classes`` list
171 ``_dom_classes`` list
171 (`#6235 <https://github.com/ipython/ipython/pull/6235>`__).
172 (`#6235 <https://github.com/ipython/ipython/pull/6235>`__).
172 - ``get\_css`` and ``set\_css`` were removed in favor of explicit
173 - ``get\_css`` and ``set\_css`` were removed in favor of explicit
173 traits for widget styling
174 traits for widget styling
174 (`#6235 <https://github.com/ipython/ipython/pull/6235>`__).
175 (`#6235 <https://github.com/ipython/ipython/pull/6235>`__).
175 - ``jslink`` and ``jsdlink`` were added
176 - ``jslink`` and ``jsdlink`` were added
176 (`#6454 <https://github.com/ipython/ipython/pull/6454>`__,
177 (`#6454 <https://github.com/ipython/ipython/pull/6454>`__,
177 `#7468 <https://github.com/ipython/ipython/pull/7468>`__).
178 `#7468 <https://github.com/ipython/ipython/pull/7468>`__).
178 - An ``Output`` widget was added, which allows you to ``print`` and
179 - An ``Output`` widget was added, which allows you to ``print`` and
179 ``display`` within widgets
180 ``display`` within widgets
180 (`#6670 <https://github.com/ipython/ipython/pull/6670>`__).
181 (`#6670 <https://github.com/ipython/ipython/pull/6670>`__).
181 - ``PopupWidget`` was removed
182 - ``PopupWidget`` was removed
182 (`#7341 <https://github.com/ipython/ipython/pull/7341>`__).
183 (`#7341 <https://github.com/ipython/ipython/pull/7341>`__).
183 - A visual cue was added for widgets with 'dead' comms
184 - A visual cue was added for widgets with 'dead' comms
184 (`#7227 <https://github.com/ipython/ipython/pull/7227>`__).
185 (`#7227 <https://github.com/ipython/ipython/pull/7227>`__).
185 - A ``SelectMultiple`` widget was added (a ``Select`` widget that
186 - A ``SelectMultiple`` widget was added (a ``Select`` widget that
186 allows multiple things to be selected at once)
187 allows multiple things to be selected at once)
187 (`#6890 <https://github.com/ipython/ipython/pull/6890>`__).
188 (`#6890 <https://github.com/ipython/ipython/pull/6890>`__).
188 - A class was added to help manage children views
189 - A class was added to help manage children views
189 (`#6990 <https://github.com/ipython/ipython/pull/6990>`__).
190 (`#6990 <https://github.com/ipython/ipython/pull/6990>`__).
190 - A warning was added that shows on widget import because it's expected
191 - A warning was added that shows on widget import because it's expected
191 that the API will change again by IPython 4.0. This warning can be
192 that the API will change again by IPython 4.0. This warning can be
192 supressed (`#7107 <https://github.com/ipython/ipython/pull/7107>`__,
193 supressed (`#7107 <https://github.com/ipython/ipython/pull/7107>`__,
193 `#7200 <https://github.com/ipython/ipython/pull/7200>`__,
194 `#7200 <https://github.com/ipython/ipython/pull/7200>`__,
194 `#7201 <https://github.com/ipython/ipython/pull/7201>`__,
195 `#7201 <https://github.com/ipython/ipython/pull/7201>`__,
195 `#7204 <https://github.com/ipython/ipython/pull/7204>`__).
196 `#7204 <https://github.com/ipython/ipython/pull/7204>`__).
196
197
197 Comm and Widget PR Index
198 Comm and Widget PR Index
198 ------------------------
199 ------------------------
199
200
200 Here is a chronological list of PRs affecting the widget and comm frameworks for IPython 3.0. Note that later PRs may revert changes
201 Here is a chronological list of PRs affecting the widget and comm frameworks for IPython 3.0. Note that later PRs may revert changes
201 made in earlier PRs:
202 made in earlier PRs:
202
203
203 - Add placeholder attribute to text widgets
204 - Add placeholder attribute to text widgets
204 `#5652 <https://github.com/ipython/ipython/pull/5652>`__
205 `#5652 <https://github.com/ipython/ipython/pull/5652>`__
205 - Add latex support in widget labels,
206 - Add latex support in widget labels,
206 `#5937 <https://github.com/ipython/ipython/pull/5937>`__
207 `#5937 <https://github.com/ipython/ipython/pull/5937>`__
207 - Allow widgets to display more than once within container widgets.
208 - Allow widgets to display more than once within container widgets.
208 `#5963 <https://github.com/ipython/ipython/pull/5963>`__
209 `#5963 <https://github.com/ipython/ipython/pull/5963>`__
209 - use require.js,
210 - use require.js,
210 `#5980 <https://github.com/ipython/ipython/pull/5980>`__
211 `#5980 <https://github.com/ipython/ipython/pull/5980>`__
211 - Range widgets
212 - Range widgets
212 `#6050 <https://github.com/ipython/ipython/pull/6050>`__
213 `#6050 <https://github.com/ipython/ipython/pull/6050>`__
213 - Interact on\_demand option
214 - Interact on\_demand option
214 `#6051 <https://github.com/ipython/ipython/pull/6051>`__
215 `#6051 <https://github.com/ipython/ipython/pull/6051>`__
215 - Allow text input on slider widgets
216 - Allow text input on slider widgets
216 `#6106 <https://github.com/ipython/ipython/pull/6106>`__
217 `#6106 <https://github.com/ipython/ipython/pull/6106>`__
217 - support binary buffers in comm messages
218 - support binary buffers in comm messages
218 `#6110 <https://github.com/ipython/ipython/pull/6110>`__
219 `#6110 <https://github.com/ipython/ipython/pull/6110>`__
219 - Embrace the flexible box model in the widgets
220 - Embrace the flexible box model in the widgets
220 `#6125 <https://github.com/ipython/ipython/pull/6125>`__
221 `#6125 <https://github.com/ipython/ipython/pull/6125>`__
221 - Widget trait serialization
222 - Widget trait serialization
222 `#6128 <https://github.com/ipython/ipython/pull/6128>`__
223 `#6128 <https://github.com/ipython/ipython/pull/6128>`__
223 - Make Container widgets take children as the first positional
224 - Make Container widgets take children as the first positional
224 argument `#6153 <https://github.com/ipython/ipython/pull/6153>`__
225 argument `#6153 <https://github.com/ipython/ipython/pull/6153>`__
225 - once-displayed
226 - once-displayed
226 `#6168 <https://github.com/ipython/ipython/pull/6168>`__
227 `#6168 <https://github.com/ipython/ipython/pull/6168>`__
227 - Validate slider value, when limits change
228 - Validate slider value, when limits change
228 `#6171 <https://github.com/ipython/ipython/pull/6171>`__
229 `#6171 <https://github.com/ipython/ipython/pull/6171>`__
229 - Unregistering comms in Comm Manager
230 - Unregistering comms in Comm Manager
230 `#6216 <https://github.com/ipython/ipython/pull/6216>`__
231 `#6216 <https://github.com/ipython/ipython/pull/6216>`__
231 - Add EventfulList and EventfulDict trait types.
232 - Add EventfulList and EventfulDict trait types.
232 `#6228 <https://github.com/ipython/ipython/pull/6228>`__
233 `#6228 <https://github.com/ipython/ipython/pull/6228>`__
233 - Remove add/remove\_class and set/get\_css.
234 - Remove add/remove\_class and set/get\_css.
234 `#6235 <https://github.com/ipython/ipython/pull/6235>`__
235 `#6235 <https://github.com/ipython/ipython/pull/6235>`__
235 - avoid unregistering widget model twice
236 - avoid unregistering widget model twice
236 `#6250 <https://github.com/ipython/ipython/pull/6250>`__
237 `#6250 <https://github.com/ipython/ipython/pull/6250>`__
237 - Widget property lock should compare json states, not python states
238 - Widget property lock should compare json states, not python states
238 `#6332 <https://github.com/ipython/ipython/pull/6332>`__
239 `#6332 <https://github.com/ipython/ipython/pull/6332>`__
239 - Strip the IPY\_MODEL\_ prefix from widget IDs before referencing
240 - Strip the IPY\_MODEL\_ prefix from widget IDs before referencing
240 them. `#6377 <https://github.com/ipython/ipython/pull/6377>`__
241 them. `#6377 <https://github.com/ipython/ipython/pull/6377>`__
241 - "event" is not defined error in Firefox
242 - "event" is not defined error in Firefox
242 `#6437 <https://github.com/ipython/ipython/pull/6437>`__
243 `#6437 <https://github.com/ipython/ipython/pull/6437>`__
243 - Javascript link
244 - Javascript link
244 `#6454 <https://github.com/ipython/ipython/pull/6454>`__
245 `#6454 <https://github.com/ipython/ipython/pull/6454>`__
245 - Bulk update of widget attributes
246 - Bulk update of widget attributes
246 `#6463 <https://github.com/ipython/ipython/pull/6463>`__
247 `#6463 <https://github.com/ipython/ipython/pull/6463>`__
247 - Creating a widget registry on the Python side.
248 - Creating a widget registry on the Python side.
248 `#6493 <https://github.com/ipython/ipython/pull/6493>`__
249 `#6493 <https://github.com/ipython/ipython/pull/6493>`__
249 - Allow widget views to be loaded from require modules
250 - Allow widget views to be loaded from require modules
250 `#6494 <https://github.com/ipython/ipython/pull/6494>`__
251 `#6494 <https://github.com/ipython/ipython/pull/6494>`__
251 - Fix Issue #6530
252 - Fix Issue #6530
252 `#6532 <https://github.com/ipython/ipython/pull/6532>`__
253 `#6532 <https://github.com/ipython/ipython/pull/6532>`__
253 - Make comm manager (mostly) independent of InteractiveShell
254 - Make comm manager (mostly) independent of InteractiveShell
254 `#6540 <https://github.com/ipython/ipython/pull/6540>`__
255 `#6540 <https://github.com/ipython/ipython/pull/6540>`__
255 - Add semantic classes to top-level containers for single widgets
256 - Add semantic classes to top-level containers for single widgets
256 `#6609 <https://github.com/ipython/ipython/pull/6609>`__
257 `#6609 <https://github.com/ipython/ipython/pull/6609>`__
257 - Selection Widgets: forcing 'value' to be in 'values'
258 - Selection Widgets: forcing 'value' to be in 'values'
258 `#6617 <https://github.com/ipython/ipython/pull/6617>`__
259 `#6617 <https://github.com/ipython/ipython/pull/6617>`__
259 - Allow widgets to be constructed from Javascript
260 - Allow widgets to be constructed from Javascript
260 `#6664 <https://github.com/ipython/ipython/pull/6664>`__
261 `#6664 <https://github.com/ipython/ipython/pull/6664>`__
261 - Output widget
262 - Output widget
262 `#6670 <https://github.com/ipython/ipython/pull/6670>`__
263 `#6670 <https://github.com/ipython/ipython/pull/6670>`__
263 - Minor change in widgets.less to fix alignment issue
264 - Minor change in widgets.less to fix alignment issue
264 `#6681 <https://github.com/ipython/ipython/pull/6681>`__
265 `#6681 <https://github.com/ipython/ipython/pull/6681>`__
265 - Make Selection widgets respect values order.
266 - Make Selection widgets respect values order.
266 `#6747 <https://github.com/ipython/ipython/pull/6747>`__
267 `#6747 <https://github.com/ipython/ipython/pull/6747>`__
267 - Widget persistence API
268 - Widget persistence API
268 `#6789 <https://github.com/ipython/ipython/pull/6789>`__
269 `#6789 <https://github.com/ipython/ipython/pull/6789>`__
269 - Add promises to the widget framework.
270 - Add promises to the widget framework.
270 `#6818 <https://github.com/ipython/ipython/pull/6818>`__
271 `#6818 <https://github.com/ipython/ipython/pull/6818>`__
271 - SelectMultiple widget
272 - SelectMultiple widget
272 `#6890 <https://github.com/ipython/ipython/pull/6890>`__
273 `#6890 <https://github.com/ipython/ipython/pull/6890>`__
273 - Tooltip on toggle button
274 - Tooltip on toggle button
274 `#6923 <https://github.com/ipython/ipython/pull/6923>`__
275 `#6923 <https://github.com/ipython/ipython/pull/6923>`__
275 - Allow empty text box \*while typing\* for numeric widgets
276 - Allow empty text box \*while typing\* for numeric widgets
276 `#6943 <https://github.com/ipython/ipython/pull/6943>`__
277 `#6943 <https://github.com/ipython/ipython/pull/6943>`__
277 - Ignore failure of widget MathJax typesetting
278 - Ignore failure of widget MathJax typesetting
278 `#6948 <https://github.com/ipython/ipython/pull/6948>`__
279 `#6948 <https://github.com/ipython/ipython/pull/6948>`__
279 - Refactor the do\_diff and manual child view lists into a separate
280 - Refactor the do\_diff and manual child view lists into a separate
280 ViewList object
281 ViewList object
281 `#6990 <https://github.com/ipython/ipython/pull/6990>`__
282 `#6990 <https://github.com/ipython/ipython/pull/6990>`__
282 - Add warning to widget namespace import.
283 - Add warning to widget namespace import.
283 `#7107 <https://github.com/ipython/ipython/pull/7107>`__
284 `#7107 <https://github.com/ipython/ipython/pull/7107>`__
284 - lazy load widgets
285 - lazy load widgets
285 `#7120 <https://github.com/ipython/ipython/pull/7120>`__
286 `#7120 <https://github.com/ipython/ipython/pull/7120>`__
286 - Fix padding of widgets.
287 - Fix padding of widgets.
287 `#7139 <https://github.com/ipython/ipython/pull/7139>`__
288 `#7139 <https://github.com/ipython/ipython/pull/7139>`__
288 - Persist widgets across page refresh
289 - Persist widgets across page refresh
289 `#7163 <https://github.com/ipython/ipython/pull/7163>`__
290 `#7163 <https://github.com/ipython/ipython/pull/7163>`__
290 - Make the widget experimental error a real python warning
291 - Make the widget experimental error a real python warning
291 `#7200 <https://github.com/ipython/ipython/pull/7200>`__
292 `#7200 <https://github.com/ipython/ipython/pull/7200>`__
292 - Make the widget error message shorter and more understandable.
293 - Make the widget error message shorter and more understandable.
293 `#7201 <https://github.com/ipython/ipython/pull/7201>`__
294 `#7201 <https://github.com/ipython/ipython/pull/7201>`__
294 - Make the widget warning brief and easy to filter
295 - Make the widget warning brief and easy to filter
295 `#7204 <https://github.com/ipython/ipython/pull/7204>`__
296 `#7204 <https://github.com/ipython/ipython/pull/7204>`__
296 - Add visual cue for widgets with dead comms
297 - Add visual cue for widgets with dead comms
297 `#7227 <https://github.com/ipython/ipython/pull/7227>`__
298 `#7227 <https://github.com/ipython/ipython/pull/7227>`__
298 - Widget values as positional arguments
299 - Widget values as positional arguments
299 `#7260 <https://github.com/ipython/ipython/pull/7260>`__
300 `#7260 <https://github.com/ipython/ipython/pull/7260>`__
300 - Remove the popup widget
301 - Remove the popup widget
301 `#7341 <https://github.com/ipython/ipython/pull/7341>`__
302 `#7341 <https://github.com/ipython/ipython/pull/7341>`__
302 - document and validate link, dlink
303 - document and validate link, dlink
303 `#7468 <https://github.com/ipython/ipython/pull/7468>`__
304 `#7468 <https://github.com/ipython/ipython/pull/7468>`__
304 - Document interact 5637
305 - Document interact 5637
305 `#7525 <https://github.com/ipython/ipython/pull/7525>`__
306 `#7525 <https://github.com/ipython/ipython/pull/7525>`__
306 - Update some broken examples of using widgets
307 - Update some broken examples of using widgets
307 `#7547 <https://github.com/ipython/ipython/pull/7547>`__
308 `#7547 <https://github.com/ipython/ipython/pull/7547>`__
308 - Use Output widget with Interact
309 - Use Output widget with Interact
309 `#7554 <https://github.com/ipython/ipython/pull/7554>`__
310 `#7554 <https://github.com/ipython/ipython/pull/7554>`__
310 - don't send empty execute\_result messages
311 - don't send empty execute\_result messages
311 `#7560 <https://github.com/ipython/ipython/pull/7560>`__
312 `#7560 <https://github.com/ipython/ipython/pull/7560>`__
312 - Validation on the python side
313 - Validation on the python side
313 `#7602 <https://github.com/ipython/ipython/pull/7602>`__
314 `#7602 <https://github.com/ipython/ipython/pull/7602>`__
314 - only show prompt overlay if there's a prompt
315 - only show prompt overlay if there's a prompt
315 `#7661 <https://github.com/ipython/ipython/pull/7661>`__
316 `#7661 <https://github.com/ipython/ipython/pull/7661>`__
316 - Allow predictate to be used for comparison in selection widgets
317 - Allow predictate to be used for comparison in selection widgets
317 `#7674 <https://github.com/ipython/ipython/pull/7674>`__
318 `#7674 <https://github.com/ipython/ipython/pull/7674>`__
318 - Fix widget view persistence.
319 - Fix widget view persistence.
319 `#7680 <https://github.com/ipython/ipython/pull/7680>`__
320 `#7680 <https://github.com/ipython/ipython/pull/7680>`__
320 - Revert "Use Output widget with Interact"
321 - Revert "Use Output widget with Interact"
321 `#7703 <https://github.com/ipython/ipython/pull/7703>`__
322 `#7703 <https://github.com/ipython/ipython/pull/7703>`__
General Comments 0
You need to be logged in to leave comments. Login now