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