Cscott has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/190368

Change subject: WIP: Implement OO.ui.infuse
......................................................................

WIP: Implement OO.ui.infuse

Change-Id: I567c27914d52abe25892945a743a0931c220015c
---
M build/modules.json
M demos/widgets.php
A src/Infuse.js
M src/elements/DraggableGroupElement.js
M src/layouts/FieldLayout.js
M src/layouts/FieldsetLayout.js
M src/layouts/StackLayout.js
M src/widgets/ButtonGroupWidget.js
M src/widgets/SelectWidget.js
9 files changed, 67 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/oojs/ui refs/changes/68/190368/1

diff --git a/build/modules.json b/build/modules.json
index d3d9df6..fd56c86 100644
--- a/build/modules.json
+++ b/build/modules.json
@@ -14,6 +14,7 @@
                                        "src/Dialog.js",
                                "src/WindowManager.js",
                        "src/Error.js",
+                       "src/Infuse.js",
                        "src/Process.js",
                        "src/ToolFactory.js",
                        "src/ToolGroupFactory.js",
diff --git a/demos/widgets.php b/demos/widgets.php
index 8feab82..4f2c317 100644
--- a/demos/widgets.php
+++ b/demos/widgets.php
@@ -756,5 +756,18 @@
                        ?>
                </div>
        </div>
+<!-- Demonstrate JavaScript "infusion" of PHP widgets -->
+       <script src="../lib/jquery.js"></script>
+       <script src="../lib/oojs.jquery.js"></script>
+       <script src="../dist/oojs-ui.js"></script>
+       <script src="../dist/oojs-ui-apex.js"></script>
+       <script src="../dist/oojs-ui-mediawiki.js"></script>
+       <script type="text/javascript">
+// Let's infuse some widgets!
+var jsWidget = OO.ui.infuse('theme-select');
+console.log('yo!', jsWidget);
+// infuse everything!
+$('*[data-ooui]').map(function(_, e) { return OO.ui.infuse(e.id); });
+       </script>
 </body>
 </html>
diff --git a/src/Infuse.js b/src/Infuse.js
new file mode 100644
index 0000000..d2f97fc
--- /dev/null
+++ b/src/Infuse.js
@@ -0,0 +1,43 @@
+/**
+ * Reconstitute a JavaScript object corresponding to a widget created
+ * by the PHP implementation.
+ */
+OO.ui.infuse = (function() {
+    var infusionCache = {};
+    var infuseOne = function( $elem, id ) {
+        var data = $elem.attr( 'data-ooui' );
+        if ( !data ) {
+            throw new Error( 'No infusion data found: ' + id );
+        }
+        data = JSON.parse( data );
+        if ( !( data._ && OO.ui[data._] ) ) {
+            throw new Error( 'Unknown widget type: ' + id );
+        }
+        var Cls = OO.ui[data._];
+        var obj = new Cls(data);
+        // now replace old DOM with this new DOM.
+        $elem.replaceWith( obj.$element );
+        return obj;
+    };
+    var infuse = function( id ) {
+        if ( typeof(id) !== 'string' ) {
+            // This allows us to use OO.ui.infuse to map items in a group.
+            return id;
+        }
+        var selector = '#' + id;
+        var cached = infusionCache[selector];
+        if ( cached === true ) {
+            throw new Error( 'circular dependency! ' + selector );
+        } else if ( cached ) {
+            return cached;
+        }
+        var $elem = $(selector);
+        if ( ! $elem.length ) {
+            throw new Error( 'widget not found: ' + selector );
+        }
+        infusionCache[selector] = true; // prevent loops
+        infusionCache[selector] = infuseOne( $elem, id );
+        return infusionCache[selector];
+    };
+    return infuse;
+})();
diff --git a/src/elements/DraggableGroupElement.js 
b/src/elements/DraggableGroupElement.js
index 126cb46..e319a7a 100644
--- a/src/elements/DraggableGroupElement.js
+++ b/src/elements/DraggableGroupElement.js
@@ -42,7 +42,7 @@
 
        // Initialize
        if ( $.isArray( config.items ) ) {
-               this.addItems( config.items );
+               this.addItems( config.items.map( OO.ui.infuse ) );
        }
        this.$placeholder = $( '<div>' )
                .addClass( 'oo-ui-draggableGroupElement-placeholder' );
diff --git a/src/layouts/FieldLayout.js b/src/layouts/FieldLayout.js
index dc58e81..04eb519 100644
--- a/src/layouts/FieldLayout.js
+++ b/src/layouts/FieldLayout.js
@@ -22,6 +22,11 @@
  * @cfg {string} [help] Explanatory text shown as a '?' icon.
  */
 OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
+       // allow single-argument call
+       if ( $.isPlainObject( fieldWidget ) && config === undefined ) {
+               config = fieldWidget;
+               fieldWidget = OO.ui.infuse( config.fieldWidget );
+       }
        var hasInputWidget = fieldWidget instanceof OO.ui.InputWidget;
 
        // Configuration initialization
diff --git a/src/layouts/FieldsetLayout.js b/src/layouts/FieldsetLayout.js
index 7b5a1df..6fa4614 100644
--- a/src/layouts/FieldsetLayout.js
+++ b/src/layouts/FieldsetLayout.js
@@ -47,7 +47,7 @@
                .addClass( 'oo-ui-fieldsetLayout' )
                .prepend( this.$help, this.$icon, this.$label, this.$group );
        if ( $.isArray( config.items ) ) {
-               this.addItems( config.items );
+               this.addItems( config.items.map( OO.ui.infuse ) );
        }
 };
 
diff --git a/src/layouts/StackLayout.js b/src/layouts/StackLayout.js
index 507993b..e525949 100644
--- a/src/layouts/StackLayout.js
+++ b/src/layouts/StackLayout.js
@@ -30,7 +30,7 @@
                this.$element.addClass( 'oo-ui-stackLayout-continuous' );
        }
        if ( $.isArray( config.items ) ) {
-               this.addItems( config.items );
+               this.addItems( config.items.map( OO.ui.infuse ) );
        }
 };
 
diff --git a/src/widgets/ButtonGroupWidget.js b/src/widgets/ButtonGroupWidget.js
index be0eb30..09649b6 100644
--- a/src/widgets/ButtonGroupWidget.js
+++ b/src/widgets/ButtonGroupWidget.js
@@ -24,7 +24,7 @@
        // Initialization
        this.$element.addClass( 'oo-ui-buttonGroupWidget' );
        if ( $.isArray( config.items ) ) {
-               this.addItems( config.items );
+               this.addItems( config.items.map( OO.ui.infuse ) );
        }
 };
 
diff --git a/src/widgets/SelectWidget.js b/src/widgets/SelectWidget.js
index 9e68296..ce1f545 100644
--- a/src/widgets/SelectWidget.js
+++ b/src/widgets/SelectWidget.js
@@ -42,7 +42,7 @@
                .addClass( 'oo-ui-selectWidget oo-ui-selectWidget-depressed' )
                .attr( 'role', 'listbox' );
        if ( $.isArray( config.items ) ) {
-               this.addItems( config.items );
+               this.addItems( config.items.map( OO.ui.infuse ) );
        }
 };
 

-- 
To view, visit https://gerrit.wikimedia.org/r/190368
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I567c27914d52abe25892945a743a0931c220015c
Gerrit-PatchSet: 1
Gerrit-Project: oojs/ui
Gerrit-Branch: master
Gerrit-Owner: Cscott <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to