aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/tensorboard/components/hydrogen-join/hydrogen-join.html
diff options
context:
space:
mode:
Diffstat (limited to 'tensorflow/tensorboard/components/hydrogen-join/hydrogen-join.html')
-rw-r--r--tensorflow/tensorboard/components/hydrogen-join/hydrogen-join.html118
1 files changed, 118 insertions, 0 deletions
diff --git a/tensorflow/tensorboard/components/hydrogen-join/hydrogen-join.html b/tensorflow/tensorboard/components/hydrogen-join/hydrogen-join.html
new file mode 100644
index 0000000000..9f8dcfe2af
--- /dev/null
+++ b/tensorflow/tensorboard/components/hydrogen-join/hydrogen-join.html
@@ -0,0 +1,118 @@
+<link rel="import" href="../../bower_components/polymer/polymer.html">
+
+<!--
+A plumber component which joins a number of input bindings. It outputs a list
+consisting of all of the inputs that are not null or undefined.
+
+It can take explicit arguments [in0...in98] or it can pull its arguments from
+a dom-repeat template, provided that it is given the property name it is looking
+for on the repeated children, and that property has {notify: true}. The repeat
+binding involves some magic and may not be totally reliable; ping danmane@ if
+something goes wrong.
+
+Example:
+ <hydrogen-join
+ in1="[[foo1]]"
+ in2="[[foo2]]"
+ in3="[[foo3]]"
+ out="{{foos}}" // equivalent to [foo1].push(foo2).push(foo3)
+ ></hydrogen-join>
+
+ <hydrogen-join out="{{foo}}" in-join-property="out">
+ <template is="dom-repeat" items="[[foos]]">
+ <foo item="[[item]]"></foo> //foo has a property out: {type: Array, notify: true}
+ </template>
+ </hydrogen-join>
+
+Swapping the inJoinProperty is not currently supported, it will warn if you try.
+
+There's a possible bug in repeat mode if an element is removed from the dom-repeat,
+but continues to exist somewhere else, and continues to fire property-changed events.
+Then the hydrogen-join will inappropriately record its value, even though it is not
+still connected in hydrogen-join's DOM.
+
+@demo
+-->
+<dom-module id="hydrogen-join">
+ <script>
+ var declaration = {
+ is: 'hydrogen-join',
+ properties: {
+ out: {type: Array, readOnly: true, notify: true},
+ _items: {type: Array, value: function() {return [];}},
+ /* Property to pull from dom-repeated child nodes and then pull and join */
+ inJoinProperty: {type: String, observer: "_modifyJoinProperty"},
+ },
+ listeners: {
+ "dom-change": "_syncListenersAndState",
+ },
+ /* If we are in repeat-mode, ensure all event listeners are setup, and pull
+ * items out of whatever children currently exist
+ */
+ _syncListenersAndState: function() {
+ if (this.inJoinProperty == null) {
+ // this codepath is for pulling properties out of children in a repeat
+ return;
+ }
+ function repeatUpdateFunction(i) {
+ return function(e) {
+ this._items[i] = e.detail.value;
+ // Debounce just in case something else thrashes
+ this.debounce("updateOut", this._updateOutput)
+ }
+ }
+ // create a new items array to replace the old one, otherwise old items
+ // might never get removed when their corresponding element leaves
+ this._items = [];
+ // Sadly, we need to bind an update function onto every child node,
+ // because the property-changed event does not bubble.
+ for (var i=0; i<this.childNodes.length; i++) {
+ var child = this.childNodes[i];
+ if (child.properties != null && child.properties[this.inJoinProperty] != null) {
+ child.addEventListener(this.inJoinProperty + "-changed", repeatUpdateFunction(i).bind(this));
+ this._items[i] = child[this.inJoinProperty];
+ }
+ }
+ this._updateOutput();
+ },
+ _modifyJoinProperty: function(newJoinProperty, oldJoinProperty) {
+ if (oldJoinProperty != null) {
+ console.warning("Changing the join property may be unsafe. Have fun!");
+ }
+ this._syncListenersAndState();
+ },
+ _updateOutput: function() {
+ var out = [];
+ for (var i=0; i<99; i++) {
+ if (this._items[i] != null) {
+ out.push(this._items[i]);
+ }
+ }
+ this._setOut(out);
+ }
+ };
+
+ /* Programatically add properties in0-in98, with associated observers */
+ function argsUpdateFunction(i) {
+ return function(newval) {
+ this._items[i] = newval;
+ if (i === 98) {
+ console.warn("You're updating the last arg (98). Possibly some values are being lost");
+ }
+ if (this.inJoinProperty != null) {
+ console.warn("It looks like you're providing a join property and also arguments. This is not supported.")
+ }
+ this.debounce("updateOut", this._updateOutput)
+ }
+ }
+ // I got 99 arguments and ain't off by 1!
+ for (var i = 0; i < 99; i++) {
+ var propName = "in" + i;
+ var updateName = "_update" + i;
+ var property = {type: Object, observer: updateName};
+ declaration.properties[propName] = property;
+ declaration[updateName] = argsUpdateFunction(i);
+ }
+ Polymer(declaration);
+ </script>
+</dom-module>