Upgrade to ExtJS 4.0.7 - Released 10/19/2011
[extjs.git] / docs / guides / upgrade / README.md
1 # Ext JS 4 Upgrade Guide
2
3 Ext 4 is a revolutionary step forward in web app development. Almost every
4 major component within the framework has been improved, in many cases
5 drastically so. There are also many components and subsystems that are brand
6 new since Ext 3. This guide will provide an introduction to all major changes
7 between Ext 3 and 4.
8
9 If you find any issues in this document or would like to provide feedback,
10 please visit the [Ext 3 to 4 Migration][2] thread in the Sencha forums.
11
12 ## General
13
14 These changes apply across both Ext Core and Ext JS.
15
16 ### Ext 3 Compatibility
17
18 Ext 4 is by far the most comprehensive update to Ext JS that we've ever
19 produced, and many changes were required that are not compatible with Ext 3.
20 However, we've gone to great lengths to provide as much backwards-
21 compatibility as possible.
22
23 #### JS Compatibility Layer
24
25 This is an optional JavaScript file that can be referenced after Ext 4 is
26 loaded that will provide the aliases and overrides necessary to make the vast
27 majority of Ext 3 code run correctly under Ext 4 as-is.
28
29 You can download the Ext JS 3 to 4 Migration Pack from the 'Related Downloads'
30 section of the [Ext JS Download page](http://www.sencha.com/products/extjs/download/)
31
32 #### Sandbox Mode
33
34 Ext 4 has introduced changes that now make it possible to completely sandbox
35 previous versions of the framework alongside Ext 4 within the same page. On
36 the JavaScript side, this is possible with the removal of all prototypal
37 enhancements to core JavaScript objects in Ext 4. Now you can simply alias the
38 global Ext object to a different name and be completely isolated from previous
39 Ext versions.
40
41 On the markup/CSS side of things, Ext 4 now uses CSS generated from templates
42 using Compass & SASS, so it is trivial to customize the prefix of all CSS
43 rules defined by the framework. Combined with the new Ext.baseCSSPrefix
44 property, it is now extremely easy to isolate markup generated from multiple
45 versions of Ext on a single page.
46
47 ### Package & Namespace Updates
48
49 All classes and packages have been restructured according to a strict naming
50 convention. This makes classes more consistent and easier to find. For
51 example, in Ext 3 classes like Button, CycleButton and SplitButton are simply
52 grouped under /widgets (along with many other classes). The classes are also
53 defined directly on the global Ext object.
54
55 In Ext 4, every class has been consistently placed into packages and
56 namespaces based on related functionality. This is not entirely new, but was
57 never consistently enforced in Ext 3. Back to the Button example above, in Ext
58 4 these classes are now:
59
60   - Grouped into a single src/button/ package at the file level
61   - Grouped into a new Ext.button namespace in code
62   - Renamed based on the new namspaces (e.g., Ext.SplitButton -> Ext.button.Split)
63
64 All classes that were reorganized are still available via the new
65 alternateClassName property, so Ext 3 classnames will still work under Ext 4
66 if necessary (e.g. alternateClassName: 'Ext.SplitButton'). _Going forward with
67 Ext 4 development it's recommended that you migrate to the new conventions in
68 your own code_.
69
70 ## Ext Core
71
72 ### New Class System
73
74 #### Resources
75
76 [Overview blog post & demo][5]
77
78 Ext of course is already built on a powerful prototype-based class system,
79 which approximates a traditional OO-based class system. In Ext 4 we've taken
80 our class system to a new level of flexibility with the addition of many key
81 features, and best of all the changes are 100% backwards-compatible with the
82 Ext 3 class system. The main new features are:
83
84   - Ext.define to create class definitions within the new system
85   - Automatic dependency management and dynamic class loading
86   - Mixins
87   - Statics
88   - New config option for Automatic setter / getter generation
89
90 {@img ext4-class-system.jpg Ext 4 Class System}
91
92 #### Class Definition
93
94 You can still use the tried and true new ClassName() syntax in Ext 4, but the
95 preferred syntax going forward is to use the new Ext.define function to define
96 new classes. By defining classes explicitly within the Ext class system all of
97 the additional class features in the following sections become enabled. The
98 new keyword will still work, but without those benefits.
99
100 An additional benefit of using Ext.define is that it will automatically detect
101 and create new namespaces as needed, without the need for explicitly defining
102 the namespaces separately from declaring the classes that use them.
103
104 Here's a simple example of the old and new syntax for how you would define a
105 custom class that extends an existing Ext component:
106
107     // Ext 3:
108     Ext.ns('MyApp'); // required in Ext 3
109     MyApp.CustomerPanel = Ext.extend(Ext.Panel, {
110         // etc.
111     });
112
113     // Ext 4
114     Ext.define('MyApp.CustomerPanel', {
115         extend: 'Ext.panel.Panel',
116         // etc.
117     });
118
119 #### Class Loading
120
121 Ext 4 now includes a robust dynamic class loading system that also provides
122 integrated dependency management. Again, this is an optional feature, but
123 provides a couple of key benefits:
124
125   - **Dynamic loading**:
126     Classes can be loaded dynamically and asynchronously at runtime simply
127     based on the dependency tree that Ext manages internally. This means that
128     you can stop managing brittle blocks of manual include tags in HTML pages
129     and simply let the class loader figure out what your page needs to run.
130     This is mostly useful in the development environment when dependency
131     flexibility is more important than page load speed.
132
133   - **Dynamic build generation**:
134     For production, it's usually preferable still to compile down to a single
135     (or few) build files. Since Ext now understands the entire dependency
136     graph at runtime, it can easily output that graph as needed (for example,
137     in the form of a custom build configuration). And even more importantly,
138     this capability is not restricted to the Ext namespace. You can include any
139     number of custom classes and namespaces in addition to Ext and as long as
140     everything is defined using the class system Ext will be able to figure out
141     how they all relate. In the very near future, any Ext developer will have
142     one-click custom build capability that automatically manages the entire
143     Ext + custom application class graph, even as it changes from one minute
144     to the next, and only builds _exactly_ what's actually needed by the app.
145
146 This dynamic loading is enabled simply by using Ext.define and by defining the
147 dependencies in code using two new class properties:
148
149   - requires: The class dependencies required for a class to work. These are guaranteed to be loaded prior to the current class being instantiated.
150   - uses: Optional class dependencies that are used by, but not required by, a class. These can be loaded asynchronously and do not have to be available for the class to be instantiated.
151
152 #### Mixins
153
154 This is a new approach to plugging custom functionality into existing classes.
155 The new mixins config, included during instantiation of a class, allows you to
156 "mix in" new capabilities to the class prototype. This is similar to the
157 existing Ext.override function, although it does not replace existing methods
158 like override does, it simply augments the prototype with whatever is new.
159 Example syntax:
160
161     Ext.define('Sample.Musician', {
162         extend: 'Sample.Person',
163
164         mixins: {
165             guitar: 'Sample.ability.CanPlayGuitar',
166             compose: 'Sample.ability.CanComposeSongs',
167             sing: 'Sample.ability.CanSing'
168         }
169     });
170
171 #### Statics
172
173 Any class can now define static methods simply by defining them in its statics
174 class property.
175
176 #### Config
177
178 In Ext we currently use the term **config** to mean any properties on a class
179 prototype that, by convention, make up its configurable API and can be set by
180 calling code. While this is still true in Ext 4, there is also a new optional
181 config that's actually called config. When configuration properties are added
182 to the config property, it will automatically generate a getter, setter, reset
183 and apply (template method for custom setter logic) methods matching that
184 property. For example, given this code:
185
186     Ext.define('MyClass', {
187         config: {
188             title: 'Default Title'
189         }
190     });
191
192 ...the following methods will get generated automatically behind the scenes:
193
194     title: 'Default Title',
195
196     getTitle: function() {
197         return this.title;
198     },
199
200     resetTitle: function() {
201         this.setTitle('Default Title');
202     },
203
204     setTitle: function(newTitle) {
205        this.title = this.applyTitle(newTitle) || newTitle;
206     },
207
208     applyTitle: function(newTitle) {
209         // custom code here
210         // e.g. Ext.get('titleEl').update(newTitle);
211     }
212
213 ### Env Namespace
214
215 Provides access to comprehensive information about the host browser and
216 operating system, as well as a complete list of modern browser feature
217 detection.
218
219 #### Ext.env.Browser
220
221 This class provides all of the browser metadata (name, engine, version,
222 isStrict, etc.) that used to exist directly on the global Ext object.
223
224 #### Ext.env.FeatureDetector
225
226 This is a brand new class whose functionality did not exist in Ext 3. It
227 provides properties detailing the feature capabilities of the running host
228 environment, primarily to detect the availability of modern HTML5 and CSS3
229 features, as well as mobile features, including:
230
231   - CSS transforms / animations / transitions
232   - SVG / VML
233   - Touch availability / Orientation
234   - Geolocation
235   - SqlDatabase
236   - Websockets
237   - History
238   - Audio
239   - Video
240
241 #### Ext.env.OS
242
243 Identifies the current host operating system, and includes a more
244 comprehensive list than Ext 3 did (adding various mobile OS'es).
245
246 ### Lang Package
247
248 Much of the functionality within this new package existed under Ext 3, but as
249 modifications to core JavaScript object prototypes. While this was convenient,
250 it made it very challenging for Ext to coexist with other frameworks that
251 modified the same objects. It also meant that Ext was directly exposed to any
252 changes that might occur in the ECMAscript specification going forward. To
253 remedy these problems we've completely removed all core JavaScript object
254 modifications and placed them all into appropriately namespaced static classes
255 under the Ext object.
256
257 All of the Prototype enhancements to the following objects have been moved
258 accordingly (note that there is not actually a lang _namespace_ -- it's just
259 the package that holds these new files in the source tree):
260
261   - Array -> Ext.Array
262   - Date -> Ext.Date
263   - Function -> Ext.Function
264   - Number -> Ext.Number
265   - Object -> Ext.Object
266   - String -> Ext.String
267
268 Note that these will all be aliased back to the core object prototypes in the
269 compatibility file, but in order to fully move to Ext 4 and remove the extra
270 compatibility layer the usage of any of the Ext 3 versions of these functions
271 will ultimately have to be updated to the new namespaced versions.
272
273 #### Ext.Function
274
275 There are a few noteworthy changes to how the base Function prototype methods
276 have been implemented in Ext 4. Most importantly, the Function.createDelegate
277 and Function.createCallback methods are now named Ext.Function.bind and
278 Ext.Function.pass respectively. Likewise, Function.defer is now available as
279 Ext.Function.defer. Because these three functions are so commonly used, they
280 are also aliased directly onto the Ext object as Ext.bind, Ext.pass and
281 Ext.defer.
282
283 The other Function methods like createSequence and createInterceptor have also
284 been moved to Ext.Function, and there are also a few new useful additions like
285 createBuffered and createThrottled.
286
287 Here are some examples of how the invocation syntax has changed:
288
289     // Ext 3:
290     myFunction.createDelegate(this, [arg1, arg2]);
291     myFunction.defer(1000, this);
292
293     // Ext 4:
294     Ext.bind(myFunction, this, [arg1, arg2];
295     Ext.defer(myFunction, 1000, this);
296
297 ## Ext JS
298
299 #### Resources
300
301  - [Intro to Ext 4 (video)][7]
302  - [Ext 4 Architecture (video)][8]
303
304 ### General
305
306 #### Adapters
307
308 In previous versions of Ext through version 3 we supported the use of third-
309 party base libraries via adapters. As of Ext 4 this support has been
310 discontinued. Moving forward, Ext Core will be the required foundation for all
311 Ext JS applications. Of course third party libraries may still be optionally
312 used _in addition to_ Ext Core (and in fact this will even work better now
313 that JavaScript object modifications have been removed from Ext), but
314 they will no longer be supported as base library _dependencies_ for Ext.
315
316 #### ARIA
317
318 Ext 4 features a new level of accessibility with full ARIA support baked right
319 into every component in the framework. Ext.Component now has a config property
320 called ariaRole which defaults to "presentation" (meaning the role is simply
321 visual and provides no user interaction functionality) but can be easily
322 overridden as needed. For example, Ext.button.Button overrides the default
323 with ariaRole:'button'. This renders the standard role HTML attribute into the
324 wrapping markup tag and tells screen readers that the contained markup (no
325 matter how complex) functionally represents an action button. This is hugely
326 important for accessibility and is now implemented throughout Ext.
327
328 Another important ARIA hint that is built into Ext.Component is automatic
329 adding/removing of the standard aria-disabled HTML attribute to signify the
330 enabled state of functional UI elements to screen readers.
331
332 ### Data
333
334 The data package has seen a significant upgrade since 3.x. Data is one of the
335 many packages that Ext 4 now shares with Sencha Touch, and there is already a
336 huge amount of information about it available today. Here are a few of the
337 articles that give some background on the new capabilities -- we strongly
338 suggest reading at least the first one before diving into code:
339
340 #### Resources
341
342  - [Ext 4 Data Overview (blog post)][10]
343  - [Models (blog post)][11]
344  - [Proxies (blog post)][12]
345  - [Validations & Associations (blog post)][13]
346
347 #### Overview
348
349 Most of the changes in the data package are non-breaking when including the
350 Ext 3 compatibility file. The biggest updates have come to Store, Proxy and
351 Model, which is the new name for Record:
352
353   - **Store** no longer cares about the format of the data (e.g. no need for
354     JsonStore, XmlStore and other store subclasses). It now delegates all of
355     its loading and saving to the attached Proxy, which now receives the
356     Reader and Writer instances. Store can also perform multi sorting,
357     filtering and grouping dynamically on the client side, and can
358     synchronize itself with your server
359
360   - **Proxy** can now be attached to either a Store or [directly to a Model][14],
361     which makes it easy to manipulate data without a Store. Proxies can be
362     configured with Readers and Writers which decode and encode communications
363     with your server.
364
365   - **Model** is a much more capable version of Record, adding support for
366     [associations, validations and much more][14].
367
368 Ext JS 4 also features the brand new LocalStorageProxy which seamlessly
369 persists your Model data into HTML5 localStorage.
370
371 ### Draw
372
373 This package is entirely new and has no Ext 3 analog. This is an entire
374 library that provides custom drawing capabilities by abstracting the standard
375 SVG and VML engines, choosing the best one available at runtime based on the
376 current browser. This package provides the foundation for the new
377 charting package in Ext 4, but can also easily be used for any type of
378 custom drawing and graphics needs. Here are the major features:
379
380   - HTML5 standards based
381   - Rendering of primitive shapes, text, images, gradients
382   - Library classes for manipulating color, matrix transformations, etc.
383   - Ext.draw.DrawComponent
384
385     - Extends Ext.Component
386     - Engine preference via feature detection
387     - Customizable engine preference order
388     - Layout participation
389
390   - Built-in sprite management via Ext.draw.Sprite
391
392     - Abstracted drawing elements
393     - Normalizes differences between engine API syntax
394     - Attributes
395     - Event support (extends Observable)
396     - Transforms (Rotate, Translate, Scale)
397     - Animation supported through Ext.fx
398     - SpriteComposites
399
400 ### Charting & Visualization
401
402 Charting in Ext 4 is a huge step forward from Ext 3, which did support
403 charting, but only Flash-based. In Ext 4 we've completely removed Flash from
404 the picture, yet retained complete best-of-breed browser support (all the way
405 back to IE6) using Canvas, SVG and VML. The charting engine automatically
406 selects the best engine for the current platform at runtime, and everything is
407 rendered uniformly and with the best possible performance across all supported
408 browsers. More importantly, all charting functions share a single uniform API,
409 regardless of the underlying charting engine in use.
410
411 #### Resources
412
413  - [SenchaCon Overview (video)][16]
414  - [SenchaCon Overview (slides)][17]
415  - {@img working-with-charts.gif Working with Charts}
416
417 ### Fx
418
419 In Ext 3, the Fx class mainly provided a set of useful Element effects (slide,
420 highlight, fade, etc.). In Ext 4 this basic functionality has been retained,
421 but there is an entire Fx package that goes far beyond simple element effects.
422
423 There's now an underlying Animator class that coordinates multiple animations
424 concurrently running on the page.
425
426 Components may now be animated in size and position via new Fx "target"
427 classes (Ext.fx.target.*), which opens up many new possibilities for creating
428 dynamic UI's.
429
430 ### Layout
431
432 #### Resources
433
434  - [Ext 4 Layouts (video)][19]
435  - [Ext 4 Layouts (slides)][20]
436
437 #### ComponentLayout
438
439 Complex components use the new ComponentLayout (as opposed to ContainerLayout,
440 the new name for the traditional Container-based layouts carried over from Ext
441 3) to perform sizing of internal elements in response to resize calls. An
442 example of this is the FieldLayout which manages the size and position of both
443 an associated label and input element within the containing Field Component.
444
445 #### FormLayout
446
447 As of Ext 4, FormLayout is no longer available. See Layout in the Form
448 section later in this document for details.
449
450 #### BorderLayout
451
452 Border layout in Ext 4 is fully backwards-compatible to Ext 3.
453
454 Panel Headers now may be orientated vertically, so east and west regions are
455 replaced on collapse by a vertical header (a full-fledged Ext.panel.Header
456 instance, unlike the simple Element in Ext 3) containing the title rotated by
457 90 degrees (courtesy of Ext 4's new Draw package). The placeholder
458 Header is accessible using the layout's new getPlaceholder method. The
459 placeholder Component is not rendered until the Panel is first collapsed. All
460 the methods of the Ext.panel.Header class are available on it. As a Container
461 subclass, it also inherits all the methods of Container.
462
463 Another small difference is that the cmargins config is no longer supported.
464 The placeholder Header now has the same margins that the expanded Panel did.
465 This makes it easier to create layouts which look good in both collapsed and
466 expanded states by default.
467
468 Internally, the BorderLayout class now uses nested HBox and VBox layouts to
469 create the bordered arrangement, making the layout much more flexible and
470 customizable than it has ever been.
471
472 ### Component
473
474 Any Component subclass may now be configured as floatable using the
475 floating:true config to specify that it floats above the document flow.
476 Floating components may be configured as draggable and/or resizable using the
477 standard configs. They may also be added as child items to any container, in
478 which case they will not participate in the container's layout, but will float
479 above it.
480
481 All floating Components now have their z-index managed by a ZIndexManager.
482 This is the successor to the Ext 3 WindowGroup class. By default, floating
483 components (such as Windows) which are rendered into the document body by
484 having their show method called are managed by the singleton
485 Ext.WindowManager. All floating components therefore have a `toFront` and
486 toBack method which invokes the ZIndexManager.
487
488 Floating components which are added to a specific Container acquire a
489 ZIndexManager reference at render time. They search for an ancestor Container
490 from which to request z-index management. Usually, this will be provided by
491 the singleton Ext.WindowManager, but if the floating component is the
492 descendant of a floating **Container** such as a Window, that Window will
493 create its own ZIndexManager instance, and all floating Components within will
494 be managed relative to the Window's z-index.
495
496 This is a huge improvement over previous versions of Ext, in which complex
497 arrangements of floated containers could quickly lead to z-index conflicts
498 among different components. Now, for example, the dropdowns of combo boxes
499 that are contained in a window will _always_ be correctly managed above that
500 window.
501
502 ### Form
503
504 #### Layout
505
506 In Ext 3 the FormPanel used the FormLayout class for positioning field labels,
507 input boxes, error indicators, etc. In Ext 4 FormLayout has been removed
508 entirely, in favor of using standard layouts for overall arrangement and the
509 new FieldLayout (one of the new ComponentLayout classes) for the field
510 labels etc. This makes it now possible to use any kind of standard layouts
511 within any form, making the creation of custom form layouts exceedingly simple
512 compared to Ext 3.
513
514 The default container layout for FormPanel is now anchor, although any
515 standard layout may now be used within forms.
516
517 #### FieldContainer
518
519 Ext4 also introduces a new class for managing form layouts:
520 Ext.form.FieldContainer. This is a standard Ext.Container which has been
521 enhanced to allow addition of a label and/or an error message, using all the
522 same configurations regarding label and error placement that are supported by
523 Ext.form.Labelable. The container's children will be confined to the same
524 space as the field input would occupy in a real Field. This makes it easy to
525 add any group of arbitrary components to a form and have them line up exactly
526 with the form's fields.
527
528 #### Field as Mixin
529
530 One longstanding difficulty with Ext has been adding non-Field components into
531 a form with field-like capabilities like layout, validation, value management,
532 etc. The only way to easily inherit field behavior in Ext 3 was to subclass
533 Ext.form.Field directly, but in reality many components must subclass
534 something outside of the Field class hiearchy. Since Ext (and JavaScript) has
535 no support for true multiple inheritance, the result is normally copying most
536 if Field's code directly into the custom class, which is non-optimal to say
537 the least.
538
539 Now that Ext 4 supports mixins as part of its updated class system, this
540 is no longer an issue. Field can now be used as a mixin to any other
541 component, making it simple to provide full Field API support to almost
542 anything. And of course you can easily override methods as needed if the
543 default Field behavior needs to be customized (it is common to override
544 getValue and setValue for example).
545
546 #### Validation
547
548 A common desire when building forms is to give the user feedback on the
549 validity of fields as immediately as possible, as the user is entering data.
550 While this could be done in Ext 3, it was clumsy and required using the
551 monitorValid option on FormPanel which was non-optimal for performance because
552 it invoked full-form validation several times per second.
553
554 In Ext 4 we have reworked form validation to make immediate feedback more
555 elegant and performant. This is enabled mainly by implementing a new event
556 flow:
557
558   - Input fields now listen to a set of modern browser events that allow us
559     to detect changes immediately as the user makes them via any possible
560     method, including typing, cutting/pasting, and dragging text into the
561     field. We handle these events and roll them up together, firing the
562     field's changeevent when a change in its value is observed (discussed
563     further below).
564   - Each field validates itself when its value changes. When its validity
565     changes from valid to invalid or vice-versa, it fires a new
566     validitychange event.
567   - When any of the validitychange events fired by the fields causes the
568     overall validity of the enclosing form to change, the BasicForm fires
569     a validitychange event of its own.
570
571 This new event flow allows for immediate feedback to users regarding the
572 validity of the form, and because it is based on events rather than polling,
573 performance is excellent. Therefore, this is now the default behavior (it had
574 to be enabled explicitly in Ext 3), though it can of course be easily
575 disabled.
576
577 There are still situations, however, in which polling may still be useful.
578 Some browsers (notably Opera and older versions of Safari) do not always fire
579 events when fields are edited in certain ways such as cutting/pasting via the
580 context menu. To handle these edge cases, you can use the new pollForChanges
581 config on FormPanel to set up interval polling for changes to field values;
582 this triggers the same event flow above. While polling is still not great for
583 performance, this is less intensive than Ext 3's polling because it only
584 checks for value changes, rather than forcing validation (and therefore value
585 parsing, conversion, and pattern matching) each time.
586
587 The validation of each field is now triggered when a change in the field's
588 value is detected (assuming the validateOnChange config is left enabled). The
589 browser events used to detect value changes are defined by the
590 checkChangeEvents config, and are set to the following by default:
591
592   - change and propertychange for Internet Explorer
593   - change, input, textInput, keyup, and dragdrop for all other browsers
594
595 This set of events successfully detects nearly all user-initiated changes
596 across the set of supported browsers. The only known exceptions at the time of
597 writing are:
598
599   - Safari 3.2 and older: cut/paste in textareas via the context menu, and
600     dragging text into textareas
601   - Opera 10 and 11: dragging text into text fields and textareas, and cut
602     via the context menu in text fields and textareas
603   - Opera 9: Same as Opera 10 and 11, plus paste from context menu in text
604     fields and textareas
605
606 If you must absolutely ensure that changes triggered by the above actions also
607 trigger validation, you can use FormPanel's pollForChanges and pollInterval
608 configs, and/or startPolling and stopPolling methods to check for changes on a
609 timer.
610
611 Ext 3 supported the formBind property on buttons added to the form via the
612 buttons property, which allows them to be automatically enabled/disabled as
613 the form's validity changes. In Ext 4, this has been expanded so that formBind
614 may be specified on _any component_ that is added anywhere in the FormPanel.
615
616 #### FieldDefaults
617
618 One time-saving feature of the old Ext 3 FormLayout was that it allowed
619 developers to configure the layout of all fields within the form from a single
620 config, using the hideLabels, labelAlign, etc. config properties of FormPanel.
621 Since Ext 4 now uses the standard layouts for form containers, it would be
622 much less convenient to have to specify common field layout properties again
623 and again for each field or container. Therefore FormPanel now has a
624 fieldDefaults config object, which specifies values that will be used as
625 default configs for all fields at any depth within the FormPanel.
626
627 #### BasicForm
628
629 While BasicForm was most often limited to internal use by FormPanel in Ext 3,
630 it has been refactored in Ext 4 to make it more flexible and more easily
631 extended. It no longer requires its associated container to provide a `<form>`
632 element around all the fields, and does not require its container to manually
633 notify the BasicForm when adding or removing fields. It is therefore now
634 completely decoupled from FormPanel, and can potentially be used to manage
635 form fields within any Container.
636
637 ### Grid
638
639 The grid components have been rewritten from the ground up for Ext 4. While
640 this was for good reason and the benefits will be well worth it, unfortunately
641 this is one of the areas in Ext 4 where full backwards compatibility could not
642 be practically maintained. A complete migration guide will be provided to
643 assist with the transition from Ext 3 to 4 grids.
644
645 #### Intelligent Rendering
646
647 Ext 3's grid works fantastically well, but takes the "least common
648 denominator" approach to its rich feature support by always generating the
649 full markup needed by every grid feature (which is overly-heavy in most
650 cases). Ext 4 takes a much more intelligent approach to this problem. The
651 default basic grid has very lightweight markup, and only as developers enable
652 different features will the additional feature-specific markup be rendered.
653 This is a huge boost both for page rendering speed and overall grid
654 performance.
655
656 #### Standardized Layout
657
658 Along with a smarter rendering pipeline, many portions of the new grid have
659 been made into proper Components and integrated into the standard layout
660 management system rather than relying on custom internal markup and CSS. This
661 enables us to unify grid's rendering process with the rest of the framework,
662 while still retaining a pixel-perfect UI experience.
663
664 One useful example of this is the new HeaderContainer class. In Ext 3 column
665 headers were baked into the grid and not very customizable. In Ext 4 the
666 column headers are true Containers and now use a standard HBox layout,
667 allowing you to do things like provide custom flex values per column.
668
669 #### Feature Support
670
671 In Ext 3, it was easy to add new functionality to grids, but there was no
672 single strategy for doing so. Many added features were provided as plugins,
673 but then some were provided via subclassing. This made it very difficult (if
674 not impossible) to combine certain features easily.
675
676 Ext 4 includes a new grid base class called Ext.grid.Feature which provides
677 the basis for creating extremely flexible optional grid features. The
678 underlying templates can now be modified by any Feature classes in order to
679 decorate or mutate the markup that the GridView generates. Features provide a
680 powerful alternative to subclassing the old GridView because it makes it easy
681 to mix and match compatible features.
682
683 Some examples of the features now available in the Ext 4 grid are:
684
685   - RowWrap
686   - RowBody
687   - Grouping
688   - Chunking/Buffering
689
690 #### Virtual Scrolling
691
692 The Ext 4 grid now natively supports buffering its data during rendering,
693 providing a virtual, load-on-demand view of its data. Grids will now easily
694 support hundreds or even thousands of records without paging, which will be a
695 massive improvement over Ext 3's grid capabilities.
696
697 #### Editing Improvements
698
699 In Ext 3 you had to use the specialized EditorGrid class to provide an
700 editable grid, which limited its flexibility. In Ext 4 there is now an Editing
701 plugin that can be applied to any grid instance, making it completely reusable
702 across all grids.
703
704 As part of the editing improvements, the popular RowEditor extension from Ext
705 3 has been promoted to a first-class and fully-supported framework component
706 in Ext 4.
707
708 #### DataView
709
710 The new GridView in Ext 4 extends the standard DataView class now. This not
711 only minimizes duplicated code internally, it also makes the new grid even
712 easier to customize. Because it extends DataView the new grid is also able to
713 leverage the same selection models as any view, including discontinguous
714 selection via keyboard navigation. The Home, End, PageDown and PageUp keys are
715 also fully supported.
716
717 ### Panel
718
719 #### Docking Support
720
721 Panel now uses a panel-specific ComponentLayout class to manage a set of items
722 docked to its borders. The Panel's `body` element is then sized to occupy any
723 remaining space. Any components may be docked to any side of a panel via the
724 new dockedItems config property, and docked items must be configured with a
725 `dock` property to specify which border to dock to. This allows for amazingly
726 flexible Panel layouts now -- things that were impossible in Ext 3 like
727 vertically-docked side toolbars are now a breeze to implement in Ext 4.
728
729 #### Header Improvements
730
731 Header is now a first-class Container subclass, inheriting capabilities like
732 child component management and layout. Headers may also be configured with a
733 headerPosition of 'top', 'right', 'bottom' or 'left' via the new docking
734 support.
735
736 Tools (the small header buttons that perform actions like minimize, close,
737 etc.) are also now proper Components making them even more flexible than they
738 were in Ext 3.
739
740 ### Resizer
741
742 Ext has had handle-based resizing built-in since the earliest days of the
743 framework, but through Ext 3 it was limited to resizing DOM elements only. Now
744 in Ext 4 any Component can be resized via the new Ext.resizer.Resizer and its
745 associated components. This is mainly useful when applied to floating
746 components, or components programmatically rendered outside of Ext's Container
747 system.
748
749 By configuring a component with resizable:true, resize handles are
750 automatically added to the Component's edges. By default a proxy element is
751 resized using the mouse, and the Component is resized on mouse up. Behavior of
752 the resizer can be modified by specifying the `resizable` property as a config
753 object for the Resizer class.
754
755 ### ComponentDragger
756
757 Ext has always had extensive drag-and-drop support, but primarily at the DOM
758 element level. In Ext 4, any Component can now easily be made draggable as
759 well via the new Ext.util.ComponentDragger class. This is mainly useful for
760 floating components, or components programmatically rendered outside of Ext's
761 Container system.
762
763 By configuring a component with draggable:true, it automatically becomes
764 draggable with the mouse. Panels that are made draggable by this method
765 (Windows configure themselves as draggable by default) show an empty ghost
766 during the drag operation and the Panel or Window is shown in the new position
767 on mouse up. Behavior of the dragger can be modified by specifying the
768 draggable property as a config object for the ComponentDragger class.
769
770 ### Splitter
771
772 Both the HBox and VBox layouts may contain Ext.resizer.Splitter components
773 which are used to manage the size of their adjacent siblings. Minimum and
774 maximum size settings are supported. By default, resizing a flexed item of a
775 box layout sets its size in pixels and deletes the flex value. **One** of the
776 splitter's two adjacent siblings may be configured with `maintainFlex:true` to
777 preserve its flex value after the resize operation.
778
779 ### TabPanel
780
781 As with many other components in Ext 4, the main pieces that make up a
782 TabPanel have now been made into first-class Components in Ext 4. The Tab
783 itself, just a DOM element in Ext 3, is now a Button subclass. The TabBar that
784 contains the tabs is now a Container. These changes provide much more
785 flexibility over Ext 3.
786
787 Because tabs are now separate components from the contained child panels that
788 hold the tab content, individual tab panels can now optionally show their own
789 title header bars separately from their tab titles. This was impossible in Ext
790 3.
791
792 ### Toolbar
793
794 Toolbar is now a first-class Container, which will make adding new components
795 and customizing its layout much easier than in Ext 3.
796
797 ## Theming
798
799 The theming in Ext has always been amazing, but not as easy to customize as it
800 could be. Ext 3 made strides in this area by separating structural and visual
801 stylesheets, but there is still quite a bit of duplication, browser-specific
802 override rules, and many other issues that are simply weaknesses of the CSS
803 language itself.
804
805 #### Resources
806
807  - [Ext 4 Theming (video)](http://vimeo.com/19159630)
808  - [Ext 4 Theming (slides)](http://www.slideshare.net/senchainc/slides-5971886)
809
810 ### Compass & SASS
811
812 For Ext 4 we've completely retooled the theming system, switching to
813 [Compass][27] and [SASS][28] as the primary CSS authoring tools internally.
814 SASS is a superset of standard CSS that adds support for many advanced
815 features:
816
817   - Nested selectors
818   - Variables
819   - Mixins
820   - Selector inheritance
821   - Compiled and easily compressed
822   - Ability to completely remove CSS for components not needed by your specific application
823
824 ### Markup Changes
825
826 Ext now supports browser/version-specific markup for most components, which is
827 a great advance from Ext 3.
828
829 ## Documentation
830
831   - Support for new class system constructs (requires, mixins, etc.)
832   - Support for @deprected members
833   - History navigation support
834   - Embedded examples, videos, etc.
835   - Favorite topics
836   - Multiple framework / version support
837   - Local search
838
839    [2]: http://www.sencha.com/forum/showthread.php?124015-Ext-3-to-4-Migration (Ext 3 to 4 Migration)
840    [5]: http://www.sencha.com/blog/countdown-to-ext-js-4-dynamic-loading-and-new-class-system
841    [7]: http://vimeo.com/17666102
842    [8]: http://vimeo.com/17733892
843    [10]: http://www.sencha.com/blog/countdown-to-ext-js-4-data-package/
844    [11]: http://www.sencha.com/blog/ext-js-4-anatomy-of-a-model/
845    [12]: http://edspencer.net/2011/02/proxies-extjs-4.html
846    [13]: http://www.sencha.com/blog/using-validations-and-associations-in-sencha-touch/
847    [14]: http://www.sencha.com/blog/ext-js-4-anatomy-of-a-model
848    [16]: http://vimeo.com/17673342
849    [17]: http://www.slideshare.net/senchainc/charts-5971878
850    [19]: http://vimeo.com/17917111
851    [20]: http://www.slideshare.net/senchainc/layouts-5971880
852    [25]: http://vimeo.com/19159630
853    [26]: http://www.slideshare.net/senchainc/slides-5971886
854    [27]: http://compass-style.org/ (Compass)
855    [28]: http://sass-lang.com/ (Sass: Syntactically Awesome Stylesheets)
856