gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-merchant-frontends] branch stable updated (463c0bd -


From: gnunet
Subject: [GNUnet-SVN] [taler-merchant-frontends] branch stable updated (463c0bd -> 7e9076d)
Date: Wed, 31 May 2017 17:15:04 +0200

This is an automated email from the git hooks/post-receive script.

marcello pushed a change to branch stable
in repository merchant-frontends.

    from 463c0bd  kill navbar until we have a better one that works
     add f0b61b7  Adapt /history popup to new format (where the merchant 
backend sums up the total amount transferred).
     add c9dc185  Remove existing list entries upon receiving /track/transfer 
response.
     add ea2e6db  Half-baking popup closure by JS.
     add 103c36a  Making popup disappear once content below the overlay is 
available.
     add eb34526  Show loader before /track/transfer results.
     add 901b28c  Avoid checking two conditions within one 'if' concerning XHR 
object.
     add 2168f53  new nav sidebar for blog
     add b2feb78  fix URLs and fallback page
     add 4fcd2df  new style for donations merchant frontent
     add 59ce555  text fix
     add 5cf2aac  fix (wall of) text
     add a47c5c3  template syntax
     add eb28faa  text
     add 4d518a1  template syntax
     add 48a1555  style/text
     add a11927f  prettier form
     add 5602ad6  order
     add 72e90b9  links
     add 24430f6  get rid of (non-backoffice) JS
     add cd9ddf2  remove JS stuff, wording
     add 30d5bb3  Better scrolling mgmt.
     add 91d8688  indent
     add 1ee5e1f  add PNG version of the image
     add 74286da  fix link
     add 2627320  Tracks' popup closes upon pressing ESC.
     add 636537b  Manage no records found in /history by showing proper message
     add c981246  remove dead code
     add 7759c1b  adding form for cherry-picking proposals in history.
     add 2911f73  fix histry table getting the first row alway eaten upon new 
results.
     add 4be5fee  various fixes around the cherry-pick tracking form: the one 
where the backoffice user enters order ids and wtids in order to directly track 
them.
     add 6f82dc9  cherry-pick form shows/hides input fields according to order 
id or wtid being tracked.  To be improved by UX people.
     add 94e2e76  actual submission of cherry-picked tracking
     add 442a13c  submodules
     add ba1f72c  catch error from attempting to parse non json
     add 7e9076d  sticking to new /pay's returned json

No new revisions were added by this update.

Summary of changes:
 talerfrontends/blog/articles/scrap1_13.html        |   2 +-
 talerfrontends/blog/blog.py                        |  11 +-
 talerfrontends/blog/data/category.png              | Bin 0 -> 15641 bytes
 talerfrontends/blog/static/backoffice.css          |   4 +
 talerfrontends/blog/static/backoffice.js           | 189 +++++++++++++----
 talerfrontends/blog/static/web-common              |   2 +-
 talerfrontends/blog/templates/backoffice.html      |  57 +++--
 talerfrontends/blog/templates/base.html            |  34 +--
 talerfrontends/donations/donations.py              |   4 +-
 talerfrontends/donations/static/execute-payment.js |  53 -----
 talerfrontends/donations/static/index.js           |  46 ----
 talerfrontends/donations/static/web-common         |   2 +-
 talerfrontends/donations/templates/base.html       |  37 ++--
 talerfrontends/donations/templates/fallback.html   |  48 ++---
 talerfrontends/donations/templates/index.html      |  65 +++---
 talerfrontends/static/tracking-error.js            |  54 -----
 talerfrontends/static/tracking.css                 |  12 --
 talerfrontends/static/tracking.js                  | 235 ---------------------
 talerfrontends/templates/error.html                |  12 --
 talerfrontends/templates/tracking.html             | 101 ---------
 talerfrontends/templates/transaction_conflict.html |  15 --
 talerfrontends/templates/transfer_conflict.html    |  15 --
 22 files changed, 305 insertions(+), 693 deletions(-)
 create mode 100644 talerfrontends/blog/data/category.png
 delete mode 100644 talerfrontends/donations/static/execute-payment.js
 delete mode 100644 talerfrontends/donations/static/index.js
 delete mode 100644 talerfrontends/static/tracking-error.js
 delete mode 100644 talerfrontends/static/tracking.css
 delete mode 100644 talerfrontends/static/tracking.js
 delete mode 100644 talerfrontends/templates/error.html
 delete mode 100644 talerfrontends/templates/tracking.html
 delete mode 100644 talerfrontends/templates/transaction_conflict.html
 delete mode 100644 talerfrontends/templates/transfer_conflict.html

diff --git a/talerfrontends/blog/articles/scrap1_13.html 
b/talerfrontends/blog/articles/scrap1_13.html
index 4bddf2e..8c06eb2 100644
--- a/talerfrontends/blog/articles/scrap1_13.html
+++ b/talerfrontends/blog/articles/scrap1_13.html
@@ -37,7 +37,7 @@ Cover photograph by Peter Hinely.
  </div>
  <a 
name="index-call-to-action_002c-use-correct-terminology-_0028see-also-terminology_0029-3">
  </a>
- <img alt="category" src="category.jpg">
+ <img alt="category" 
src="/essay/13._Categories_of_Free_and_Nonfree_Software/data/category.jpg">
   <blockquote class="smallquotation">
    <p>
     <em>
diff --git a/talerfrontends/blog/blog.py b/talerfrontends/blog/blog.py
index 8010f2f..35fd073 100644
--- a/talerfrontends/blog/blog.py
+++ b/talerfrontends/blog/blog.py
@@ -59,7 +59,9 @@ app.config.from_object(__name__)
 def utility_processor():
     def url(my_url):
         return join_urlparts(flask.request.script_root, my_url)
-    return dict(url=url)
+    def env(name, default=None):
+        return os.environ.get(name, default)
+    return dict(url=url, env=env)
 
 
 @app.route("/")
@@ -101,7 +103,10 @@ def generate_contract():
     )
     r = requests.post(urljoin(BACKEND_URL, 'proposal'), json=dict(order=order))
     if r.status_code != 200:
-        return flask.jsonify(r.json()), r.status_code
+        try:
+            return flask.jsonify(r.json()), r.status_code
+        except json.decoder.JSONDecodeError:
+            return flask.jsonify(dict(error="Backend died, no JSON got from 
it")), 502
     proposal_resp = r.json()
     return flask.jsonify(**proposal_resp)
 
@@ -146,7 +151,7 @@ def pay():
     r = requests.post(urljoin(BACKEND_URL, "pay"), json=deposit_permission)
     if 200 != r.status_code:
         return flask.jsonify(r.json()), r.status_code
-    proposal_data = r.json()["proposal_data"]
+    proposal_data = r.json()["contract_terms"]
     article_name = proposal_data["extra"]["article_name"]
     payed_articles = flask.session["payed_articles"] = 
flask.session.get("payed_articles", [])
     if article_name not in payed_articles:
diff --git a/talerfrontends/blog/data/category.png 
b/talerfrontends/blog/data/category.png
new file mode 100644
index 0000000..836425c
Binary files /dev/null and b/talerfrontends/blog/data/category.png differ
diff --git a/talerfrontends/blog/static/backoffice.css 
b/talerfrontends/blog/static/backoffice.css
index 5cb7609..63a684c 100644
--- a/talerfrontends/blog/static/backoffice.css
+++ b/talerfrontends/blog/static/backoffice.css
@@ -11,6 +11,10 @@
   z-index: 2;
 }
 
+#history-container {
+  margin-bottom: 10cm;
+}
+
 .date, .amount {
   text-align: right;
 }
diff --git a/talerfrontends/blog/static/backoffice.js 
b/talerfrontends/blog/static/backoffice.js
index 00ed53d..4554bb0 100644
--- a/talerfrontends/blog/static/backoffice.js
+++ b/talerfrontends/blog/static/backoffice.js
@@ -21,8 +21,6 @@
   @licend  The above is the entire license notice
   for the JavaScript code in this page.
  
-  @brief Contains functions that regulate the focus to input fields
-         and others that request /history to the frontend
   @author Marcello Stanisci
 */
 "use strict";
@@ -30,13 +28,28 @@
 var FRACTION = 100000000;
 var TIMESTAMP = 0;
 var START = 0;
+var DELTA = 5
 var INSTANCE = "FSF";
+var LAST = 0;
 
 function amount_to_string(amount){
   var number = Number(amount.value) + (Number(amount.fraction)/FRACTION);
   return `${number.toFixed(2)} ${amount.currency}`;
 }
 
+function close_popup(){
+
+  var ctx = document.getElementsByClassName("track-content")[0];
+  var tbody = xpath_get("table/tbody", ctx).snapshotItem(0);
+  var tbody_children = xpath_get("table/tbody/tr", ctx);
+
+  for(var i=1; i<tbody_children.snapshotLength; i++){
+    tbody.removeChild(tbody_children.snapshotItem(i));
+  }
+
+  toggle_overlay(true);
+}
+
 function amount_sum(a1, a2){
   if(a1.currency != a2.currency)
     throw "Currency mismatch, terminating.";
@@ -76,25 +89,48 @@ function parse_date(date){
   return `${d.getUTCDate()} ${months[d.getUTCMonth()]} ${d.getUTCFullYear()}, 
${hours}:${minutes}`;
 }
 
-function toggle_visible(overlay){
-  overlay.style.visibility = "visible";
-  overlay.style.opacity = 1;
+function toggle_overlay(force_close){
+  var overlay = document.getElementsByClassName("overlay")[0];
+  if(overlay.style.visibility == "visible" || force_close){
+    overlay.style.visibility = "hidden";
+    overlay.style.opacity = 0;
+  }
+  else
+  {
+    overlay.style.visibility = "visible";
+    overlay.style.opacity = 1;
+  }
+
 }
 
 function track_transfer(exchange, wtid){
+  var loader = document.getElementsByClassName("loader")[0]; 
+  loader.style.visibility = "visible";
   var qs = `/track/transfer?exchange=${exchange}&wtid=${wtid}&instance=FSF`;
-  console.log("Tracking", qs);
   var req = new XMLHttpRequest();
   req.open("GET", qs, true);
   req.onload = function(){
     if(4 == req.readyState){
       if(200 == req.status){
         var tracks = JSON.parse(req.responseText);
-        console.log("Transfer tracks", req.responseText);
+        var table = document.getElementById("history");
+        var tbody = xpath_get("tbody", table).snapshotItem(0);
+        var tbody_children = xpath_get("tbody/*[position() > 1]", table);
+        for(var i=0; i<tbody_children.snapshotLength; i++){
+          tbody.removeChild(tbody_children.snapshotItem(i));
+        }
+        fill_table(tracks.deposits_sums, tracks.execution_time);
+        close_popup();
+      }
+      if(400 == req.status){
+        alert("Bad request, check submitted data!");
+        return; 
+      }
+      else{
+        console.log(`Status: ${req.status}, not handled.`);
+        return;
       }
-    
     }
-    // TBD.
   }
   req.send();
 }
@@ -122,22 +158,18 @@ function track_order(order_id, instance){
                                         
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
                                         null).snapshotItem(0);
           var row = document.createElement("tr");
-          var subject = JSON.stringify({wtid: entry.wtid,
-                                        exchange_url: entry.exchange});
+          var subject = `${entry.wtid} ${entry.exchange_url}`;
           console.log("Subject", subject);
-          var amount = entry.coins[0].amount_with_fee;
 
-          for(var j=1; j<entry.coins.length - 1; j++)
-            amount = amount_sum(amount, entry.coins[j].amount_with_fee);
           row.innerHTML = `<td class="wtid">
                              <a onclick='track_transfer("${entry.exchange}", 
"${entry.wtid}")'
                                 href="#${i}">${subject.substring(0, 20)}...</a>
                            </td> 
-                           <td class="amount">${amount_to_string(amount)}</td>
+                           <td 
class="amount">${amount_to_string(entry.amount)}</td>
                            <td 
class="date">${parse_date(entry.execution_time)}</td>`;
 
           table.appendChild(row);
-          toggle_visible(overlay);
+          toggle_overlay();
         }
       }
       if (202 == req.status){
@@ -145,11 +177,11 @@ function track_order(order_id, instance){
         var overlay = document.getElementsByClassName("overlay")[0];
         var track_content = 
document.getElementsByClassName("track-content")[0];
         track_content.innerHTML = "This order is still waiting to be paid 
back.";
-        toggle_visible(overlay);
+        toggle_overlay();
       } 
+      if (404 == req.status)
+        alert("Order ID unknown");
     }
-
-    // Manage here 202 case (tracks not ready).
   }
   req.send();
 }
@@ -160,15 +192,28 @@ function xpath_get(xpath, ctx){
                               null,
                               XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
                               null);
-  return ret.snapshotItem(0);
+  return ret;
 }
 
 /**
  * Append results to the table showing results.
  */
-function fill_table(history){
+function fill_table(history, execution_time){
   var table = document.getElementById("history");
-  var tbody = xpath_get("tbody", table);
+  var tbody = xpath_get("tbody", table).snapshotItem(0);
+  
+  if(0 == history.length){
+    window.setTimeout(remove_loader, 900);
+    return;
+  }
+
+  /* remove "no records" message */
+  var nr = xpath_get("address@hidden'no-records']", tbody).snapshotItem(0)
+  if (nr)
+    tbody.removeChild(nr);
+  /* Make table's header visible */
+  xpath_get("address@hidden'headers']", 
tbody).snapshotItem(0).style.visibility = "";
+
   for (var i=0; i<history.length; i++){
     var entry = history[i];
     var row = document.createElement("tr");
@@ -186,8 +231,8 @@ function fill_table(history){
     td_date.className = "date";
     td_order_id.innerHTML = `<a href="#${i}" 
onclick='track_order("${entry.order_id}", "FSF");'>${entry.order_id}</a>`;
     td_summary.innerHTML = "TBD";
-    td_amount.innerHTML = amount_to_string(entry.amount);
-    td_date.innerHTML = parse_date(entry.timestamp);
+    td_amount.innerHTML = amount_to_string(entry.amount || 
entry.deposit_value);
+    td_date.innerHTML = parse_date(entry.timestamp || execution_time);
     row.appendChild(td_order_id);
     row.appendChild(td_summary);
     row.appendChild(td_amount);
@@ -205,28 +250,98 @@ function fill_table(history){
   window.setTimeout(remove_loader, 900);
 }
 
+/**
+ * Issue a direrct /track/order, via Web form.
+ */
+function track_cherry_pick(form){
+  var types = xpath_get("address@hidden'radio']", form);
+  var type = "order";
+  for(var i in [0, 1])
+    if (types.snapshotItem(i).checked)
+      type = types.snapshotItem(i).value;
+  if ("order" == type){
+    var order_id = xpath_get("address@hidden'order']", form).snapshotItem(0);
+    track_order(order_id.value, INSTANCE);
+  }
+  else{
+    var data = xpath_get("address@hidden'transfer']", form);
+    var wtid = data.snapshotItem(0);
+    var exchange = data.snapshotItem(1);
+    track_transfer(exchange.value, wtid.value);
+  }
+}
+
+/**
+ * Restore the cherry-pick form to the initial state.
+ * In other words, it formats the form so that /track/order
+ * can be called.
+ */
+function cherry_pick_form_order(form){
+  var input_order = xpath_get("address@hidden'order']", form).snapshotItem(0);
+  input_order.style.visibility = "";
+  var input_transfer = xpath_get("address@hidden'transfer']", form);
+  for(var i in [0, 1])
+    input_transfer.snapshotItem(i).style.visibility = "hidden";
+}
+
+/**
+ * Change the cherry-pick form to the format useful for
+ * tracking wire transfers.
+ */
+function cherry_pick_form_transfer(form){
+  var input_order = xpath_get("address@hidden'order']", form).snapshotItem(0);
+  input_order.style.visibility = "hidden";
+  var input_transfer = xpath_get("address@hidden'transfer']", form);
+  for(var i in [0, 1])
+    input_transfer.snapshotItem(i).style.visibility = "";
+}
+
+
+/**
+ * - scroll if true, the logic tries to retrieve the
+ *   "next page" of all the proposals known to the merchant.
+ */
 function get_history(scroll){
   var loader = document.getElementsByClassName("loader")[0]; 
   loader.style.visibility = "visible";
-  if(scroll)
-    START += 20;
+  var qs = `/history?instance=${INSTANCE}&delta=${DELTA}`;
+  if(scroll){
+    START = LAST;
+    qs += `&start=${START}`;
+  }
   var req = new XMLHttpRequest();
-  req.open("GET", 
`/history?timestamp=${TIMESTAMP}&instance=${INSTANCE}&start=${START}`, true);
+  req.open("GET", qs, true);
   req.onload = function(){
-    if(req.readyState == 4 && req.status == 200){
-      var history = JSON.parse(req.responseText); 
-      if(!history){
-        console.log("Got invalid JSON");
-        return;
+    if(4 == req.readyState){
+      if(200 == req.status){
+        var history = JSON.parse(req.responseText); 
+        if(!history){
+          console.log("Got invalid JSON");
+          return;
+        }
+        if(0 < history.length){
+          console.log(req.respnseText);
+          LAST = history[history.length - 1].row_id;
+        }
+        fill_table(history);
+      }
+      else{
+        console.log("error: status != 200");
       }
-      fill_table(history);
-    }
-    else{
-      console.log("error: status != 200");
     }
   }
   req.send();
 }
 
 document.addEventListener("DOMContentLoaded", () => get_history(false));
-document.addEventListener("scroll", () => get_history(true));
+document.addEventListener("scroll", function(){
+  if(window.innerHeight + window.scrollY >= document.body.offsetHeight)
+    window.setTimeout(()=>get_history(true), 400);
+});
+document.onkeydown = function(e) {
+  if(!e)
+    e = event;
+  if(e.keyCode == 27){
+    close_popup();
+  }
+}
diff --git a/talerfrontends/blog/static/web-common 
b/talerfrontends/blog/static/web-common
index 9701ed4..0be9ac9 160000
--- a/talerfrontends/blog/static/web-common
+++ b/talerfrontends/blog/static/web-common
@@ -1 +1 @@
-Subproject commit 9701ed4caa1cb541c1f645b05bfe190975b3e42b
+Subproject commit 0be9ac9264a3bd9f495c37abf1ac864562e8c598
diff --git a/talerfrontends/blog/templates/backoffice.html 
b/talerfrontends/blog/templates/backoffice.html
index 649c2ba..447ae54 100644
--- a/talerfrontends/blog/templates/backoffice.html
+++ b/talerfrontends/blog/templates/backoffice.html
@@ -4,20 +4,54 @@
   <p>This page simulates a backoffice facility.  Through it,
   the user can see the money flow from Taler transactions to
   wire transfers and viceversa.</p>
-  <table id="history" width="60%" style="visibility: hidden;">
-    <tbody>
-      <tr>
-        <th class="order-id">Order ID</th>
-        <th class="amount">Amount</th>
-        <th class="date">Date</th>
-      </tr>
-    </tbody>
-  </table>
-  <div class="loader"></div>
+  <div>
+    <form action="">
+      <input type="text"
+             placeholder="Order ID"
+             class="order"></input><br>
+      <input type="text"
+             placeholder="WTID"
+             class="transfer"
+             style="visibility: hidden;"></input><br>
+      <input type="text"
+             placeholder="Exchange URI"
+             class="transfer"
+             style="visibility: hidden;"></input><br>
+      <input type="radio"
+             name="track-type"
+             value="order"
+             onclick="cherry_pick_form_order(this.parentNode)"
+             checked>Track order id</input><br>
+      <input type="radio"
+             name="track-type"
+             value="wtid"
+             onclick="cherry_pick_form_transfer(this.parentNode)">Track wire 
transfer</input><br>
+      <input type="button"
+             value="submit"
+             onclick='track_cherry_pick(this.parentNode)'></input>
+    </form>
+  </div>
+  <div id="history-container">
+    <table id="history" width="60%" style="visibility: hidden;">
+      <tbody>
+        <tr class="no-records">
+          <th colspan="3">No records found</th>
+        </tr>
+        <tr class="headers" style="visibility: hidden">
+          <th class="order-id">Order ID</th>
+          <th class="amount">Amount</th>
+          <th class="date">Date</th>
+        </tr>
+      </tbody>
+    </table>
+    <br/>
+    <div class="loader"></div>
+  </div>
+
   <div id="popup1" class="overlay">
     <div class="popup">
       <h2>
-        <a class="close" href="/backoffice">&times;</a>
+        <a class="close" href="#" onclick="close_popup();">&times;</a>
       </h2>
       <div class="track-content">
         <table>
@@ -32,7 +66,6 @@
       </div>
     </div>
   </div>
-  <a href="#" onclick="get_history(true);" style="margin-left: 90%;">Fake 
scroll</a>
 {% endblock main %}
 
 {% block styles %}
diff --git a/talerfrontends/blog/templates/base.html 
b/talerfrontends/blog/templates/base.html
index bf4d73e..7519ab1 100644
--- a/talerfrontends/blog/templates/base.html
+++ b/talerfrontends/blog/templates/base.html
@@ -17,8 +17,8 @@
 <html data-taler-nojs="true" {{ data_attribute }}>
 <head>
   <title>Richard M. Stallman: Free Software, Free Society</title>
-  <link rel="stylesheet" type="text/css" href="{{ 
url("/static/web-common/style.css") }}">
-  <link rel="stylesheet" type="text/css" href="{{ 
url("/static/web-common/lang.css") }}">
+  <link rel="stylesheet" type="text/css" href="{{ 
url('/static/web-common/pure.css') }}" />
+  <link rel="stylesheet" type="text/css" href="{{ 
url('/static/web-common/demo.css') }}" />
   <link rel="stylesheet" type="text/css" href="{{ 
url("/static/web-common/taler-fallback.css") }}" id="taler-presence-stylesheet">
   <script src="{{ url("/static/web-common/taler-wallet-lib.js") }}" 
type="application/javascript"></script>
   <script src="{{ url("/static/web-common/lang.js") }}" 
type="application/javascript"></script>
@@ -29,26 +29,34 @@
 
 <body>
   {% block body_prelude %}{% endblock %}
-  <header>
+  <div class="demobar">
+    <h1><span class="tt adorn-brackets">Taler Demo</span></h1>
+    <h1><span class="it"><a href="{{ env('TALER_ENV_URL_MERCHANT_BLOG') 
}}">Essay Shop</a></span></h1>
+    <p>This essay shop demonstrates how Taler can be used to pay for web 
resources.</p>
+    <ul>
+      <li><a href="{{ env('TALER_ENV_URL_INTRO', '#') }}">Introduction</a></li>
+      <li><a href="{{ env('TALER_ENV_URL_BANK', '#') }}">Bank</a></li>
+      <li><a href="{{ env('TALER_ENV_URL_MERCHANT_BLOG', '#') }}">Essay 
Shop</a></li>
+      <li><a href="{{ env('TALER_ENV_URL_MERCHANT_DONATIONS', '#') 
}}">Donations</a></li>
+    </ul>
+    <p>You can learn more about Taler on our main <a 
href="https://taler.net";>website</a>.</p>
+  </div>
+
+  <section id="main" class="content">
     <div id="logo">
       <a href="{{ url("/") }}">
         <img src="{{ url("/static/gnu.svg") }}" height=100 width=100 alt="GNU 
logo">
       </a>
     </div>
     <h1 class="nav">Richard M. Stallman: Free Software, Free Society</h1>
-  </header>
-
-  <aside class="sidebar" id="left">
-  </aside>
-
-  <section id="main">
     {% block main %}
     <em>(main content goes here)</em>
     {% endblock main %}
+    <hr />
+    <div class="copyright">
+      <p>Copyright &copy; 2014&mdash;2016 INRIA</p>
+      <a href="/javascript" data-jslicense="1" 
class="jslicenseinfo">JavaScript license information</a>
+    </div>
   </section>
-  <div class="copyright">
-    <p>Copyright &copy; 2014&mdash;2016 INRIA</p>
-    <a href="/javascript" data-jslicense="1" class="jslicenseinfo">JavaScript 
license information</a>
-  </div>
 </body>
 </html>
diff --git a/talerfrontends/donations/donations.py 
b/talerfrontends/donations/donations.py
index 2287e94..b20bc2b 100644
--- a/talerfrontends/donations/donations.py
+++ b/talerfrontends/donations/donations.py
@@ -52,7 +52,9 @@ print(app.config)
 def utility_processor():
     def url(my_url):
         return join_urlparts(flask.request.script_root, my_url)
-    return dict(url=url)
+    def env(name, default=None):
+        return os.environ.get(name, default)
+    return dict(url=url, env=env)
 
 
 @app.route("/")
diff --git a/talerfrontends/donations/static/execute-payment.js 
b/talerfrontends/donations/static/execute-payment.js
deleted file mode 100644
index d01ee20..0000000
--- a/talerfrontends/donations/static/execute-payment.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-  @licstart  The following is the entire license notice for the
-  JavaScript code in this page.
-
-  Copyright (C) 2015, 2016 INRIA
-
-  The JavaScript code in this page is free software: you can
-  redistribute it and/or modify it under the terms of the GNU
-  Lesser General Public License (GNU LGPL) as published by the Free Software
-  Foundation, either version 2.1 of the License, or (at your option)
-  any later version.  The code is distributed WITHOUT ANY WARRANTY;
-  without even the implied warranty of MERCHANTABILITY or FITNESS
-  FOR A PARTICULAR PURPOSE.  See the GNU LGPL for more details.
-
-  As additional permission under GNU LGPL version 2.1 section 7, you
-  may distribute non-source (e.g., minimized or compacted) forms of
-  that code without the copy of the GNU LGPL normally required by
-  section 4, provided you include this license notice and a URL
-  through which recipients can access the Corresponding Source.
-
-  @licend  The above is the entire license notice
-  for the JavaScript code in this page.
-
-  @author Marcello Stanisci
-*/
-
-"use strict";
-
-// the urls are urlencoded, so that quotation marks can't lead to escaping and 
XSS
-var hash = document.querySelectorAll("[name=contract-hash]")[0];
-var pay_url = document.querySelectorAll("[name=pay-url]")[0];
-var offering_url = document.querySelectorAll("[name=offering-url]")[0];
-
-taler.executePayment(
-    hash.getAttribute("value"),
-    decodeURIComponent(pay_url.getAttribute("value")),
-    decodeURIComponent(offering_url.getAttribute("value")));
-
-var index = 0;
-var dots = ["/",
-            "-",
-            "\\",
-            "|"];
-function print_dots() {
-  var spot = document.getElementById("action-indicator");
-  if (spot)
-    spot.innerHTML = dots[index];
-  index++;
-  index = index % dots.length;
-  window.setTimeout(print_dots, 400);
-}
-
-print_dots();
diff --git a/talerfrontends/donations/static/index.js 
b/talerfrontends/donations/static/index.js
deleted file mode 100644
index 94d9c78..0000000
--- a/talerfrontends/donations/static/index.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-  @licstart  The following is the entire license notice for the
-  JavaScript code in this page.
-
-  Copyright (C) 2015, 2016 INRIA
-
-  The JavaScript code in this page is free software: you can
-  redistribute it and/or modify it under the terms of the GNU
-  Lesser General Public License (GNU LGPL) as published by the Free Software
-  Foundation, either version 2.1 of the License, or (at your option)
-  any later version.  The code is distributed WITHOUT ANY WARRANTY;
-  without even the implied warranty of MERCHANTABILITY or FITNESS
-  FOR A PARTICULAR PURPOSE.  See the GNU LGPL for more details.
-
-  As additional permission under GNU LGPL version 2.1 section 7, you
-  may distribute non-source (e.g., minimized or compacted) forms of
-  that code without the copy of the GNU LGPL normally required by
-  section 4, provided you include this license notice and a URL
-  through which recipients can access the Corresponding Source.
-
-  @licend  The above is the entire license notice
-  for the JavaScript code in this page.
-  
-  @author Marcello Stanisci
-  @author Florian Dold
-*/
-"use strict";
-
-var shop_currency = 
document.querySelectorAll("meta[name=merchant_currency]")[0].getAttribute("value");
-
-function addOption(value, label) {
-  var s = document.getElementById("taler-donation");
-  var e = document.createElement("option");
-  e.textContent = label ? label : ("".concat(value, " ", shop_currency));
-  e.value = value;
-  s.appendChild(e);
-}
-
-function init() {
-  addOption("0.1");
-  addOption("1.0");
-  addOption("6.0", "".concat(5, " ", shop_currency));
-  addOption("10");
-}
-
-document.addEventListener("DOMContentLoaded", init);
diff --git a/talerfrontends/donations/static/web-common 
b/talerfrontends/donations/static/web-common
index 9701ed4..0be9ac9 160000
--- a/talerfrontends/donations/static/web-common
+++ b/talerfrontends/donations/static/web-common
@@ -1 +1 @@
-Subproject commit 9701ed4caa1cb541c1f645b05bfe190975b3e42b
+Subproject commit 0be9ac9264a3bd9f495c37abf1ac864562e8c598
diff --git a/talerfrontends/donations/templates/base.html 
b/talerfrontends/donations/templates/base.html
index 8599705..dc78eb0 100644
--- a/talerfrontends/donations/templates/base.html
+++ b/talerfrontends/donations/templates/base.html
@@ -18,16 +18,29 @@
 <html>
 <head>
   <title>Taler Donation Demo</title>
-  <link rel="stylesheet" type="text/css" href="{{ 
url("/static/web-common/style.css") }}">
-  <link rel="stylesheet" type="text/css" href="{{ 
url("/static/web-common/lang.css") }}">
+  <link rel="stylesheet" type="text/css" href="{{ 
url('/static/web-common/pure.css') }}" />
+  <link rel="stylesheet" type="text/css" href="{{ 
url('/static/web-common/demo.css') }}" />
   <script src="{{ url("/static/web-common/taler-wallet-lib.js") }}" 
type="application/javascript"></script>
   <script src="{{ url("/static/web-common/lang.js") }}" 
type="application/javascript"></script>
   {% block styles %}{% endblock %}
   {% block scripts %}{% endblock %}
 </head>
 
-<body class="en" onLoad="loadLang()">
-  <header>
+<body>
+  <div class="demobar">
+    <h1><span class="tt adorn-brackets">Taler Demo</span></h1>
+    <h1><span class="it"><a href="{{ env('TALER_ENV_URL_MERCHANT_DONATIONS') 
}}">Donations</a></span></h1>
+    <p>This is the donation page, you can make donations (with an imaginary 
currency for now) to free software projects.</p>
+    <ul>
+      <li><a href="{{ env('TALER_ENV_URL_INTRO', '#') }}">Introduction</a></li>
+      <li><a href="{{ env('TALER_ENV_URL_BANK', '#') }}">Bank</a></li>
+      <li><a href="{{ env('TALER_ENV_URL_MERCHANT_BLOG', '#') }}">Essay 
Shop</a></li>
+      <li><a href="{{ env('TALER_ENV_URL_MERCHANT_DONATIONS', '#') 
}}">Donations</a></li>
+    </ul>
+    <p>You can learn more about Taler on our main <a 
href="https://taler.net";>website</a>.</p>
+  </div>
+
+  <section id="main" class="content">
     <a href="{{ url("/") }}">
       <div id="logo">
         <svg height="100" width="100">
@@ -36,20 +49,14 @@
         </svg>
       </div>
     </a>
-    <h1 class="nav">Toy &quot;Store&quot; - Taler Demo</h1>
-  </header>
-
-  <aside class="sidebar" id="left">
-  </aside>
-
-  <section id="main">
     {% block main %}
       This is the main content of the page.
     {% endblock %}
+    <hr />
+    <div class="copyright">
+      <p>Copyright &copy; 2014&mdash;2017 INRIA</p>
+      <a href="/javascript" data-jslicense="1" 
class="jslicenseinfo">JavaScript license information</a>
+    </div>
   </section>
-  <div class="copyright">
-    <p>Copyright &copy; 2014&mdash;2016 INRIA</p>
-    <a href="/javascript" data-jslicense="1" class="jslicenseinfo">JavaScript 
license information</a>
-  </div>
 </body>
 </html>
diff --git a/talerfrontends/donations/templates/fallback.html 
b/talerfrontends/donations/templates/fallback.html
index ecf22ae..448af2b 100644
--- a/talerfrontends/donations/templates/fallback.html
+++ b/talerfrontends/donations/templates/fallback.html
@@ -1,25 +1,23 @@
-<!doctype html>
-<html>
-  <body>
-   <div id="ccfakeform" class="fade">
-     <p>
-     Oops, it looks like you don't have a Taler wallet installed.  Why don't 
you enter
-     all your credit card details before reading the article? <em>You can also
-     use GNU Taler to complete the purchase at any time.</em>
-     </p>
-   
-     <form>
-       First name<br> <input type="text"></input><br>
-       Family name<br> <input type="text"></input><br>
-       Age<br> <input type="text"></input><br>
-       Nationality<br> <input type="text"></input><br>
-       Gender<br> <input type="radio" name"gender">Male</input>
-       CC number<br> <input type="text"></input><br>
-       <input type="radio" name="gender">Female</input><br>
-     </form>
-     <form method="get" action="/cc-payment/{{ article_name }}">
-       <input type="submit"></input>
-     </form>
-   </div>
-  </body>
-</html>
+{% extends "templates/base.html" %}
+{% block main %}
+<div id="ccfakeform" class="fade">
+ <p>
+ Oops, it looks like you don't have a Taler wallet installed.  Why don't you 
enter
+ all your credit card details before reading the article? <em>You can also
+ use GNU Taler to complete the purchase at any time.</em>
+ </p>
+
+ <form>
+   First name<br> <input type="text"></input><br>
+   Family name<br> <input type="text"></input><br>
+   Age<br> <input type="text"></input><br>
+   Nationality<br> <input type="text"></input><br>
+   Gender<br> <input type="radio" name"gender">Male</input>
+   CC number<br> <input type="text"></input><br>
+   <input type="radio" name="gender">Female</input><br>
+ </form>
+ <form method="get" action="/cc-payment/{{ article_name }}">
+   <input type="submit"></input>
+ </form>
+</div>
+{% endblock main %}
diff --git a/talerfrontends/donations/templates/index.html 
b/talerfrontends/donations/templates/index.html
index 0164392..240e88b 100644
--- a/talerfrontends/donations/templates/index.html
+++ b/talerfrontends/donations/templates/index.html
@@ -1,35 +1,12 @@
 {% extends "templates/base.html" %}
 
-{% block scripts %}
-<meta name="merchant_currency" value="{{ merchant_currency }}">
-<script src="{{ url('/static/index.js') }}" 
type="application/javascript"></script>
-{% endblock %}
-
 {% block main %}
-  <h1 lang="en">Welcome to the Taler Donation "Shop" Demo</h1>
+<h1 lang="en">Welcome to the Taler Donation "Shop" Demo</h1>
+
+<p>This toy donations website shows the user experience for donations with 
Taler.
+You are paying with an imaginary currency ({{ merchant_currency }}).
+</p>
 
-  <p>This "toy" website provides you with the ability to
-    experience using the
-    <a href="https://www.taler.net/";>GNU Taler</a>
-    payment system without using
-    valuable currency. Instead, for the demonstrator we
-    Taler is designed to work with ordinary currencies, such
-    as Dollars or Euros, not just toy currencies.
-    <br>
-    This page, <tt>shop.demo.taler.net</tt> models the behavior of a
-    typical Web shop supporting Taler.  The other pages of the demo,
-    <tt>exchange.demo.taler.net</tt> and
-    <tt>bank.demo.taler.net</tt>, correspond to a Taler exchange
-    and bank with tight Taler integration respectively.  You
-    may also enjoy visiting the <tt>blog.demo.taler.net</tt>.
-  </p>
-  <h2>Back-office interface</h2>
-  <p>Try the <a href="/backoffice">back-office</a>, in order to track
-  your deposits!
-  </p>
-</article>
-<!-- debugging button, to be minimized in a corner.. -->
-<!-- button id="show-hide" value="show">toggle</button-->
 <div class="taler-installed-hide">
   <h2>Installing the Taler wallet</h2>
   First, you need to install the Taler wallet browser extension.
@@ -39,30 +16,31 @@
     <li>from the app store for <a 
href="https://chrome.google.com/webstore/detail/gnu-taler-wallet/millncjiddlpgdmkklmhfadpacifaonc";>Google
         Chrome and Chromium</a>
     </li>
-    <li>By visiting our <a href="/landing">landing page</a>.
+    <li>By visiting our <a href="https://taler.net/wallet";>installation 
page</a> for other platforms.
     </li>
   </ul>
   Wallets for other browsers will be provided in the near future.
 </div>
 
 <div class="taler-installed-show">
-  <p>Please choose a project and the amount of KUDOS you
+  <p>Please choose a project and the amount (*) of {{ merchant_currency }} you
     wish to donate:</p>
 
-  <form name="tform" action="checkout" method="GET">
+  <form name="tform" action="checkout" method="GET" class="pure-form">
     <div class="participation" id="fake-shop">
-      <br>
-      <input type="radio" name="donation_receiver" value="Taler" 
checked="true">GNU Taler</input>
-      <br>
-      <input type="radio" name="donation_receiver" value="Tor">Tor</input>
-      <br>
-      <input type="radio" name="donation_receiver" 
value="GNUnet">GNUnet</input>
-      <br>
-      <select id="taler-donation" name="donation_amount">
+      <select name="donation_receiver">
+        <option value="GNUnet">GNUnet</option>
+        <option value="Taler">GNU Taler</option>
+        <option value="Tor">Tor</option>
         <!-- options are added dynamically -->
       </select>
-      <input type="submit" value="Donate!"/>
-      <br>
+      <select id="taler-donation" name="donation_amount">
+        <option value="0.1">0.1 {{ merchant_currency }}</option>
+        <option value="1">1 {{ merchant_currency }}</option>
+        <option value="6">5 {{ merchant_currency }}</option>
+        <option value="10">10 {{ merchant_currency }}</option>
+      </select>
+      <input type="submit" class="pure-button pure-button-primary" 
value="Donate!"/>
     </div>
   </form>
   <p>
@@ -76,4 +54,9 @@
   </p>
 </div>
 
+<h2>Back-office interface</h2>
+<p>Try the <a href="backoffice">back-office</a>, in order to track
+orders and corresponding deposits.
+</p>
+
 {% endblock %}
diff --git a/talerfrontends/static/tracking-error.js 
b/talerfrontends/static/tracking-error.js
deleted file mode 100644
index 87cf11f..0000000
--- a/talerfrontends/static/tracking-error.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-  @licstart  The following is the entire license notice for the
-  JavaScript code in this page.
-
-  Copyright (C) 2015, 2016 INRIA
-
-  The JavaScript code in this page is free software: you can
-  redistribute it and/or modify it under the terms of the GNU
-  Lesser General Public License (GNU LGPL) as published by the Free Software
-  Foundation, either version 2.1 of the License, or (at your option)
-  any later version.  The code is distributed WITHOUT ANY WARRANTY;
-  without even the implied warranty of MERCHANTABILITY or FITNESS
-  FOR A PARTICULAR PURPOSE.  See the GNU LGPL for more details.
-
-  As additional permission under GNU LGPL version 2.1 section 7, you
-  may distribute non-source (e.g., minimized or compacted) forms of
-  that code without the copy of the GNU LGPL normally required by
-  section 4, provided you include this license notice and a URL
-  through which recipients can access the Corresponding Source.
-
-  @licend  The above is the entire license notice
-  for the JavaScript code in this page.
- 
-  @brief Contains functions that regulate the focus to input fields
-         and others that request /history to the frontend
-  @author Marcello Stanisci
-*/
-
-/**
- * Append anchor needed to save content to disk. Used on
- * errors to save crypto proofs.
- */
-function save_proof(){
-  var content = document.querySelectorAll("[name=proof]")[0];
-  console.log("Saving blob:", content);
-  var blob = new Blob([content.getAttribute("value")], {type:"text/plain"}); 
-  var href = window.URL.createObjectURL(blob);
-  var a = document.createElement("a");
-  var d = new Date();
-  a.download =  d.getFullYear()
-                + "-" + d.getMonth()
-                + "-" + d.getDay()
-                + "_" + d.getHours()
-                + "-" + d.getMinutes()
-                + "-" + d.getSeconds()
-                + ".conflict-proof";
-  a.href = href;
-  var d = new Date();
-  a.innerHTML = "Export proof to file";
-  var container = document.getElementById("save-file");
-  container.appendChild(a);
-}
-
-document.addEventListener("DOMContentLoaded", save_proof);
diff --git a/talerfrontends/static/tracking.css 
b/talerfrontends/static/tracking.css
deleted file mode 100644
index dc49a35..0000000
--- a/talerfrontends/static/tracking.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.track-button {
-  float: left;
-}
-
-.track-trans {
-  font-size: medium;
-  white-space: nowrap;
-}
-
-#history, #history th, #history td {
-  border: 1px solid black;
-}
diff --git a/talerfrontends/static/tracking.js 
b/talerfrontends/static/tracking.js
deleted file mode 100644
index b5945bc..0000000
--- a/talerfrontends/static/tracking.js
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
-  @licstart  The following is the entire license notice for the
-  JavaScript code in this page.
-
-  Copyright (C) 2015, 2016 INRIA
-
-  The JavaScript code in this page is free software: you can
-  redistribute it and/or modify it under the terms of the GNU
-  Lesser General Public License (GNU LGPL) as published by the Free Software
-  Foundation, either version 2.1 of the License, or (at your option)
-  any later version.  The code is distributed WITHOUT ANY WARRANTY;
-  without even the implied warranty of MERCHANTABILITY or FITNESS
-  FOR A PARTICULAR PURPOSE.  See the GNU LGPL for more details.
-
-  As additional permission under GNU LGPL version 2.1 section 7, you
-  may distribute non-source (e.g., minimized or compacted) forms of
-  that code without the copy of the GNU LGPL normally required by
-  section 4, provided you include this license notice and a URL
-  through which recipients can access the Corresponding Source.
-
-  @licend  The above is the entire license notice
-  for the JavaScript code in this page.
- 
-  @brief Contains functions that regulate the focus to input fields
-         and others that request /history to the frontend
-  @author Marcello Stanisci
-*/
-"use strict";
-
-// Used when parsing amount objects into strings.
-var FRACTION = 100000000;
-
-/**
- * Attach event handlers where needed
- */
-function init(){
-  var inputs = document.querySelectorAll(".track-input");
-  for (var i=0; i<inputs.length; i++) {
-    inputs[i].onfocus = function(){
-      
this.parentNode.parentNode.querySelectorAll(".track-button")[0].removeAttribute("disabled")};
-    inputs[i].onblur = function(){
-      var button = 
this.parentNode.parentNode.querySelectorAll(".track-button")[0];
-      var father = this.parentNode;
-      setTimeout(function(){
-        if (document.activeElement != button
-            && document.activeElement.parentNode != father)
-          button.setAttribute("disabled", "disabled");
-        },
-        100);
-    };
-  }
-}
-
-/**
- * Paste transaction details into the form
- */
-function paste_transaction(tid, instance){
-
-  var form_fields = 
document.evaluate('//tbody/tr/th[2]/form//address@hidden"text"]',
-                                      document,
-                                      null,
-                                      XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
-                                      null);
-  for (var i = 0; i < form_fields.snapshotLength; i++){
-    var node = form_fields.snapshotItem(i);
-    switch (node.name){
-      case "tid":
-        node.value = tid;
-        break;
-      case "instance":
-        node.value = instance;
-        node.focus();
-    } 
-  }
-}
-
-/**
- * Paste transfer details into the form
- */
-function paste_transfer(exchange_uri, instance, wtid){
-
-  var form_fields = 
document.evaluate('//tbody/tr/th[1]/form//address@hidden"text"]',
-                                      document,
-                                      null,
-                                      XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
-                                      null);
-  for (var i = 0; i < form_fields.snapshotLength; i++){
-    var node = form_fields.snapshotItem(i);
-    switch (node.name){
-      case "wtid":
-        node.value = wtid;
-        break;
-      case "exchange-uri":
-        node.value = exchange_uri;
-        break;
-      case "instance":
-        node.value = instance;
-        node.focus();
-    } 
-  }
-}
-
-/**
- * Parse Taler date string
- */
-function get_date(date){
-  var split = date.match(/Date\((.*)\)/);
-  var seconds;
-  if(isNaN(seconds = Number(split[1]))){
-    console.error("Malformed date gotten from backend");
-    return;
-  }
-  console.log("Extracting timestamp", split[1]);
-  var d = new Date(seconds * 1000);
-  return d;
-}
-
-/**
- * Stringify amounts
- */
-function parse_amount(amount){
-  var v = amount.value + (amount.fraction/FRACTION);
-  return v + " " + amount.currency;
-}
-
-
-/**
- * Issue a /map/out to the frontend, in order to
- * get a plain contract corresponding to the given
- * hashcode.  Update the column with the received
- * content.
- */
-function fill_contract_details(summary_column,
-                               instance_column,
-                               tid_column,
-                               entry){
-  /* Wait for frontend implementing /map. */
-  var req = new XMLHttpRequest();
-
-  var on_error = function(){
-    var msg = "Not able to talk to frontend.";
-    summary_column.textContent = msg;
-    instance_column.textContent = msg;
-  };
-
-  req.open("GET", `/map?h_contract=${entry.h_contract}`);
-  req.onerror = on_error;
-  req.onload = function(){
-    if(req.readyState == 4 && req.status == 200){
-      var contract = JSON.parse(req.responseText); 
-      if(!contract){
-        console.log("Got invalid JSON.");
-        column.textContent = "Frontend gave invalid contract.";
-        return;
-      }
-      summary_column.textContent = contract.summary;
-      instance_column.textContent
-        = contract.merchant.instance ? contract.merchant.instance : "default";
-      tid_column.innerHTML
-        = `<a href="#" onclick='paste_transaction("${entry.transaction_id}", 
"${contract.merchant.instance}");'>
-             ${entry.transaction_id}
-           </a>`;
-    }
-    else
-      on_error();
-  };
-  req.send();
-}
-
-/**
- * This function gets triggered when the user submits the form
- * used to get a list of transactions
- */
-function submit_history(){
-  var table = document.getElementById("history");
-
-  /**
-   * Remove leftovers.
-   */
-  var entries = document.getElementsByClassName("history-entry");
-  while (0 < entries.length)
-    table.removeChild(entries[0]);
-
-  var days = document.getElementById("history_form").days.value;
-  var req = new XMLHttpRequest();
-  var get_column = function(value, ra){
-    var column = document.createElement("td");
-    column.textContent = value;
-    if (ra)
-      column.setAttribute("align", "right");
-    return column;
-  };
-  var on_error = function(){
-    table.innerHTML = "<p>Could not get transactions list from server</p>"
-  };
-  req.open("GET", `/history?days=${days}`, true);
-  req.onload = function(){
-    if(req.readyState == 4 && req.status == 200){
-      var history = JSON.parse(req.responseText); 
-      if(!history)
-        console.log("Got invalid JSON");
-      if(0 == history.length){
-        table.innerHTML = "<p>No transaction was that young!</p>"; 
-      }
-      for (var i=0; i<history.length; i++){
-       var entry = history[i];
-        var tr = document.createElement("tr");
-        tr.className = "history-entry";
-        // * tr.appendChild(get_column(entry.transaction_id));
-        var async_tid_column = get_column("");
-        tr.appendChild(async_tid_column);
-       var date = get_date(entry.timestamp);
-       tr.appendChild(get_column(date.toDateString()
-                       + " " + date.toLocaleTimeString()));
-        var async_summary_column = get_column("");
-        var async_instance_column = get_column("");
-        tr.appendChild(async_summary_column);
-        tr.appendChild(async_instance_column);
-        fill_contract_details(async_summary_column,
-                              async_instance_column,
-                              async_tid_column,
-                              entry);
-       tr.appendChild(get_column(parse_amount(entry.total_amount), true))
-       table.appendChild(tr);
-      }
-      table.style.visibility = "";
-    }
-    else{
-      on_error();
-    }
-  };
-  req.send();
-}
-
-document.addEventListener("DOMContentLoaded", init);
diff --git a/talerfrontends/templates/error.html 
b/talerfrontends/templates/error.html
deleted file mode 100644
index e2a551d..0000000
--- a/talerfrontends/templates/error.html
+++ /dev/null
@@ -1,12 +0,0 @@
-{% extends "templates/base.html" %}
-
-{% block scripts %}
-<script src="/static-common/tracking.js" 
type="application/javascript"></script>
-<link rel="stylesheet" type="text/css" href="/static-common/tracking.css">
-{% endblock %}
-
-{% block main %}
-Error type: {{ error }}
-<br>
-details: {{ details }}
-{% endblock %}
diff --git a/talerfrontends/templates/tracking.html 
b/talerfrontends/templates/tracking.html
deleted file mode 100644
index 5fb331f..0000000
--- a/talerfrontends/templates/tracking.html
+++ /dev/null
@@ -1,101 +0,0 @@
-{% extends "templates/base.html" %}
-
-{% block scripts %}
-<script src="/static-common/tracking.js" 
type="application/javascript"></script>
-<link rel="stylesheet" type="text/css" href="/static-common/tracking.css">
-{% endblock %}
-
-{% block main %}
-<div>
-  <table>
-    <tbody>
-      <tr>
-        <th>Wire transfers</th>
-        <th>Transactions</th>
-      </tr>
-      <tr>
-        <th>
-          <form action="/track/transfer" method="GET" class="track-form">
-            <div>
-              <input class="track-input" type="text" name="wtid" 
placeholder="Wire transfer id"/><br>
-              <input class="track-input" type="text" name="exchange-uri" 
placeholder="exchange URI"/><br>
-              <input class="track-input" type="text" name="instance" 
placeholder="Instance"/><br>
-            </div>
-            <div>
-              <input type="submit" value="Track!" class="track-button" 
disabled="disabled"/>
-            </div>
-          </form>
-        </th>
-        <th>
-          <form action="/track/transaction" method="GET" class="track-form">
-            <div>
-              <input class="track-input" type="text" name="tid" 
placeholder="Transaction id"/><br>
-              <input class="track-input" type="text" name="instance" 
placeholder="Instance"/><br>
-            </div>
-            <div>
-              <input type="submit" value="Track!" class="track-button" 
disabled="disabled"/>
-            </div>
-          </form>
-        </th>
-      </tr>
-    </tbody>
-  </table>
-  <div id="result">
-  </div>
-</div>
-{% if transaction %}
-  <p>Records for transaction: {{ original.transaction }}{% if 
original.instance %},
-     for merchant instance {{ original.instance }}{% endif %}
-  </p>
-  {% for e in tracks %}
-  <ol class="track-trans">
-    <li>
-      <ul>
-        <li>
-          WTID: <a href="#" onclick='paste_transfer("{{ e["exchange"] }}", "{{ 
original.instance }}", "{{ e["wtid"] }}");'>{{ e["wtid"] }}</a>
-        </li>
-        <li>date: {{ e["date"] }}</li>
-        <li>amount: {{ e["amount"] }}</li>
-        <li>operated by {{ e["exchange"] }}</li>
-      </ul>
-    </li>
-  </ol>
-  {% endfor %}
-{% elif transfer %}
-  <p>Records for WTID: {{ original.wtid }}:</p>
-    <ol>
-      <li>
-        {% for e in tracks["deposits"] %}
-          <ul>
-            <li>
-              Transaction: <a href="#" onclick='paste_transaction("{{ 
e["transaction_id"] }}", "{{ original.instance }}");'>{{ e["transaction_id"] 
}}</a>
-            </li>
-            <li>amount: {{ e["deposit_value"]}}</li>
-          </ul>
-        {% endfor %}
-      </li>
-    </ol>
-  <p>Total: {{ tracks["total"] }}</p>
-{% else %}
-  <p>{{ msg }}</p>
-{% endif %}
-<form id="history_form" action="/history" method="GET">
-  Get transactions up to
-  <select name="days">
-    <option value="1">1</option>
-    <option value="2">2</option>
-    <option value="7">7</option>
-    <option value="0">&infin;</option>
-  </select>
-  days back: <input type="button" onclick="submit_history();" value="Get!">
-  <br>
-  <small>Works only if JavaScript enabled</small>
-</form>
-<br/>
-<table id="history" style="visibility: hidden;">
-  <tr>
-    <th>Order ID</th>
-  </tr>
-</table>
-
-{% endblock %}
diff --git a/talerfrontends/templates/transaction_conflict.html 
b/talerfrontends/templates/transaction_conflict.html
deleted file mode 100644
index 339afc3..0000000
--- a/talerfrontends/templates/transaction_conflict.html
+++ /dev/null
@@ -1,15 +0,0 @@
-{% extends "templates/base.html" %}
-
-{% block scripts %}
-<script src="/static-common/tracking-error.js" 
type="application/javascript"></script>
-{% endblock %}
-
-{% block main %}
-<meta name="proof" value="{{ details }}">
-
-<p>Conflict: in the attempt to track transaction {{ transaction_id }},
-the exchange claims that coin {{ details.coin_pub }} was transferred by WTID:
-{{ details.transaction_tracking_claim.wtid }}, whereas in previous tracks of
-transaction {{ transaction_id }} that same coin was unknown to the exchange.
-<div id="save-file"></div>
-{% endblock %}
diff --git a/talerfrontends/templates/transfer_conflict.html 
b/talerfrontends/templates/transfer_conflict.html
deleted file mode 100644
index 47795d6..0000000
--- a/talerfrontends/templates/transfer_conflict.html
+++ /dev/null
@@ -1,15 +0,0 @@
-{% extends "templates/base.html" %}
-
-{% block scripts %}
-<script src="/static-common/tracking-error.js" 
type="application/javascript"></script>
-{% endblock %}
-
-{% block main %}
-<meta name="proof" value="{{ details }}">
-
-<p>Conflict in deposited coin {{ details.coin_pub }}: the exchange
-wire transferred an amount that differs from the amount we deposited.</p>
-<p>Deposited amount:
-{{ expected_amount }} for transaction {{ transaction_id }}</p>
-<p>Wire transferred amount by the exchange: {{ transferred_amount }}</p>
-{% endblock %}

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]