extjs-rails 4.1.0.alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE +36 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/app/assets/javascripts/extjs-rails/extjs-rails.js +1 -0
- data/app/assets/javascripts/extjs-rails/index.js.erb +9 -0
- data/app/assets/javascripts/extjs-rails/sdk.jsb3 +2017 -0
- data/app/assets/javascripts/extjs-rails/src/AbstractComponent.js +3290 -0
- data/app/assets/javascripts/extjs-rails/src/AbstractManager.js +144 -0
- data/app/assets/javascripts/extjs-rails/src/AbstractPlugin.js +72 -0
- data/app/assets/javascripts/extjs-rails/src/Action.js +276 -0
- data/app/assets/javascripts/extjs-rails/src/Ajax.js +99 -0
- data/app/assets/javascripts/extjs-rails/src/Component.js +1344 -0
- data/app/assets/javascripts/extjs-rails/src/ComponentLoader.js +202 -0
- data/app/assets/javascripts/extjs-rails/src/ComponentManager.js +47 -0
- data/app/assets/javascripts/extjs-rails/src/ComponentQuery.js +521 -0
- data/app/assets/javascripts/extjs-rails/src/Editor.js +494 -0
- data/app/assets/javascripts/extjs-rails/src/ElementLoader.js +404 -0
- data/app/assets/javascripts/extjs-rails/src/FocusManager.js +712 -0
- data/app/assets/javascripts/extjs-rails/src/Img.js +111 -0
- data/app/assets/javascripts/extjs-rails/src/Layer.js +543 -0
- data/app/assets/javascripts/extjs-rails/src/LoadMask.js +432 -0
- data/app/assets/javascripts/extjs-rails/src/ModelManager.js +186 -0
- data/app/assets/javascripts/extjs-rails/src/PluginManager.js +110 -0
- data/app/assets/javascripts/extjs-rails/src/ProgressBar.js +336 -0
- data/app/assets/javascripts/extjs-rails/src/Shadow.js +233 -0
- data/app/assets/javascripts/extjs-rails/src/ShadowPool.js +43 -0
- data/app/assets/javascripts/extjs-rails/src/Template.js +331 -0
- data/app/assets/javascripts/extjs-rails/src/XTemplate.js +365 -0
- data/app/assets/javascripts/extjs-rails/src/XTemplateCompiler.js +450 -0
- data/app/assets/javascripts/extjs-rails/src/XTemplateParser.js +249 -0
- data/app/assets/javascripts/extjs-rails/src/ZIndexManager.js +519 -0
- data/app/assets/javascripts/extjs-rails/src/app/Application.js +271 -0
- data/app/assets/javascripts/extjs-rails/src/app/Controller.js +458 -0
- data/app/assets/javascripts/extjs-rails/src/app/EventBus.js +112 -0
- data/app/assets/javascripts/extjs-rails/src/button/Button.js +1483 -0
- data/app/assets/javascripts/extjs-rails/src/button/Cycle.js +215 -0
- data/app/assets/javascripts/extjs-rails/src/button/Split.js +99 -0
- data/app/assets/javascripts/extjs-rails/src/chart/Callout.js +140 -0
- data/app/assets/javascripts/extjs-rails/src/chart/Chart.js +966 -0
- data/app/assets/javascripts/extjs-rails/src/chart/Highlight.js +172 -0
- data/app/assets/javascripts/extjs-rails/src/chart/Label.js +241 -0
- data/app/assets/javascripts/extjs-rails/src/chart/Legend.js +474 -0
- data/app/assets/javascripts/extjs-rails/src/chart/LegendItem.js +217 -0
- data/app/assets/javascripts/extjs-rails/src/chart/Mask.js +230 -0
- data/app/assets/javascripts/extjs-rails/src/chart/MaskLayer.js +48 -0
- data/app/assets/javascripts/extjs-rails/src/chart/Navigation.js +79 -0
- data/app/assets/javascripts/extjs-rails/src/chart/Shape.js +106 -0
- data/app/assets/javascripts/extjs-rails/src/chart/Tip.js +98 -0
- data/app/assets/javascripts/extjs-rails/src/chart/TipSurface.js +42 -0
- data/app/assets/javascripts/extjs-rails/src/chart/axis/Abstract.js +73 -0
- data/app/assets/javascripts/extjs-rails/src/chart/axis/Axis.js +961 -0
- data/app/assets/javascripts/extjs-rails/src/chart/axis/Category.js +130 -0
- data/app/assets/javascripts/extjs-rails/src/chart/axis/Gauge.js +203 -0
- data/app/assets/javascripts/extjs-rails/src/chart/axis/Numeric.js +235 -0
- data/app/assets/javascripts/extjs-rails/src/chart/axis/Radial.js +204 -0
- data/app/assets/javascripts/extjs-rails/src/chart/axis/Time.js +135 -0
- data/app/assets/javascripts/extjs-rails/src/chart/series/Area.js +803 -0
- data/app/assets/javascripts/extjs-rails/src/chart/series/Bar.js +853 -0
- data/app/assets/javascripts/extjs-rails/src/chart/series/Cartesian.js +328 -0
- data/app/assets/javascripts/extjs-rails/src/chart/series/Column.js +104 -0
- data/app/assets/javascripts/extjs-rails/src/chart/series/Gauge.js +490 -0
- data/app/assets/javascripts/extjs-rails/src/chart/series/Line.js +1104 -0
- data/app/assets/javascripts/extjs-rails/src/chart/series/Pie.js +1072 -0
- data/app/assets/javascripts/extjs-rails/src/chart/series/Radar.js +440 -0
- data/app/assets/javascripts/extjs-rails/src/chart/series/Scatter.js +668 -0
- data/app/assets/javascripts/extjs-rails/src/chart/series/Series.js +443 -0
- data/app/assets/javascripts/extjs-rails/src/chart/theme/Base.js +175 -0
- data/app/assets/javascripts/extjs-rails/src/chart/theme/Theme.js +253 -0
- data/app/assets/javascripts/extjs-rails/src/container/AbstractContainer.js +1062 -0
- data/app/assets/javascripts/extjs-rails/src/container/ButtonGroup.js +143 -0
- data/app/assets/javascripts/extjs-rails/src/container/Container.js +212 -0
- data/app/assets/javascripts/extjs-rails/src/container/DockingContainer.js +265 -0
- data/app/assets/javascripts/extjs-rails/src/container/Viewport.js +184 -0
- data/app/assets/javascripts/extjs-rails/src/core/dom/Element.form.js +50 -0
- data/app/assets/javascripts/extjs-rails/src/core/dom/Element.static-more.js +159 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/index.html +321 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/index.js +6 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/CTO.js +25 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/CoolGuy.js +20 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Developer.js +43 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Gun.js +3 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/HumanResource.js +23 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Musician.js +20 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Person.js +50 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanComposeSongs.js +9 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanPlayGuitar.js +9 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanSing.js +18 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/A.js +3 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/B.js +3 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/C.js +3 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/D.js +3 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/E.js +3 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/A.js +3 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/B.js +4 -0
- data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/C.js +3 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/EventManager.js +1167 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/EventObject.js +883 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/Ext-more.js +1283 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/Ext.js +736 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/Support.js +662 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/class/Base.js +1085 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/class/Class.js +676 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/class/ClassManager.js +1591 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/class/Loader.js +1423 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.alignment.js +173 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.insertion.js +193 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.js +681 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.position.js +356 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.static.js +474 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.style.js +851 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.traversal.js +180 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractHelper.js +291 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractQuery.js +72 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/CompositeElement.js +75 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/CompositeElementLite.js +436 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/dom/DomQuery-aria.js +1049 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/env/Browser.js +186 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/env/FeatureDetector.js +274 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/env/OS.js +141 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/lang/Array.js +1205 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/lang/Date.js +1463 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/lang/Error.js +326 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/lang/Function.js +485 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/lang/Number.js +175 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/lang/Object.js +606 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/lang/String.js +333 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/misc/JSON.js +236 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/perf/Accumulator.js +244 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/perf/Monitor.js +197 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/util/DelayedTask.js +71 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/util/Event.js +215 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/util/Format.js +551 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/util/TaskManager.js +417 -0
- data/app/assets/javascripts/extjs-rails/src/core/src/version/Version.js +364 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/README.MD +91 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/bootstrap.js +39 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/build/build-data.js +34 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/build/build.sh +2 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/data.js +27 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/index.html +15 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom.html +40 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/extjs-api.js +12 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/platform-api.js +134 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/sanity.js +4 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/touch-api-out.js +128 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/touch-api.js +89 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/env/Environment.js +357 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/APITest.js +37 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/jsb3.js +14 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/test-setup.js +137 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/EventManager.js +629 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext-mess.backup +198 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext-more.js +520 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext.js +1550 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Support.js +250 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/Base.js +47 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/Class.js +561 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/ClassManager.js +555 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/CompositeElementLite.js +409 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/DomHelper.js +444 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.insertion.js +342 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.js +731 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.static.js +201 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.style.js +118 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.traversal.js +336 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Array.js +1229 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Date.js +697 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Error.js +277 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Function.js +536 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Number.js +323 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Object.js +591 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/String.js +451 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/misc/JSON.js +252 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/util/Format.js +521 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/version/Version.js +148 -0
- data/app/assets/javascripts/extjs-rails/src/core/test/unit/specs.html +19 -0
- data/app/assets/javascripts/extjs-rails/src/data/AbstractStore.js +887 -0
- data/app/assets/javascripts/extjs-rails/src/data/ArrayStore.js +74 -0
- data/app/assets/javascripts/extjs-rails/src/data/Batch.js +236 -0
- data/app/assets/javascripts/extjs-rails/src/data/BufferStore.js +13 -0
- data/app/assets/javascripts/extjs-rails/src/data/Connection.js +969 -0
- data/app/assets/javascripts/extjs-rails/src/data/DirectStore.js +50 -0
- data/app/assets/javascripts/extjs-rails/src/data/Errors.js +52 -0
- data/app/assets/javascripts/extjs-rails/src/data/Field.js +341 -0
- data/app/assets/javascripts/extjs-rails/src/data/IdGenerator.js +198 -0
- data/app/assets/javascripts/extjs-rails/src/data/JsonP.js +253 -0
- data/app/assets/javascripts/extjs-rails/src/data/JsonPStore.js +51 -0
- data/app/assets/javascripts/extjs-rails/src/data/JsonStore.js +60 -0
- data/app/assets/javascripts/extjs-rails/src/data/Model.js +1673 -0
- data/app/assets/javascripts/extjs-rails/src/data/NodeInterface.js +1294 -0
- data/app/assets/javascripts/extjs-rails/src/data/NodeStore.js +254 -0
- data/app/assets/javascripts/extjs-rails/src/data/Operation.js +331 -0
- data/app/assets/javascripts/extjs-rails/src/data/Request.js +40 -0
- data/app/assets/javascripts/extjs-rails/src/data/ResultSet.js +56 -0
- data/app/assets/javascripts/extjs-rails/src/data/SequentialIdGenerator.js +61 -0
- data/app/assets/javascripts/extjs-rails/src/data/SortTypes.js +125 -0
- data/app/assets/javascripts/extjs-rails/src/data/Store.js +2609 -0
- data/app/assets/javascripts/extjs-rails/src/data/StoreManager.js +156 -0
- data/app/assets/javascripts/extjs-rails/src/data/Tree.js +290 -0
- data/app/assets/javascripts/extjs-rails/src/data/TreeStore.js +655 -0
- data/app/assets/javascripts/extjs-rails/src/data/Types.js +190 -0
- data/app/assets/javascripts/extjs-rails/src/data/UuidGenerator.js +215 -0
- data/app/assets/javascripts/extjs-rails/src/data/XmlStore.js +76 -0
- data/app/assets/javascripts/extjs-rails/src/data/association/Association.js +243 -0
- data/app/assets/javascripts/extjs-rails/src/data/association/BelongsTo.js +291 -0
- data/app/assets/javascripts/extjs-rails/src/data/association/HasMany.js +289 -0
- data/app/assets/javascripts/extjs-rails/src/data/association/HasOne.js +304 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/Ajax.js +282 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/Client.js +21 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/Direct.js +181 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/JsonP.js +313 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/LocalStorage.js +69 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/Memory.js +156 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/Proxy.js +433 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/Rest.js +173 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/Server.js +460 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/SessionStorage.js +39 -0
- data/app/assets/javascripts/extjs-rails/src/data/proxy/WebStorage.js +546 -0
- data/app/assets/javascripts/extjs-rails/src/data/reader/Array.js +68 -0
- data/app/assets/javascripts/extjs-rails/src/data/reader/Json.js +383 -0
- data/app/assets/javascripts/extjs-rails/src/data/reader/Reader.js +735 -0
- data/app/assets/javascripts/extjs-rails/src/data/reader/Xml.js +292 -0
- data/app/assets/javascripts/extjs-rails/src/data/validations.js +149 -0
- data/app/assets/javascripts/extjs-rails/src/data/writer/Json.js +81 -0
- data/app/assets/javascripts/extjs-rails/src/data/writer/Writer.js +147 -0
- data/app/assets/javascripts/extjs-rails/src/data/writer/Xml.js +88 -0
- data/app/assets/javascripts/extjs-rails/src/dd/DD.js +300 -0
- data/app/assets/javascripts/extjs-rails/src/dd/DDProxy.js +204 -0
- data/app/assets/javascripts/extjs-rails/src/dd/DDTarget.js +171 -0
- data/app/assets/javascripts/extjs-rails/src/dd/DragDrop.js +1101 -0
- data/app/assets/javascripts/extjs-rails/src/dd/DragDropManager.js +1264 -0
- data/app/assets/javascripts/extjs-rails/src/dd/DragSource.js +392 -0
- data/app/assets/javascripts/extjs-rails/src/dd/DragTracker.js +562 -0
- data/app/assets/javascripts/extjs-rails/src/dd/DragZone.js +137 -0
- data/app/assets/javascripts/extjs-rails/src/dd/DropTarget.js +118 -0
- data/app/assets/javascripts/extjs-rails/src/dd/DropZone.js +254 -0
- data/app/assets/javascripts/extjs-rails/src/dd/Registry.js +117 -0
- data/app/assets/javascripts/extjs-rails/src/dd/ScrollManager.js +218 -0
- data/app/assets/javascripts/extjs-rails/src/dd/StatusProxy.js +179 -0
- data/app/assets/javascripts/extjs-rails/src/diag/layout/Context.js +523 -0
- data/app/assets/javascripts/extjs-rails/src/diag/layout/ContextItem.js +179 -0
- data/app/assets/javascripts/extjs-rails/src/direct/Event.js +35 -0
- data/app/assets/javascripts/extjs-rails/src/direct/ExceptionEvent.js +16 -0
- data/app/assets/javascripts/extjs-rails/src/direct/JsonProvider.js +82 -0
- data/app/assets/javascripts/extjs-rails/src/direct/Manager.js +263 -0
- data/app/assets/javascripts/extjs-rails/src/direct/PollingProvider.js +156 -0
- data/app/assets/javascripts/extjs-rails/src/direct/Provider.js +96 -0
- data/app/assets/javascripts/extjs-rails/src/direct/RemotingEvent.js +24 -0
- data/app/assets/javascripts/extjs-rails/src/direct/RemotingMethod.js +100 -0
- data/app/assets/javascripts/extjs-rails/src/direct/RemotingProvider.js +510 -0
- data/app/assets/javascripts/extjs-rails/src/direct/Transaction.js +41 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Element.alignment.js +378 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Element.anim.js +962 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Element.dd.js +40 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Element.fx.js +194 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Element.js +1407 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Element.position.js +501 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Element.scroll.js +214 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Element.style.js +792 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Element.traversal.js +8 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Helper.js +466 -0
- data/app/assets/javascripts/extjs-rails/src/dom/Query.js +1067 -0
- data/app/assets/javascripts/extjs-rails/src/draw/Color.js +303 -0
- data/app/assets/javascripts/extjs-rails/src/draw/Component.js +245 -0
- data/app/assets/javascripts/extjs-rails/src/draw/CompositeSprite.js +299 -0
- data/app/assets/javascripts/extjs-rails/src/draw/Draw.js +1217 -0
- data/app/assets/javascripts/extjs-rails/src/draw/Matrix.js +183 -0
- data/app/assets/javascripts/extjs-rails/src/draw/Sprite.js +554 -0
- data/app/assets/javascripts/extjs-rails/src/draw/SpriteDD.js +87 -0
- data/app/assets/javascripts/extjs-rails/src/draw/Surface.js +1001 -0
- data/app/assets/javascripts/extjs-rails/src/draw/Text.js +175 -0
- data/app/assets/javascripts/extjs-rails/src/draw/engine/ImageExporter.js +106 -0
- data/app/assets/javascripts/extjs-rails/src/draw/engine/Svg.js +734 -0
- data/app/assets/javascripts/extjs-rails/src/draw/engine/SvgExporter.js +280 -0
- data/app/assets/javascripts/extjs-rails/src/draw/engine/Vml.js +916 -0
- data/app/assets/javascripts/extjs-rails/src/flash/Component.js +248 -0
- data/app/assets/javascripts/extjs-rails/src/form/Basic.js +1018 -0
- data/app/assets/javascripts/extjs-rails/src/form/CheckboxGroup.js +441 -0
- data/app/assets/javascripts/extjs-rails/src/form/CheckboxManager.js +26 -0
- data/app/assets/javascripts/extjs-rails/src/form/FieldAncestor.js +210 -0
- data/app/assets/javascripts/extjs-rails/src/form/FieldContainer.js +290 -0
- data/app/assets/javascripts/extjs-rails/src/form/FieldSet.js +506 -0
- data/app/assets/javascripts/extjs-rails/src/form/Label.js +110 -0
- data/app/assets/javascripts/extjs-rails/src/form/Labelable.js +764 -0
- data/app/assets/javascripts/extjs-rails/src/form/Panel.js +335 -0
- data/app/assets/javascripts/extjs-rails/src/form/RadioGroup.js +124 -0
- data/app/assets/javascripts/extjs-rails/src/form/RadioManager.js +26 -0
- data/app/assets/javascripts/extjs-rails/src/form/action/Action.js +307 -0
- data/app/assets/javascripts/extjs-rails/src/form/action/DirectLoad.js +107 -0
- data/app/assets/javascripts/extjs-rails/src/form/action/DirectSubmit.js +119 -0
- data/app/assets/javascripts/extjs-rails/src/form/action/Load.js +120 -0
- data/app/assets/javascripts/extjs-rails/src/form/action/StandardSubmit.js +34 -0
- data/app/assets/javascripts/extjs-rails/src/form/action/Submit.js +257 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Base.js +813 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Checkbox.js +505 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/ComboBox.js +1427 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Date.js +578 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Display.js +155 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Field.js +430 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/File.js +265 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Hidden.js +75 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/HtmlEditor.js +1439 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Number.js +380 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Picker.js +321 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Radio.js +279 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Spinner.js +321 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Text.js +727 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/TextArea.js +228 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Time.js +459 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/Trigger.js +469 -0
- data/app/assets/javascripts/extjs-rails/src/form/field/VTypes.js +172 -0
- data/app/assets/javascripts/extjs-rails/src/fx/Anim.js +472 -0
- data/app/assets/javascripts/extjs-rails/src/fx/Animator.js +410 -0
- data/app/assets/javascripts/extjs-rails/src/fx/CubicBezier.js +77 -0
- data/app/assets/javascripts/extjs-rails/src/fx/Easing.js +136 -0
- data/app/assets/javascripts/extjs-rails/src/fx/Manager.js +353 -0
- data/app/assets/javascripts/extjs-rails/src/fx/PropertyHandler.js +381 -0
- data/app/assets/javascripts/extjs-rails/src/fx/Queue.js +123 -0
- data/app/assets/javascripts/extjs-rails/src/fx/target/Component.js +118 -0
- data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeElement.js +46 -0
- data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeElementCSS.js +22 -0
- data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeSprite.js +34 -0
- data/app/assets/javascripts/extjs-rails/src/fx/target/Element.js +83 -0
- data/app/assets/javascripts/extjs-rails/src/fx/target/ElementCSS.js +77 -0
- data/app/assets/javascripts/extjs-rails/src/fx/target/Sprite.js +128 -0
- data/app/assets/javascripts/extjs-rails/src/fx/target/Target.js +36 -0
- data/app/assets/javascripts/extjs-rails/src/grid/CellEditor.js +172 -0
- data/app/assets/javascripts/extjs-rails/src/grid/ColumnComponentLayout.js +34 -0
- data/app/assets/javascripts/extjs-rails/src/grid/ColumnLayout.js +201 -0
- data/app/assets/javascripts/extjs-rails/src/grid/Lockable.js +863 -0
- data/app/assets/javascripts/extjs-rails/src/grid/LockingView.js +169 -0
- data/app/assets/javascripts/extjs-rails/src/grid/PagingScroller.js +539 -0
- data/app/assets/javascripts/extjs-rails/src/grid/Panel.js +393 -0
- data/app/assets/javascripts/extjs-rails/src/grid/RowEditor.js +731 -0
- data/app/assets/javascripts/extjs-rails/src/grid/RowNumberer.js +76 -0
- data/app/assets/javascripts/extjs-rails/src/grid/Scroller.js +5 -0
- data/app/assets/javascripts/extjs-rails/src/grid/View.js +44 -0
- data/app/assets/javascripts/extjs-rails/src/grid/ViewDropZone.js +41 -0
- data/app/assets/javascripts/extjs-rails/src/grid/column/Action.js +318 -0
- data/app/assets/javascripts/extjs-rails/src/grid/column/Boolean.js +82 -0
- data/app/assets/javascripts/extjs-rails/src/grid/column/Column.js +835 -0
- data/app/assets/javascripts/extjs-rails/src/grid/column/Date.js +63 -0
- data/app/assets/javascripts/extjs-rails/src/grid/column/Number.js +52 -0
- data/app/assets/javascripts/extjs-rails/src/grid/column/Template.js +58 -0
- data/app/assets/javascripts/extjs-rails/src/grid/feature/AbstractSummary.js +154 -0
- data/app/assets/javascripts/extjs-rails/src/grid/feature/Chunking.js +77 -0
- data/app/assets/javascripts/extjs-rails/src/grid/feature/Feature.js +158 -0
- data/app/assets/javascripts/extjs-rails/src/grid/feature/Grouping.js +822 -0
- data/app/assets/javascripts/extjs-rails/src/grid/feature/GroupingSummary.js +243 -0
- data/app/assets/javascripts/extjs-rails/src/grid/feature/RowBody.js +116 -0
- data/app/assets/javascripts/extjs-rails/src/grid/feature/RowWrap.js +120 -0
- data/app/assets/javascripts/extjs-rails/src/grid/feature/Summary.js +167 -0
- data/app/assets/javascripts/extjs-rails/src/grid/header/Container.js +965 -0
- data/app/assets/javascripts/extjs-rails/src/grid/header/DragZone.js +69 -0
- data/app/assets/javascripts/extjs-rails/src/grid/header/DropZone.js +265 -0
- data/app/assets/javascripts/extjs-rails/src/grid/plugin/CellEditing.js +453 -0
- data/app/assets/javascripts/extjs-rails/src/grid/plugin/DragDrop.js +254 -0
- data/app/assets/javascripts/extjs-rails/src/grid/plugin/Editing.js +561 -0
- data/app/assets/javascripts/extjs-rails/src/grid/plugin/HeaderReorderer.js +49 -0
- data/app/assets/javascripts/extjs-rails/src/grid/plugin/HeaderResizer.js +292 -0
- data/app/assets/javascripts/extjs-rails/src/grid/plugin/RowEditing.js +339 -0
- data/app/assets/javascripts/extjs-rails/src/grid/property/Grid.js +351 -0
- data/app/assets/javascripts/extjs-rails/src/grid/property/HeaderContainer.js +109 -0
- data/app/assets/javascripts/extjs-rails/src/grid/property/Property.js +36 -0
- data/app/assets/javascripts/extjs-rails/src/grid/property/Store.js +141 -0
- data/app/assets/javascripts/extjs-rails/src/layout/ClassList.js +90 -0
- data/app/assets/javascripts/extjs-rails/src/layout/Context.js +1232 -0
- data/app/assets/javascripts/extjs-rails/src/layout/ContextItem.js +1470 -0
- data/app/assets/javascripts/extjs-rails/src/layout/Layout.js +761 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/Auto.js +220 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/Body.js +80 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/BoundList.js +95 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/Button.js +261 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/Component.js +427 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/Dock.js +1132 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/Draw.js +79 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/FieldSet.js +62 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/ProgressBar.js +54 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/Tab.js +23 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/field/ComboBox.js +52 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/field/Field.js +372 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/field/FieldContainer.js +48 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/field/HtmlEditor.js +54 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/field/Slider.js +58 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/field/Text.js +75 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/field/TextArea.js +51 -0
- data/app/assets/javascripts/extjs-rails/src/layout/component/field/Trigger.js +132 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Absolute.js +121 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Accordion.js +308 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Anchor.js +403 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Auto.js +70 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Border-old-js +1079 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Border.js +816 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Box.js +929 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Card.js +361 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/CheckboxGroup.js +376 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Column.js +234 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Container.js +961 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Editor.js +74 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Fit.js +287 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Form.js +157 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/HBox.js +134 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/Table.js +412 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/VBox.js +139 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/Menu.js +365 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/None.js +83 -0
- data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/Scroller.js +475 -0
- data/app/assets/javascripts/extjs-rails/src/menu/CheckItem.js +169 -0
- data/app/assets/javascripts/extjs-rails/src/menu/ColorPicker.js +110 -0
- data/app/assets/javascripts/extjs-rails/src/menu/DatePicker.js +100 -0
- data/app/assets/javascripts/extjs-rails/src/menu/Item.js +553 -0
- data/app/assets/javascripts/extjs-rails/src/menu/KeyNav.js +134 -0
- data/app/assets/javascripts/extjs-rails/src/menu/Manager.js +219 -0
- data/app/assets/javascripts/extjs-rails/src/menu/Menu.js +579 -0
- data/app/assets/javascripts/extjs-rails/src/menu/Separator.js +126 -0
- data/app/assets/javascripts/extjs-rails/src/panel/AbstractPanel.js +323 -0
- data/app/assets/javascripts/extjs-rails/src/panel/DD.js +99 -0
- data/app/assets/javascripts/extjs-rails/src/panel/Header.js +518 -0
- data/app/assets/javascripts/extjs-rails/src/panel/Panel.js +2150 -0
- data/app/assets/javascripts/extjs-rails/src/panel/Proxy.js +131 -0
- data/app/assets/javascripts/extjs-rails/src/panel/Table.js +1018 -0
- data/app/assets/javascripts/extjs-rails/src/panel/Tool.js +304 -0
- data/app/assets/javascripts/extjs-rails/src/picker/Color.js +219 -0
- data/app/assets/javascripts/extjs-rails/src/picker/Date.js +1140 -0
- data/app/assets/javascripts/extjs-rails/src/picker/Month.js +490 -0
- data/app/assets/javascripts/extjs-rails/src/picker/Time.js +165 -0
- data/app/assets/javascripts/extjs-rails/src/resizer/BorderSplitter.js +22 -0
- data/app/assets/javascripts/extjs-rails/src/resizer/BorderSplitterTracker.js +210 -0
- data/app/assets/javascripts/extjs-rails/src/resizer/Handle.js +29 -0
- data/app/assets/javascripts/extjs-rails/src/resizer/ResizeTracker.js +346 -0
- data/app/assets/javascripts/extjs-rails/src/resizer/Resizer.js +477 -0
- data/app/assets/javascripts/extjs-rails/src/resizer/Splitter.js +242 -0
- data/app/assets/javascripts/extjs-rails/src/resizer/SplitterTracker.js +230 -0
- data/app/assets/javascripts/extjs-rails/src/selection/CellModel.js +395 -0
- data/app/assets/javascripts/extjs-rails/src/selection/CheckboxModel.js +234 -0
- data/app/assets/javascripts/extjs-rails/src/selection/DataViewModel.js +160 -0
- data/app/assets/javascripts/extjs-rails/src/selection/Model.js +646 -0
- data/app/assets/javascripts/extjs-rails/src/selection/RowModel.js +499 -0
- data/app/assets/javascripts/extjs-rails/src/selection/TreeModel.js +78 -0
- data/app/assets/javascripts/extjs-rails/src/slider/Multi.js +835 -0
- data/app/assets/javascripts/extjs-rails/src/slider/Single.js +56 -0
- data/app/assets/javascripts/extjs-rails/src/slider/Thumb.js +259 -0
- data/app/assets/javascripts/extjs-rails/src/slider/Tip.js +130 -0
- data/app/assets/javascripts/extjs-rails/src/state/CookieProvider.js +120 -0
- data/app/assets/javascripts/extjs-rails/src/state/LocalStorageProvider.js +72 -0
- data/app/assets/javascripts/extjs-rails/src/state/Manager.js +70 -0
- data/app/assets/javascripts/extjs-rails/src/state/Provider.js +182 -0
- data/app/assets/javascripts/extjs-rails/src/state/Stateful.js +364 -0
- data/app/assets/javascripts/extjs-rails/src/tab/Bar.js +258 -0
- data/app/assets/javascripts/extjs-rails/src/tab/Panel.js +654 -0
- data/app/assets/javascripts/extjs-rails/src/tab/Tab.js +358 -0
- data/app/assets/javascripts/extjs-rails/src/tail.js +10 -0
- data/app/assets/javascripts/extjs-rails/src/tip/QuickTip.js +335 -0
- data/app/assets/javascripts/extjs-rails/src/tip/QuickTipManager.js +239 -0
- data/app/assets/javascripts/extjs-rails/src/tip/Tip.js +160 -0
- data/app/assets/javascripts/extjs-rails/src/tip/ToolTip.js +691 -0
- data/app/assets/javascripts/extjs-rails/src/toolbar/Fill.js +28 -0
- data/app/assets/javascripts/extjs-rails/src/toolbar/Item.js +16 -0
- data/app/assets/javascripts/extjs-rails/src/toolbar/Paging.js +600 -0
- data/app/assets/javascripts/extjs-rails/src/toolbar/Separator.js +23 -0
- data/app/assets/javascripts/extjs-rails/src/toolbar/Spacer.js +33 -0
- data/app/assets/javascripts/extjs-rails/src/toolbar/TextItem.js +57 -0
- data/app/assets/javascripts/extjs-rails/src/toolbar/Toolbar-legacy.js +123 -0
- data/app/assets/javascripts/extjs-rails/src/toolbar/Toolbar.js +447 -0
- data/app/assets/javascripts/extjs-rails/src/tree/Column.js +90 -0
- data/app/assets/javascripts/extjs-rails/src/tree/Panel.js +505 -0
- data/app/assets/javascripts/extjs-rails/src/tree/View.js +658 -0
- data/app/assets/javascripts/extjs-rails/src/tree/ViewDragZone.js +49 -0
- data/app/assets/javascripts/extjs-rails/src/tree/ViewDropZone.js +287 -0
- data/app/assets/javascripts/extjs-rails/src/tree/plugin/TreeViewDragDrop.js +244 -0
- data/app/assets/javascripts/extjs-rails/src/util/AbstractMixedCollection.js +772 -0
- data/app/assets/javascripts/extjs-rails/src/util/Animate.js +426 -0
- data/app/assets/javascripts/extjs-rails/src/util/Bindable.js +102 -0
- data/app/assets/javascripts/extjs-rails/src/util/CSS.js +185 -0
- data/app/assets/javascripts/extjs-rails/src/util/ClickRepeater.js +238 -0
- data/app/assets/javascripts/extjs-rails/src/util/ComponentDragger.js +126 -0
- data/app/assets/javascripts/extjs-rails/src/util/Cookies.js +91 -0
- data/app/assets/javascripts/extjs-rails/src/util/ElementContainer.js +293 -0
- data/app/assets/javascripts/extjs-rails/src/util/Filter.js +159 -0
- data/app/assets/javascripts/extjs-rails/src/util/Floating.js +321 -0
- data/app/assets/javascripts/extjs-rails/src/util/Grouper.js +26 -0
- data/app/assets/javascripts/extjs-rails/src/util/HashMap.js +356 -0
- data/app/assets/javascripts/extjs-rails/src/util/History.js +285 -0
- data/app/assets/javascripts/extjs-rails/src/util/Inflector.js +297 -0
- data/app/assets/javascripts/extjs-rails/src/util/KeyMap.js +427 -0
- data/app/assets/javascripts/extjs-rails/src/util/KeyNav.js +239 -0
- data/app/assets/javascripts/extjs-rails/src/util/LruCache.js +257 -0
- data/app/assets/javascripts/extjs-rails/src/util/Memento.js +131 -0
- data/app/assets/javascripts/extjs-rails/src/util/MixedCollection.js +239 -0
- data/app/assets/javascripts/extjs-rails/src/util/Observable.js +1003 -0
- data/app/assets/javascripts/extjs-rails/src/util/Offset.js +60 -0
- data/app/assets/javascripts/extjs-rails/src/util/Point.js +93 -0
- data/app/assets/javascripts/extjs-rails/src/util/ProtoElement.js +205 -0
- data/app/assets/javascripts/extjs-rails/src/util/Queue.js +76 -0
- data/app/assets/javascripts/extjs-rails/src/util/Region.js +388 -0
- data/app/assets/javascripts/extjs-rails/src/util/Renderable.js +1079 -0
- data/app/assets/javascripts/extjs-rails/src/util/Sortable.js +248 -0
- data/app/assets/javascripts/extjs-rails/src/util/Sorter.js +179 -0
- data/app/assets/javascripts/extjs-rails/src/util/TextMetrics.js +148 -0
- data/app/assets/javascripts/extjs-rails/src/view/AbstractView.js +1103 -0
- data/app/assets/javascripts/extjs-rails/src/view/BoundList.js +207 -0
- data/app/assets/javascripts/extjs-rails/src/view/BoundListKeyNav.js +92 -0
- data/app/assets/javascripts/extjs-rails/src/view/DragZone.js +106 -0
- data/app/assets/javascripts/extjs-rails/src/view/DropZone.js +240 -0
- data/app/assets/javascripts/extjs-rails/src/view/Table.js +1229 -0
- data/app/assets/javascripts/extjs-rails/src/view/TableChunker.js +139 -0
- data/app/assets/javascripts/extjs-rails/src/view/View.js +636 -0
- data/app/assets/javascripts/extjs-rails/src/window/MessageBox.js +880 -0
- data/app/assets/javascripts/extjs-rails/src/window/Window-legacy.js +56 -0
- data/app/assets/javascripts/extjs-rails/src/window/Window.js +793 -0
- data/extjs-rails.gemspec +24 -0
- data/lib/extjs-rails.rb +7 -0
- data/lib/extjs-rails/engine.rb +7 -0
- data/lib/extjs-rails/version.rb +5 -0
- metadata +660 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author Ed Spencer
|
|
3
|
+
* @class Ext.data.association.HasMany
|
|
4
|
+
*
|
|
5
|
+
* <p>Represents a one-to-many relationship between two models. Usually created indirectly via a model definition:</p>
|
|
6
|
+
*
|
|
7
|
+
<pre><code>
|
|
8
|
+
Ext.define('Product', {
|
|
9
|
+
extend: 'Ext.data.Model',
|
|
10
|
+
fields: [
|
|
11
|
+
{name: 'id', type: 'int'},
|
|
12
|
+
{name: 'user_id', type: 'int'},
|
|
13
|
+
{name: 'name', type: 'string'}
|
|
14
|
+
]
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
Ext.define('User', {
|
|
18
|
+
extend: 'Ext.data.Model',
|
|
19
|
+
fields: [
|
|
20
|
+
{name: 'id', type: 'int'},
|
|
21
|
+
{name: 'name', type: 'string'}
|
|
22
|
+
],
|
|
23
|
+
// we can use the hasMany shortcut on the model to create a hasMany association
|
|
24
|
+
hasMany: {model: 'Product', name: 'products'}
|
|
25
|
+
});
|
|
26
|
+
</pre></code>
|
|
27
|
+
*
|
|
28
|
+
* <p>Above we created Product and User models, and linked them by saying that a User hasMany Products. This gives
|
|
29
|
+
* us a new function on every User instance, in this case the function is called 'products' because that is the name
|
|
30
|
+
* we specified in the association configuration above.</p>
|
|
31
|
+
*
|
|
32
|
+
* <p>This new function returns a specialized {@link Ext.data.Store Store} which is automatically filtered to load
|
|
33
|
+
* only Products for the given model instance:</p>
|
|
34
|
+
*
|
|
35
|
+
<pre><code>
|
|
36
|
+
//first, we load up a User with id of 1
|
|
37
|
+
var user = Ext.create('User', {id: 1, name: 'Ed'});
|
|
38
|
+
|
|
39
|
+
//the user.products function was created automatically by the association and returns a {@link Ext.data.Store Store}
|
|
40
|
+
//the created store is automatically scoped to the set of Products for the User with id of 1
|
|
41
|
+
var products = user.products();
|
|
42
|
+
|
|
43
|
+
//we still have all of the usual Store functions, for example it's easy to add a Product for this User
|
|
44
|
+
products.add({
|
|
45
|
+
name: 'Another Product'
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
//saves the changes to the store - this automatically sets the new Product's user_id to 1 before saving
|
|
49
|
+
products.sync();
|
|
50
|
+
</code></pre>
|
|
51
|
+
*
|
|
52
|
+
* <p>The new Store is only instantiated the first time you call products() to conserve memory and processing time,
|
|
53
|
+
* though calling products() a second time returns the same store instance.</p>
|
|
54
|
+
*
|
|
55
|
+
* <p><u>Custom filtering</u></p>
|
|
56
|
+
*
|
|
57
|
+
* <p>The Store is automatically furnished with a filter - by default this filter tells the store to only return
|
|
58
|
+
* records where the associated model's foreign key matches the owner model's primary key. For example, if a User
|
|
59
|
+
* with ID = 100 hasMany Products, the filter loads only Products with user_id == 100.</p>
|
|
60
|
+
*
|
|
61
|
+
* <p>Sometimes we want to filter by another field - for example in the case of a Twitter search application we may
|
|
62
|
+
* have models for Search and Tweet:</p>
|
|
63
|
+
*
|
|
64
|
+
<pre><code>
|
|
65
|
+
Ext.define('Search', {
|
|
66
|
+
extend: 'Ext.data.Model',
|
|
67
|
+
fields: [
|
|
68
|
+
'id', 'query'
|
|
69
|
+
],
|
|
70
|
+
|
|
71
|
+
hasMany: {
|
|
72
|
+
model: 'Tweet',
|
|
73
|
+
name : 'tweets',
|
|
74
|
+
filterProperty: 'query'
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
Ext.define('Tweet', {
|
|
79
|
+
extend: 'Ext.data.Model',
|
|
80
|
+
fields: [
|
|
81
|
+
'id', 'text', 'from_user'
|
|
82
|
+
]
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
//returns a Store filtered by the filterProperty
|
|
86
|
+
var store = new Search({query: 'Sencha Touch'}).tweets();
|
|
87
|
+
</code></pre>
|
|
88
|
+
*
|
|
89
|
+
* <p>The tweets association above is filtered by the query property by setting the {@link #filterProperty}, and is
|
|
90
|
+
* equivalent to this:</p>
|
|
91
|
+
*
|
|
92
|
+
<pre><code>
|
|
93
|
+
var store = Ext.create('Ext.data.Store', {
|
|
94
|
+
model: 'Tweet',
|
|
95
|
+
filters: [
|
|
96
|
+
{
|
|
97
|
+
property: 'query',
|
|
98
|
+
value : 'Sencha Touch'
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
});
|
|
102
|
+
</code></pre>
|
|
103
|
+
*/
|
|
104
|
+
Ext.define('Ext.data.association.HasMany', {
|
|
105
|
+
extend: 'Ext.data.association.Association',
|
|
106
|
+
alternateClassName: 'Ext.data.HasManyAssociation',
|
|
107
|
+
requires: ['Ext.util.Inflector'],
|
|
108
|
+
|
|
109
|
+
alias: 'association.hasmany',
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @cfg {String} foreignKey The name of the foreign key on the associated model that links it to the owner
|
|
113
|
+
* model. Defaults to the lowercased name of the owner model plus "_id", e.g. an association with a where a
|
|
114
|
+
* model called Group hasMany Users would create 'group_id' as the foreign key. When the remote store is loaded,
|
|
115
|
+
* the store is automatically filtered so that only records with a matching foreign key are included in the
|
|
116
|
+
* resulting child store. This can be overridden by specifying the {@link #filterProperty}.
|
|
117
|
+
* <pre><code>
|
|
118
|
+
Ext.define('Group', {
|
|
119
|
+
extend: 'Ext.data.Model',
|
|
120
|
+
fields: ['id', 'name'],
|
|
121
|
+
hasMany: 'User'
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
Ext.define('User', {
|
|
125
|
+
extend: 'Ext.data.Model',
|
|
126
|
+
fields: ['id', 'name', 'group_id'], // refers to the id of the group that this user belongs to
|
|
127
|
+
belongsTo: 'Group'
|
|
128
|
+
});
|
|
129
|
+
* </code></pre>
|
|
130
|
+
*/
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @cfg {String} name The name of the function to create on the owner model to retrieve the child store.
|
|
134
|
+
* If not specified, the pluralized name of the child model is used.
|
|
135
|
+
* <pre><code>
|
|
136
|
+
// This will create a users() method on any Group model instance
|
|
137
|
+
Ext.define('Group', {
|
|
138
|
+
extend: 'Ext.data.Model',
|
|
139
|
+
fields: ['id', 'name'],
|
|
140
|
+
hasMany: 'User'
|
|
141
|
+
});
|
|
142
|
+
var group = new Group();
|
|
143
|
+
console.log(group.users());
|
|
144
|
+
|
|
145
|
+
// The method to retrieve the users will now be getUserList
|
|
146
|
+
Ext.define('Group', {
|
|
147
|
+
extend: 'Ext.data.Model',
|
|
148
|
+
fields: ['id', 'name'],
|
|
149
|
+
hasMany: {model: 'User', name: 'getUserList'}
|
|
150
|
+
});
|
|
151
|
+
var group = new Group();
|
|
152
|
+
console.log(group.getUserList());
|
|
153
|
+
* </code></pre>
|
|
154
|
+
*/
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @cfg {Object} storeConfig Optional configuration object that will be passed to the generated Store. Defaults to
|
|
158
|
+
* undefined.
|
|
159
|
+
*/
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* @cfg {String} filterProperty Optionally overrides the default filter that is set up on the associated Store. If
|
|
163
|
+
* this is not set, a filter is automatically created which filters the association based on the configured
|
|
164
|
+
* {@link #foreignKey}. See intro docs for more details. Defaults to undefined
|
|
165
|
+
*/
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @cfg {Boolean} autoLoad True to automatically load the related store from a remote source when instantiated.
|
|
169
|
+
* Defaults to <tt>false</tt>.
|
|
170
|
+
*/
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* @cfg {String} type The type configuration can be used when creating associations using a configuration object.
|
|
174
|
+
* Use 'hasMany' to create a HasMany association
|
|
175
|
+
* <pre><code>
|
|
176
|
+
associations: [{
|
|
177
|
+
type: 'hasMany',
|
|
178
|
+
model: 'User'
|
|
179
|
+
}]
|
|
180
|
+
* </code></pre>
|
|
181
|
+
*/
|
|
182
|
+
|
|
183
|
+
constructor: function(config) {
|
|
184
|
+
var me = this,
|
|
185
|
+
ownerProto,
|
|
186
|
+
name;
|
|
187
|
+
|
|
188
|
+
me.callParent(arguments);
|
|
189
|
+
|
|
190
|
+
me.name = me.name || Ext.util.Inflector.pluralize(me.associatedName.toLowerCase());
|
|
191
|
+
|
|
192
|
+
ownerProto = me.ownerModel.prototype;
|
|
193
|
+
name = me.name;
|
|
194
|
+
|
|
195
|
+
Ext.applyIf(me, {
|
|
196
|
+
storeName : name + "Store",
|
|
197
|
+
foreignKey: me.ownerName.toLowerCase() + "_id"
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
ownerProto[name] = me.createStore();
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* @private
|
|
205
|
+
* Creates a function that returns an Ext.data.Store which is configured to load a set of data filtered
|
|
206
|
+
* by the owner model's primary key - e.g. in a hasMany association where Group hasMany Users, this function
|
|
207
|
+
* returns a Store configured to return the filtered set of a single Group's Users.
|
|
208
|
+
* @return {Function} The store-generating function
|
|
209
|
+
*/
|
|
210
|
+
createStore: function() {
|
|
211
|
+
var that = this,
|
|
212
|
+
associatedModel = that.associatedModel,
|
|
213
|
+
storeName = that.storeName,
|
|
214
|
+
foreignKey = that.foreignKey,
|
|
215
|
+
primaryKey = that.primaryKey,
|
|
216
|
+
filterProperty = that.filterProperty,
|
|
217
|
+
autoLoad = that.autoLoad,
|
|
218
|
+
storeConfig = that.storeConfig || {};
|
|
219
|
+
|
|
220
|
+
return function() {
|
|
221
|
+
var me = this,
|
|
222
|
+
config, filter,
|
|
223
|
+
modelDefaults = {};
|
|
224
|
+
|
|
225
|
+
if (me[storeName] === undefined) {
|
|
226
|
+
if (filterProperty) {
|
|
227
|
+
filter = {
|
|
228
|
+
property : filterProperty,
|
|
229
|
+
value : me.get(filterProperty),
|
|
230
|
+
exactMatch: true
|
|
231
|
+
};
|
|
232
|
+
} else {
|
|
233
|
+
filter = {
|
|
234
|
+
property : foreignKey,
|
|
235
|
+
value : me.get(primaryKey),
|
|
236
|
+
exactMatch: true
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
modelDefaults[foreignKey] = me.get(primaryKey);
|
|
241
|
+
|
|
242
|
+
config = Ext.apply({}, storeConfig, {
|
|
243
|
+
model : associatedModel,
|
|
244
|
+
filters : [filter],
|
|
245
|
+
remoteFilter : false,
|
|
246
|
+
modelDefaults: modelDefaults
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
me[storeName] = new Ext.data.Store(config);
|
|
250
|
+
if (autoLoad) {
|
|
251
|
+
me[storeName].load();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return me[storeName];
|
|
256
|
+
};
|
|
257
|
+
},
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Read associated data
|
|
261
|
+
* @private
|
|
262
|
+
* @param {Ext.data.Model} record The record we're writing to
|
|
263
|
+
* @param {Ext.data.reader.Reader} reader The reader for the associated model
|
|
264
|
+
* @param {Object} associationData The raw associated data
|
|
265
|
+
*/
|
|
266
|
+
read: function(record, reader, associationData){
|
|
267
|
+
var store = record[this.name](),
|
|
268
|
+
inverse,
|
|
269
|
+
items, iLen, i;
|
|
270
|
+
|
|
271
|
+
store.add(reader.read(associationData).records);
|
|
272
|
+
|
|
273
|
+
//now that we've added the related records to the hasMany association, set the inverse belongsTo
|
|
274
|
+
//association on each of them if it exists
|
|
275
|
+
inverse = this.associatedModel.prototype.associations.findBy(function(assoc){
|
|
276
|
+
return assoc.type === 'belongsTo' && assoc.associatedName === record.$className;
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
//if the inverse association was found, set it now on each record we've just created
|
|
280
|
+
if (inverse) {
|
|
281
|
+
items = store.data.items;
|
|
282
|
+
iLen = items.length;
|
|
283
|
+
|
|
284
|
+
for (i = 0; i < iLen; i++) {
|
|
285
|
+
items[i][inverse.instanceName] = record;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
});
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @class Ext.data.association.HasOne
|
|
3
|
+
*
|
|
4
|
+
* Represents a one to one association with another model. The owner model is expected to have
|
|
5
|
+
* a foreign key which references the primary key of the associated model:
|
|
6
|
+
*
|
|
7
|
+
* Ext.define('Address', {
|
|
8
|
+
* extend: 'Ext.data.Model',
|
|
9
|
+
* fields: [
|
|
10
|
+
* { name: 'id', type: 'int' },
|
|
11
|
+
* { name: 'number', type: 'string' },
|
|
12
|
+
* { name: 'street', type: 'string' },
|
|
13
|
+
* { name: 'city', type: 'string' },
|
|
14
|
+
* { name: 'zip', type: 'string' },
|
|
15
|
+
* ]
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* Ext.define('Person', {
|
|
19
|
+
* extend: 'Ext.data.Model',
|
|
20
|
+
* fields: [
|
|
21
|
+
* { name: 'id', type: 'int' },
|
|
22
|
+
* { name: 'name', type: 'string' },
|
|
23
|
+
* { name: 'address_id', type: 'int'}
|
|
24
|
+
* ],
|
|
25
|
+
* // we can use the hasOne shortcut on the model to create a hasOne association
|
|
26
|
+
* associations: { type: 'hasOne', model: 'Address' }
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* In the example above we have created models for People and Addresses, and linked them together
|
|
30
|
+
* by saying that each Person has a single Address. This automatically links each Person to an Address
|
|
31
|
+
* based on the Persons address_id, and provides new functions on the Person model:
|
|
32
|
+
*
|
|
33
|
+
* ## Generated getter function
|
|
34
|
+
*
|
|
35
|
+
* The first function that is added to the owner model is a getter function:
|
|
36
|
+
*
|
|
37
|
+
* var person = new Person({
|
|
38
|
+
* id: 100,
|
|
39
|
+
* address_id: 20,
|
|
40
|
+
* name: 'John Smith'
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* person.getAddress(function(address, operation) {
|
|
44
|
+
* // do something with the address object
|
|
45
|
+
* alert(address.get('id')); // alerts 20
|
|
46
|
+
* }, this);
|
|
47
|
+
*
|
|
48
|
+
* The getAddress function was created on the Person model when we defined the association. This uses the
|
|
49
|
+
* Persons configured {@link Ext.data.proxy.Proxy proxy} to load the Address asynchronously, calling the provided
|
|
50
|
+
* callback when it has loaded.
|
|
51
|
+
*
|
|
52
|
+
* The new getAddress function will also accept an object containing success, failure and callback properties
|
|
53
|
+
* - callback will always be called, success will only be called if the associated model was loaded successfully
|
|
54
|
+
* and failure will only be called if the associatied model could not be loaded:
|
|
55
|
+
*
|
|
56
|
+
* person.getAddress({
|
|
57
|
+
* reload: true, // force a reload if the owner model is already cached
|
|
58
|
+
* callback: function(address, operation) {}, // a function that will always be called
|
|
59
|
+
* success : function(address, operation) {}, // a function that will only be called if the load succeeded
|
|
60
|
+
* failure : function(address, operation) {}, // a function that will only be called if the load did not succeed
|
|
61
|
+
* scope : this // optionally pass in a scope object to execute the callbacks in
|
|
62
|
+
* });
|
|
63
|
+
*
|
|
64
|
+
* In each case above the callbacks are called with two arguments - the associated model instance and the
|
|
65
|
+
* {@link Ext.data.Operation operation} object that was executed to load that instance. The Operation object is
|
|
66
|
+
* useful when the instance could not be loaded.
|
|
67
|
+
*
|
|
68
|
+
* Once the getter has been called on the model, it will be cached if the getter is called a second time. To
|
|
69
|
+
* force the model to reload, specify reload: true in the options object.
|
|
70
|
+
*
|
|
71
|
+
* ## Generated setter function
|
|
72
|
+
*
|
|
73
|
+
* The second generated function sets the associated model instance - if only a single argument is passed to
|
|
74
|
+
* the setter then the following two calls are identical:
|
|
75
|
+
*
|
|
76
|
+
* // this call...
|
|
77
|
+
* person.setAddress(10);
|
|
78
|
+
*
|
|
79
|
+
* // is equivalent to this call:
|
|
80
|
+
* person.set('address_id', 10);
|
|
81
|
+
*
|
|
82
|
+
* An instance of the owner model can also be passed as a parameter.
|
|
83
|
+
*
|
|
84
|
+
* If we pass in a second argument, the model will be automatically saved and the second argument passed to
|
|
85
|
+
* the owner model's {@link Ext.data.Model#save save} method:
|
|
86
|
+
*
|
|
87
|
+
* person.setAddress(10, function(address, operation) {
|
|
88
|
+
* // the address has been saved
|
|
89
|
+
* alert(address.get('address_id')); //now alerts 10
|
|
90
|
+
* });
|
|
91
|
+
*
|
|
92
|
+
* //alternative syntax:
|
|
93
|
+
* person.setAddress(10, {
|
|
94
|
+
* callback: function(address, operation), // a function that will always be called
|
|
95
|
+
* success : function(address, operation), // a function that will only be called if the load succeeded
|
|
96
|
+
* failure : function(address, operation), // a function that will only be called if the load did not succeed
|
|
97
|
+
* scope : this //optionally pass in a scope object to execute the callbacks in
|
|
98
|
+
* })
|
|
99
|
+
*
|
|
100
|
+
* ## Customisation
|
|
101
|
+
*
|
|
102
|
+
* Associations reflect on the models they are linking to automatically set up properties such as the
|
|
103
|
+
* {@link #primaryKey} and {@link #foreignKey}. These can alternatively be specified:
|
|
104
|
+
*
|
|
105
|
+
* Ext.define('Person', {
|
|
106
|
+
* fields: [...],
|
|
107
|
+
*
|
|
108
|
+
* associations: [
|
|
109
|
+
* { type: 'hasOne', model: 'Address', primaryKey: 'unique_id', foreignKey: 'addr_id' }
|
|
110
|
+
* ]
|
|
111
|
+
* });
|
|
112
|
+
*
|
|
113
|
+
* Here we replaced the default primary key (defaults to 'id') and foreign key (calculated as 'address_id')
|
|
114
|
+
* with our own settings. Usually this will not be needed.
|
|
115
|
+
*/
|
|
116
|
+
Ext.define('Ext.data.association.HasOne', {
|
|
117
|
+
extend: 'Ext.data.association.Association',
|
|
118
|
+
alternateClassName: 'Ext.data.HasOneAssociation',
|
|
119
|
+
|
|
120
|
+
alias: 'association.hasone',
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @cfg {String} foreignKey The name of the foreign key on the owner model that links it to the associated
|
|
124
|
+
* model. Defaults to the lowercased name of the associated model plus "_id", e.g. an association with a
|
|
125
|
+
* model called Person would set up a address_id foreign key.
|
|
126
|
+
*
|
|
127
|
+
* Ext.define('Person', {
|
|
128
|
+
* extend: 'Ext.data.Model',
|
|
129
|
+
* fields: ['id', 'name', 'address_id'], // refers to the id of the address object
|
|
130
|
+
* hasOne: 'Address'
|
|
131
|
+
* });
|
|
132
|
+
*
|
|
133
|
+
* Ext.define('Address', {
|
|
134
|
+
* extend: 'Ext.data.Model',
|
|
135
|
+
* fields: ['id', 'number', 'street', 'city', 'zip'],
|
|
136
|
+
* belongsTo: 'Person'
|
|
137
|
+
* });
|
|
138
|
+
* var Person = new Person({
|
|
139
|
+
* id: 1,
|
|
140
|
+
* name: 'John Smith',
|
|
141
|
+
* address_id: 13
|
|
142
|
+
* }, 1);
|
|
143
|
+
* person.getAddress(); // Will make a call to the server asking for address_id 13
|
|
144
|
+
*
|
|
145
|
+
*/
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @cfg {String} getterName The name of the getter function that will be added to the local model's prototype.
|
|
149
|
+
* Defaults to 'get' + the name of the foreign model, e.g. getAddress
|
|
150
|
+
*/
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* @cfg {String} setterName The name of the setter function that will be added to the local model's prototype.
|
|
154
|
+
* Defaults to 'set' + the name of the foreign model, e.g. setAddress
|
|
155
|
+
*/
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* @cfg {String} type The type configuration can be used when creating associations using a configuration object.
|
|
159
|
+
* Use 'hasOne' to create a HasOne association.
|
|
160
|
+
*
|
|
161
|
+
* associations: [{
|
|
162
|
+
* type: 'hasOne',
|
|
163
|
+
* model: 'Address'
|
|
164
|
+
* }]
|
|
165
|
+
*/
|
|
166
|
+
|
|
167
|
+
constructor: function(config) {
|
|
168
|
+
this.callParent(arguments);
|
|
169
|
+
|
|
170
|
+
var me = this,
|
|
171
|
+
ownerProto = me.ownerModel.prototype,
|
|
172
|
+
associatedName = me.associatedName,
|
|
173
|
+
getterName = me.getterName || 'get' + associatedName,
|
|
174
|
+
setterName = me.setterName || 'set' + associatedName;
|
|
175
|
+
|
|
176
|
+
Ext.applyIf(me, {
|
|
177
|
+
name : associatedName,
|
|
178
|
+
foreignKey : associatedName.toLowerCase() + "_id",
|
|
179
|
+
instanceName: associatedName + 'HasOneInstance',
|
|
180
|
+
associationKey: associatedName.toLowerCase()
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
ownerProto[getterName] = me.createGetter();
|
|
184
|
+
ownerProto[setterName] = me.createSetter();
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* @private
|
|
189
|
+
* Returns a setter function to be placed on the owner model's prototype
|
|
190
|
+
* @return {Function} The setter function
|
|
191
|
+
*/
|
|
192
|
+
createSetter: function() {
|
|
193
|
+
var me = this,
|
|
194
|
+
ownerModel = me.ownerModel,
|
|
195
|
+
foreignKey = me.foreignKey;
|
|
196
|
+
|
|
197
|
+
//'this' refers to the Model instance inside this function
|
|
198
|
+
return function(value, options, scope) {
|
|
199
|
+
if (value && value.isModel) {
|
|
200
|
+
value = value.getId();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
this.set(foreignKey, value);
|
|
204
|
+
|
|
205
|
+
if (Ext.isFunction(options)) {
|
|
206
|
+
options = {
|
|
207
|
+
callback: options,
|
|
208
|
+
scope: scope || this
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (Ext.isObject(options)) {
|
|
213
|
+
return this.save(options);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* @private
|
|
220
|
+
* Returns a getter function to be placed on the owner model's prototype. We cache the loaded instance
|
|
221
|
+
* the first time it is loaded so that subsequent calls to the getter always receive the same reference.
|
|
222
|
+
* @return {Function} The getter function
|
|
223
|
+
*/
|
|
224
|
+
createGetter: function() {
|
|
225
|
+
var me = this,
|
|
226
|
+
ownerModel = me.ownerModel,
|
|
227
|
+
associatedName = me.associatedName,
|
|
228
|
+
associatedModel = me.associatedModel,
|
|
229
|
+
foreignKey = me.foreignKey,
|
|
230
|
+
primaryKey = me.primaryKey,
|
|
231
|
+
instanceName = me.instanceName;
|
|
232
|
+
|
|
233
|
+
//'this' refers to the Model instance inside this function
|
|
234
|
+
return function(options, scope) {
|
|
235
|
+
options = options || {};
|
|
236
|
+
|
|
237
|
+
var model = this,
|
|
238
|
+
foreignKeyId = model.get(foreignKey),
|
|
239
|
+
success,
|
|
240
|
+
instance,
|
|
241
|
+
args;
|
|
242
|
+
|
|
243
|
+
if (options.reload === true || model[instanceName] === undefined) {
|
|
244
|
+
instance = Ext.ModelManager.create({}, associatedName);
|
|
245
|
+
instance.set(primaryKey, foreignKeyId);
|
|
246
|
+
|
|
247
|
+
if (typeof options == 'function') {
|
|
248
|
+
options = {
|
|
249
|
+
callback: options,
|
|
250
|
+
scope: scope || model
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Overwrite the success handler so we can assign the current instance
|
|
255
|
+
success = options.success;
|
|
256
|
+
options.success = function(rec){
|
|
257
|
+
model[instanceName] = rec;
|
|
258
|
+
if (success) {
|
|
259
|
+
success.call(this, arguments);
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
associatedModel.load(foreignKeyId, options);
|
|
264
|
+
// assign temporarily while we wait for data to return
|
|
265
|
+
model[instanceName] = instance;
|
|
266
|
+
return instance;
|
|
267
|
+
} else {
|
|
268
|
+
instance = model[instanceName];
|
|
269
|
+
args = [instance];
|
|
270
|
+
scope = scope || model;
|
|
271
|
+
|
|
272
|
+
//TODO: We're duplicating the callback invokation code that the instance.load() call above
|
|
273
|
+
//makes here - ought to be able to normalize this - perhaps by caching at the Model.load layer
|
|
274
|
+
//instead of the association layer.
|
|
275
|
+
Ext.callback(options, scope, args);
|
|
276
|
+
Ext.callback(options.success, scope, args);
|
|
277
|
+
Ext.callback(options.failure, scope, args);
|
|
278
|
+
Ext.callback(options.callback, scope, args);
|
|
279
|
+
|
|
280
|
+
return instance;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
},
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Read associated data
|
|
287
|
+
* @private
|
|
288
|
+
* @param {Ext.data.Model} record The record we're writing to
|
|
289
|
+
* @param {Ext.data.reader.Reader} reader The reader for the associated model
|
|
290
|
+
* @param {Object} associationData The raw associated data
|
|
291
|
+
*/
|
|
292
|
+
read: function(record, reader, associationData){
|
|
293
|
+
var inverse = this.associatedModel.prototype.associations.findBy(function(assoc){
|
|
294
|
+
return assoc.type === 'belongsTo' && assoc.associatedName === record.$className;
|
|
295
|
+
}), newRecord = reader.read([associationData]).records[0];
|
|
296
|
+
|
|
297
|
+
record[this.instanceName] = newRecord;
|
|
298
|
+
|
|
299
|
+
//if the inverse association was found, set it now on each record we've just created
|
|
300
|
+
if (inverse) {
|
|
301
|
+
newRecord[inverse.instanceName] = record;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
});
|