Merge "Show busy indicator while waiting for query results - fixes #104"
diff --git a/dev/js/spec/pipeSpec.js b/dev/js/spec/pipeSpec.js
index 46cd5b9..078d4b1 100644
--- a/dev/js/spec/pipeSpec.js
+++ b/dev/js/spec/pipeSpec.js
@@ -88,5 +88,17 @@
       p.remove('service0')
       expect(p.toString()).toEqual('service1,service2,service3');      
     });
+
+    it('should sync with an element', function () {
+      let p = pipeClass.create();
+      let e = p.element();
+      expect(e.tagName).toEqual("INPUT");
+      p.append('service1');
+      expect(e.getAttribute("value")).toEqual("service1");
+      p.append('service2');
+      expect(e.getAttribute("value")).toEqual("service1,service2");
+      p.remove('service1');
+      expect(e.getAttribute("value")).toEqual("service2");
+    });
   });
 });
diff --git a/dev/js/src/pipe.js b/dev/js/src/pipe.js
index 7b9afee..9847b45 100644
--- a/dev/js/src/pipe.js
+++ b/dev/js/src/pipe.js
@@ -36,8 +36,10 @@
      */
     append : function (service) {
       service = _notNull(service);
-      if (service)
+      if (service) {
         this._pipe.push(service);
+        this._update();
+      };
     },
 
     /**
@@ -45,8 +47,10 @@
      */
     prepend : function (service) {
       service = _notNull(service);
-      if (service)
+      if (service) {
         this._pipe.unshift(service);
+        this._update();
+      };
     },
 
     /**
@@ -56,6 +60,7 @@
       let i = this._pipe.indexOf(service);
       if (i != -1) {
         this._pipe.splice(i, 1);
+        this._update();
       };
     },
 
@@ -71,6 +76,28 @@
      */
     toString : function () {
       return this._pipe.join(',');
+    },
+
+    /**
+     * Update the pipe value.
+     */
+    _update : function () {
+      if (this.e != null) {
+        this.e.setAttribute("value", this.toString());
+      };
+    },
+    
+    /**
+     * Return the pipe element.
+     */
+    element : function () {
+      if (this.e == null) {
+        this.e = document.createElement('input');
+        this.e.setAttribute("type","text");
+        this.e.setAttribute("name","pipe");
+        this.e.classList.add("pipe");
+      };
+      return this.e;
     }
   };
 });