<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[3743] sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments: WordCamp Budgets: Another pass at the Budget Tool:</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://meta.trac.wordpress.org/changeset/3743">3743</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://meta.trac.wordpress.org/changeset/3743","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>kovshenin</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2016-07-29 14:24:31 +0000 (Fri, 29 Jul 2016)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>WordCamp Budgets: Another pass at the Budget Tool:

* Approval flow
* Reorder items
* Better styling
* Various UI fixes
* Some validation
* Refreshing nonces
* New links
* Currency dropdown</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswordcamppaymentscsswordcampbudgetscss">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/css/wordcamp-budgets.css</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswordcamppaymentsincludesbudgettoolphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/includes/budget-tool.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswordcamppaymentsincludeswordcampbudgetsphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/includes/wordcamp-budgets.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswordcamppaymentsjavascriptbudgettooljs">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/javascript/budget-tool.js</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentpluginswordcamppaymentsviewsbudgettoolmainphp">sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/views/budget-tool/main.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswordcamppaymentscsswordcampbudgetscss"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/css/wordcamp-budgets.css</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/css/wordcamp-budgets.css        2016-07-29 11:58:50 UTC (rev 3742)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/css/wordcamp-budgets.css  2016-07-29 14:24:31 UTC (rev 3743)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -192,155 +192,215 @@
</span><span class="cx" style="display: block; padding: 0 10px">        float: left;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+.wcb-budget-tool .nav-tab-wrapper svg {
+       fill: #888;
+       position: absolute;
+       margin-top: 2px;
+       width: 20px;
+       height: 20px;
+}
+
+.wcb-budget-tool .nav-tab-wrapper svg + span {
+       padding-left: 24px;
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    width: 100%;
-    table-layout: fixed;
-    white-space:nowrap;
-    text-align: left;
-    border-collapse: collapse;
-    background: white;
-    margin: 12px 0;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ width: 100%;
+       table-layout: fixed;
+       white-space:nowrap;
+       text-align: left;
+       border-collapse: collapse;
+       background: white;
+       margin: 12px 0;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container,
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container td,
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container th {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    overflow: hidden;
-    text-overflow: ellipsis;
-    border: solid 1px #ccc;
-    height: 30px;
-    line-height: 30px;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ overflow: hidden;
+       text-overflow: ellipsis;
+       border: solid 1px #ccc;
+       height: 30px;
+       line-height: 30px;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container th {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    background: #f8f8f8;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ background: #f8f8f8;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container td,
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container th {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    vertical-align: top;
-    padding: 0 4px;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ vertical-align: top;
+       padding: 0 4px;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+.wcb-budget-container .wcb-entry {
+       width: 100%;
+}
+
+.ui-sortable-helper {
+       display: table;
+       background: white;
+       table-layout: fixed;
+}
+
+.wcb-entry-placeholder {
+       background: #f0f0f0;
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container tr.has-changed td {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    background: #f7ecdc;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ background: #f7ecdc;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container tr.is-new td {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    background: #dcf7e0;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ background: #dcf7e0;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .wcb-entry td.editable {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    padding: 0;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ padding: 0;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .wcb-entry input,
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .wcb-entry select {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    float: left;
-    padding: 0 4px;
-    width: 100%;
-    border: 0;
-    margin: 0;
-    background: transparent;
-    -webkit-appearance: none;
-    -moz-appearance: none;
-    appearance: none;
-    border: none;
-    box-shadow: none;
-    border-radius: 0;
-    height: 30px;
-    line-height: 30px;
-    font-size: inherit;
-    cursor: default;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ float: left;
+       padding: 0 4px;
+       width: 100%;
+       border: 0;
+       margin: 0;
+       background: transparent;
+       -webkit-appearance: none;
+       -moz-appearance: none;
+       appearance: none;
+       border: none;
+       box-shadow: none;
+       border-radius: 0;
+       height: 30px;
+       line-height: 30px;
+       font-size: inherit;
+       cursor: default;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+.wcb-budget-container .wcb-entry select {
+       background-image: url('data:image/svg+xml;utf8,<svg width="16" height="16" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path fill="#888" d="M1408 704q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45z"/></svg>');
+       background-repeat: no-repeat;
+       background-position: 98% center;
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .wcb-entry td.focused {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    background: #e8f1f7;
-    border: double 1px #999;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ background: #e8f1f7;
+       border: double 1px #999;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container tr.is-new td.focused {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    background: #ecf7ee;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ background: #ecf7ee;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .wcb-entry input:focus {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    cursor: text;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ cursor: text;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .dashicons {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    color: inherit;
-    text-decoration: none;
-    line-height: 30px;
-    color: #aaa;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ color: inherit;
+       text-decoration: none;
+       line-height: 30px;
+       color: #aaa;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .actions {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    text-align: right;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ text-align: right;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+.wcb-budget-container .actions a {
+       font-size: 9px;
+       text-transform: uppercase;
+       text-decoration: none;
+       display: inline-block;
+       margin-left: 2px;
+       margin-right: 4px;
+       color: #aaa;
+}
+
+.wcb-budget-container .actions a:hover {
+       color: inherit;
+}
+
+.wcb-budget-container .move {
+       cursor: move;
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container tr:hover .dashicons {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    color: #444;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ color: #444;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .amount {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    text-align: right;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ text-align: right;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .link {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    float: right;
-    margin: -4px 4px 4px 0;
-    text-align: right;
-    font-size: 10px;
-    color: #aaa;
-    line-height: 10px;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ margin: -4px 0px 4px 0;
+       float: right;
+       text-align: right;
+       font-size: 10px;
+       color: #aaa;
+       line-height: 10px;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+.wcb-budget-container .editable .link {
+       margin: -4px 4px 4px 0;
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .wcb-entry td.focused .link-toggle {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    opacity: 1;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ opacity: 1;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .wcb-entry td.focused .link span {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    opacity: 0;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ opacity: 0;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+.wcb-budget-container .wcb-entry td.focused .link-value {
+       cursor: pointer;
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .link-toggle {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    opacity: 0;
-    position: absolute;
-    text-decoration: none;
-    color: #444;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ opacity: 0;
+       position: absolute;
+       text-decoration: none;
+       color: #444;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .link-toggle .dashicons {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    font-size: 16px;
-    padding-left: 2px;
-    padding-right: 2px;
-    padding-top: 1px;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ font-size: 16px;
+       padding-left: 2px;
+       padding-right: 2px;
+       padding-top: 1px;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-container .link-toggle .link-value {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    position: absolute;
-    background: red;
-    width: 30px;
-    opacity: 0;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ position: absolute;
+       background: red;
+       width: 30px;
+       opacity: 0;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-expense-placeholder,
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-income-placeholder {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    color: #aaa;
-    font-style: italic;
-    cursor: pointer;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ color: #aaa;
+       font-style: italic;
+       cursor: pointer;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-summary,
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-summary td,
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-summary th {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    border-left: none;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ border-left: none;
+       font-weight: 600;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-negative {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    color: red;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ color: red;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> .wcb-budget-summary .inspire {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    color: #aaa;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ color: #aaa;
+       font-weight: normal;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswordcamppaymentsincludesbudgettoolphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/includes/budget-tool.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/includes/budget-tool.php        2016-07-29 11:58:50 UTC (rev 3742)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/includes/budget-tool.php  2016-07-29 14:24:31 UTC (rev 3743)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3,6 +3,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">     public static function load() {
</span><span class="cx" style="display: block; padding: 0 10px">         add_action( 'admin_menu', array( __CLASS__, 'admin_menu' ), 9 );
</span><span class="cx" style="display: block; padding: 0 10px">         add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        add_filter( 'heartbeat_received', array( __CLASS__, 'heartbeat_received' ), 10, 2 );
+        add_filter( 'map_meta_cap', array( __CLASS__, 'map_meta_cap' ), 10, 4 );
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     public static function admin_menu() {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -18,10 +20,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">         if ( empty( $_REQUEST['_wpnonce'] ) || ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'wcb_budget_noop-options' ) )
</span><span class="cx" style="display: block; padding: 0 10px">             return;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $budget = get_option( 'wcb_budget', array() );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $budget = self::_get_budget();
+        $data = json_decode( wp_unslash( $_POST['_wcb_budget_data'] ), true );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        // TODO: Add prelim, approved, current logic here.
-        $data = json_decode( wp_unslash( $_POST['_wcb_budget_data'] ), true );
</del><span class="cx" style="display: block; padding: 0 10px">         $valid_attributes = array( 'type', 'category', 'amount', 'note', 'link', 'name', 'value' );
</span><span class="cx" style="display: block; padding: 0 10px">         foreach ( $data as &$item ) {
</span><span class="cx" style="display: block; padding: 0 10px">             $_item = array();
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -38,8 +39,31 @@
</span><span class="cx" style="display: block; padding: 0 10px">             $item = $_item;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $budget['current'] = $data;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if ( $budget['status'] == 'draft' && ! empty( $_POST['wcb-budget-save-draft'] ) ) {
+            $budget['prelim'] = $data;
+        } elseif ( $budget['status'] == 'draft' && ! empty( $_POST['wcb-budget-submit'] ) ) {
+            $budget['prelim'] = $data;
+            $budget['status'] = 'pending';
+        } elseif ( $budget['status'] == 'pending' && current_user_can( 'wcb_approve_budget' ) ) {
+            if ( ! empty( $_POST['wcb-budget-reject'] ) ) {
+                $budget['status'] = 'draft';
+            } elseif ( ! empty( $_POST['wcb-budget-approve'] ) ) {
+                $budget['status'] = 'approved';
+                $budget['approved_by'] = get_current_user_id();
+
+                // Clone the approved prelim. budget.
+                $budget['approved'] = $budget['prelim'];
+                $budget['working'] = $budget['prelim'];
+            }
+        } elseif ( $budget['status'] == 'approved' && ! empty( $_POST['wcb-budget-update-working'] ) ) {
+            $budget['working'] = $data;
+        } elseif ( $budget['status'] == 'approved' && ! empty( $_POST['wcb-budget-reset'] ) ) {
+            $budget['working'] = $budget['approved'];
+        }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         $budget['updated'] = time();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $budget['updated_by'] = get_current_user_id();
+
</ins><span class="cx" style="display: block; padding: 0 10px">         update_option( 'wcb_budget', $budget, 'no' );
</span><span class="cx" style="display: block; padding: 0 10px">         return;
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -49,10 +73,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">         if ( $screen->id == 'toplevel_page_wordcamp-budget' ) {
</span><span class="cx" style="display: block; padding: 0 10px">             wp_enqueue_script( 'wcb-budget-tool',
</span><span class="cx" style="display: block; padding: 0 10px">                 plugins_url( 'javascript/budget-tool.js', __DIR__ ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                array( 'backbone', 'jquery', 'underscore' ), 1 , true );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                array( 'backbone', 'jquery', 'jquery-ui-sortable', 'heartbeat', 'underscore' ), 2 , true );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    private static function _get_budget() {
+        $budget = get_option( 'wcb_budget', array(
+            'status' => 'draft',
+            'prelim' => self::_get_default_budget(),
+        ) );
+
+        return $budget;
+    }
+
</ins><span class="cx" style="display: block; padding: 0 10px">     private static function _get_default_budget() {
</span><span class="cx" style="display: block; padding: 0 10px">         return array(
</span><span class="cx" style="display: block; padding: 0 10px">             array( 'type' => 'meta', 'name' => 'attendees', 'value' => 300 ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -85,9 +118,22 @@
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     public static function render() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $budget = get_option( 'wcb_budget' );
-        $budget = ! empty( $budget['current'] ) ? $budget['current'] : self::_get_default_budget();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $budget = self::_get_budget();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $view = ! empty( $_GET['wcb-view'] ) ? $_GET['wcb-view'] : 'prelim';
+        if ( ! in_array( $view, array( 'prelim', 'working', 'approved' ) ) )
+            $view = 'prelim';
+
+        if ( $view == 'prelim' && $budget['status'] == 'approved' )
+            $view = 'approved';
+
+        $editable = false;
+        if ( $view == 'prelim' && $budget['status'] == 'draft' ) {
+            $editable = true;
+        } elseif ( $view == 'working' && $budget['status'] == 'approved' ) {
+            $editable = true;
+        }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( ! $inspire_urls = get_site_transient( 'wcb-inspire-urls' ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">             $urls = array( 'https://jawordpressorg.github.io/wapuu/wapuu-archive/original-wapuu.png' );
</span><span class="cx" style="display: block; padding: 0 10px">             $r = wp_remote_get( 'https://jawordpressorg.github.io/wapuu-api/v1/wapuu.json' );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -102,8 +148,40 @@
</span><span class="cx" style="display: block; padding: 0 10px">             set_site_transient( 'wcb-inspire-urls', $inspire_urls, 30 * DAY_IN_SECONDS );
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $currencies = WordCamp_Budgets::get_currencies();
+        foreach ( $currencies as $key => $value )
+            if ( substr( $key, 0, 4 ) == 'null' )
+                unset( $currencies[ $key ] );
+
+        ksort( $currencies );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         require( dirname( __DIR__ ) . '/views/budget-tool/main.php' );
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+    public static function heartbeat_received( $response, $data ) {
+        if ( empty( $data['wcb_budgets_heartbeat'] ) )
+            return $response;
+
+        $response['wcb_budgets'] = array(
+            'nonce' => wp_create_nonce( 'wcb_budget_noop-options' ),
+        );
+
+        return $response;
+    }
+
+    public static function map_meta_cap( $caps, $cap, $user_id, $args ) {
+        global $trusted_deputies;
+
+        if ( $cap == 'wcb_approve_budget' ) {
+            if ( user_can( $user_id, is_multisite() ? 'manage_network' : 'manage_options' ) ) {
+                $caps = array( 'exist' );
+            } elseif ( in_array( $user_id, (array) $trusted_deputies ) ) {
+                $caps = array( 'exist' );
+            }
+        }
+
+        return $caps;
+    }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> WordCamp_Budget_Tool::load();
</span><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswordcamppaymentsincludeswordcampbudgetsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/includes/wordcamp-budgets.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/includes/wordcamp-budgets.php   2016-07-29 11:58:50 UTC (rev 3742)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/includes/wordcamp-budgets.php     2016-07-29 14:24:31 UTC (rev 3743)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -160,7 +160,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'wordcamp-budgets',
</span><span class="cx" style="display: block; padding: 0 10px">                        plugins_url( 'css/wordcamp-budgets.css', __DIR__ ),
</span><span class="cx" style="display: block; padding: 0 10px">                        $soft_deps,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        5
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 6
</ins><span class="cx" style="display: block; padding: 0 10px">                 );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswordcamppaymentsjavascriptbudgettooljs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/javascript/budget-tool.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/javascript/budget-tool.js       2016-07-29 11:58:50 UTC (rev 3742)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/javascript/budget-tool.js 2016-07-29 14:24:31 UTC (rev 3743)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,7 +1,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> window.wcb = window.wcb || {models:{}, input:[]};
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> (function($){
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    var $container = $('.wcb-budget-container tbody'),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    var $document = $(document),
+        $container = $('.wcb-budget-container tbody'),
</ins><span class="cx" style="display: block; padding: 0 10px">         $income = $container.find('.wcb-income-placeholder'),
</span><span class="cx" style="display: block; padding: 0 10px">         $expense = $container.find('.wcb-expense-placeholder'),
</span><span class="cx" style="display: block; padding: 0 10px">         $meta = $container.find('.wcb-meta-placeholder'),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -102,6 +103,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 'income': 0,
</span><span class="cx" style="display: block; padding: 0 10px">                 'expenses': 0,
</span><span class="cx" style="display: block; padding: 0 10px">                 'variance': 0,
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                'variance_raw': 0,
</ins><span class="cx" style="display: block; padding: 0 10px">                 'per_person': 0
</span><span class="cx" style="display: block; padding: 0 10px">             };
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -114,9 +116,20 @@
</span><span class="cx" style="display: block; padding: 0 10px">             });
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">             data['variance'] = data['income'] - data['expenses'];
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            data['variance_raw'] = data['variance'];
</ins><span class="cx" style="display: block; padding: 0 10px">             var attendees = wcb.table.collection.findWhere({type: 'meta', name: 'attendees'});
</span><span class="cx" style="display: block; padding: 0 10px">             data['per_person'] = attendees ? data['expenses'] / attendees.get('value') : 0;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            data = _.mapObject(data, function(v, k) {
+                if (k == 'variance_raw')
+                    return v;
+
+                return v.toLocaleString('en-US', {
+                    minimumFractionDigits: 2,
+                    maximumFractionDigits: 2
+                });
+            });
+
</ins><span class="cx" style="display: block; padding: 0 10px">             this.template = _.template($('#wcb-tmpl-summary').html(), null, template_options);
</span><span class="cx" style="display: block; padding: 0 10px">             this.$el.html(this.template(data));
</span><span class="cx" style="display: block; padding: 0 10px">             return this;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -141,9 +154,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">         events: {
</span><span class="cx" style="display: block; padding: 0 10px">             'keyup': 'keyup',
</span><span class="cx" style="display: block; padding: 0 10px">             'click .delete': 'delete',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            'click .move': 'move',
</ins><span class="cx" style="display: block; padding: 0 10px">             'change input': 'editSave',
</span><span class="cx" style="display: block; padding: 0 10px">             'change select.category': 'editSave',
</span><span class="cx" style="display: block; padding: 0 10px">             'change select.link-value': 'linkChange',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            'change select.value': 'editSave',
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">             'focus input, select': 'focus',
</span><span class="cx" style="display: block; padding: 0 10px">             'blur input, select': 'blur'
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -163,9 +178,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">             var $target = $(e.target);
</span><span class="cx" style="display: block; padding: 0 10px">             $target.parents('td').addClass('focused');
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            if (($target.hasClass('amount') || $target.hasClass('link-value')) && this.model.get('link') && this.model.linkHasValue())
-                this.$el.find('.amount').val(this.model.get('amount').toFixed(2));
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            if (($target.hasClass('amount') || $target.hasClass('link-value')) && this.model.get('link') && this.model.linkHasValue()) {
+                this.$el.find('.amount').val(this.model.get('amount').toLocaleString('en-US', {
+                    minimumFractionDigits: 2,
+                    maximumFractionDigits: 2
+                }));
+            }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            if ($target.hasClass('note') && $target.parents('tr').hasClass('is-new')) {
+                if (_.contains(['New Expense Item', 'New Income Item'], this.model.get('note'))) {
+                    this.$el.find('.note').val('');
+                }
+            }
+
</ins><span class="cx" style="display: block; padding: 0 10px">             return this;
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -173,15 +198,27 @@
</span><span class="cx" style="display: block; padding: 0 10px">             var $target = $(e.target);
</span><span class="cx" style="display: block; padding: 0 10px">             $target.parents('td').removeClass('focused');
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            if (($target.hasClass('amount') || $target.hasClass('link-value')) && this.model.get('link'))
-                this.$el.find('.amount').val(this.model.getRealAmount().toFixed(2));
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            if (($target.hasClass('amount') || $target.hasClass('link-value')) && this.model.get('link')) {
+                this.$el.find('.amount').val(this.model.getRealAmount().toLocaleString('en-US', {
+                    minimumFractionDigits: 2,
+                    maximumFractionDigits: 2
+                }));
+            }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            if ($target.hasClass('note') && $target.parents('tr').hasClass('is-new')) {
+                if (_.contains(['New Expense Item', 'New Income Item'], this.model.get('note'))) {
+                    this.$el.find('.note').val(this.model.get('note'));
+                }
+            }
+
</ins><span class="cx" style="display: block; padding: 0 10px">             return this;
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">         render: function() {
</span><span class="cx" style="display: block; padding: 0 10px">             var data = this.model.toJSON();
</span><span class="cx" style="display: block; padding: 0 10px">             data.realAmount = this.model.getRealAmount();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            data.realAmountFormatted = data.realAmount.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
+            data.amountFormatted = data.amount.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
</ins><span class="cx" style="display: block; padding: 0 10px">             data.linkLabel = this.model.getLinkLabel();
</span><span class="cx" style="display: block; padding: 0 10px">             data.linkHasValue = this.model.linkHasValue();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -189,6 +226,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             this.$el.html(this.template(data));
</span><span class="cx" style="display: block; padding: 0 10px">             this.$el.toggleClass('has-changed', this.model.hasChanged() && ! this.model.get('new'));
</span><span class="cx" style="display: block; padding: 0 10px">             this.$el.toggleClass('is-new', this.model.get('new'));
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            this.$el.data('wcb-cid', this.model.cid);
</ins><span class="cx" style="display: block; padding: 0 10px">             return this;
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -204,14 +242,25 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">         editSave: function(e) {
</span><span class="cx" style="display: block; padding: 0 10px">             if (this.model.get('type') == 'meta') {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                this.model.set('value', this.$el.find('.value').val());
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                var value = this.$el.find('.value').val(),
+                    name = this.model.get('name');
+
+                if (_.contains(['attendees', 'days', 'tracks', 'speakers', 'volunteers'], name)) {
+                    value = parseInt(value.replace(/[^\d.-]/g, '')) || 0;
+                } else if (_.contains(['ticket-price'], name)) {
+                    value = parseFloat(value.replace(/[^\d.-]/g, '')) || 0;
+                }
+
+                this.model.set('value', value);
</ins><span class="cx" style="display: block; padding: 0 10px">             } else {
</span><span class="cx" style="display: block; padding: 0 10px">                 this.model.set('note', this.$el.find('.note').val());
</span><span class="cx" style="display: block; padding: 0 10px">                 this.model.set('category', this.$el.find('.category').val());
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                 var $target = $(e.target);
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ($target.hasClass('amount') || $target.hasClass('link-value'))
-                    this.model.set('amount', parseFloat(this.$el.find('.amount').val()));
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                if ($target.hasClass('amount') || $target.hasClass('link-value')) {
+                    var amount = parseFloat(this.$el.find('.amount').val().replace(/[^\d.-]/g, ''));
+                    this.model.set('amount', amount || 0);
+                }
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">             this.clearSelection.apply(this);
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -246,9 +295,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">         delete: function() {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            if (!confirm('Delete this line item?'))
+                return false;
+
</ins><span class="cx" style="display: block; padding: 0 10px">             this.model.destroy();
</span><span class="cx" style="display: block; padding: 0 10px">             wcb.summary.render.apply(wcb.summary);
</span><span class="cx" style="display: block; padding: 0 10px">             return false;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        },
+
+        move: function() {
+            return false;
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">     });
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -326,7 +382,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             'label': 'per speaker',
</span><span class="cx" style="display: block; padding: 0 10px">             'hasValue': true,
</span><span class="cx" style="display: block; padding: 0 10px">             'callback': function(value) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return value * wcb.table.collection.findWhere({type: 'meta', name: 'speakers'}).get('value');
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                return parseFloat(value) * parseInt(wcb.table.collection.findWhere({type: 'meta', name: 'speakers'}).get('value'));
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -334,15 +390,26 @@
</span><span class="cx" style="display: block; padding: 0 10px">             'label': 'per volunteer',
</span><span class="cx" style="display: block; padding: 0 10px">             'hasValue': true,
</span><span class="cx" style="display: block; padding: 0 10px">             'callback': function(value) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return value * wcb.table.collection.findWhere({type: 'meta', name: 'volunteers'}).get('value');
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                return parseFloat(value) * parseInt(wcb.table.collection.findWhere({type: 'meta', name: 'volunteers'}).get('value'));
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        'per-speaker-volunteer': {
+            'label': 'per speakers + volunteers',
+            'hasValue': true,
+            'callback': function(value) {
+                return parseFloat(value) * (
+                    parseInt(wcb.table.collection.findWhere({type: 'meta', name: 'volunteers'}).get('value'))
+                    + parseInt(wcb.table.collection.findWhere({type: 'meta', name: 'speakers'}).get('value'))
+                );
+            }
+        },
+
</ins><span class="cx" style="display: block; padding: 0 10px">         'per-attendee': {
</span><span class="cx" style="display: block; padding: 0 10px">             'label': 'per attendee',
</span><span class="cx" style="display: block; padding: 0 10px">             'hasValue': true,
</span><span class="cx" style="display: block; padding: 0 10px">             'callback': function(value) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return value * wcb.table.collection.findWhere({type: 'meta', name: 'attendees'}).get('value');
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                return parseFloat(value) * parseInt(wcb.table.collection.findWhere({type: 'meta', name: 'attendees'}).get('value'));
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -350,7 +417,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             'label': 'per day',
</span><span class="cx" style="display: block; padding: 0 10px">             'hasValue': true,
</span><span class="cx" style="display: block; padding: 0 10px">             'callback': function(value) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return value * wcb.table.collection.findWhere({type: 'meta', name: 'days'}).get('value');
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                return parseFloat(value) * parseInt(wcb.table.collection.findWhere({type: 'meta', name: 'days'}).get('value'));
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -358,7 +425,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             'label': 'per track',
</span><span class="cx" style="display: block; padding: 0 10px">             'hasValue': true,
</span><span class="cx" style="display: block; padding: 0 10px">             'callback': function(value) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return value * wcb.table.collection.findWhere({type: 'meta', name: 'tracks'}).get('value');
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                return parseFloat(value) * parseInt(wcb.table.collection.findWhere({type: 'meta', name: 'tracks'}).get('value'));
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -368,7 +435,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             'callback': function(value) {
</span><span class="cx" style="display: block; padding: 0 10px">                 var attendees = wcb.table.collection.findWhere({type: 'meta', name: 'attendees'}).get('value');
</span><span class="cx" style="display: block; padding: 0 10px">                 var price = wcb.table.collection.findWhere({type: 'meta', name: 'ticket-price'}).get('value');
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return attendees * price;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                return parseInt(attendees) * parseFloat(price);
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -406,7 +473,18 @@
</span><span class="cx" style="display: block; padding: 0 10px">     });
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     $form.on('submit', function() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $form.find('[name="_wcb_budget_data"]').val(JSON.stringify(wcb.table.collection));
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $container.find('.wcb-entry').each(function(el){
+            var $this = $(this);
+                model = wcb.table.collection.get($this.data('wcb-cid'));
+
+            model.set({'order': $this.index()}, {silent: true});
+        });
+
+        var sorted = JSON.stringify(wcb.table.collection.sortBy(function(m){
+            return m.get('type') + ':' + (m.get('order')/Math.pow(10,10)).toFixed(10); // Don't ask.
+        }));
+
+        $form.find('[name="_wcb_budget_data"]').val(sorted);
</ins><span class="cx" style="display: block; padding: 0 10px">         return true;
</span><span class="cx" style="display: block; padding: 0 10px">     });
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -414,10 +492,52 @@
</span><span class="cx" style="display: block; padding: 0 10px">     wcb.table = table;
</span><span class="cx" style="display: block; padding: 0 10px">     wcb.summary = new SummaryView();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    // Sort all the input by types, meta first, because linked data in
+    // income and expenses rely on meta values.
+    var types = ['meta', 'expense', 'income'];
+    wcb.input = _.sortBy(wcb.input, function(i) {
+        return types.indexOf(i.type);
+    });
+
</ins><span class="cx" style="display: block; padding: 0 10px">     _.each(wcb.input, function(i){
</span><span class="cx" style="display: block; padding: 0 10px">         wcb.table.collection.add(new wcb.models.Entry(i));
</span><span class="cx" style="display: block; padding: 0 10px">     });
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     wcb.summary.urls = wcb.urls;
</span><span class="cx" style="display: block; padding: 0 10px">     wcb.summary.render();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+    // Allow sorting entries.
+    $container.sortable({
+        items: '.wcb-entry',
+        handle: '.move',
+        axis: 'y',
+        placeholder: 'wcb-entry-placeholder',
+        start: function(e, ui) {
+            ui.placeholder.height(ui.item.height());
+        }
+    });
+
+    // Update nonces when necessary.
+    // TODO: Add post locking.
+    $document.on('heartbeat-send', function(e, data) {
+        data['wcb_budgets_heartbeat'] = 1;
+    });
+
+    $document.on('heartbeat-tick', function(e, data) {
+        $('#_wpnonce').val(data.wcb_budgets.nonce);
+    });
+
+    $document.on('click', '#wcb-budget-submit', function() {
+        if (!confirm('Are you sure you would like to submit this budget for approval?'))
+            return false;
+
+        return true;
+    });
+
+    $document.on('click', '#wcb-budget-approve, #wcb-budget-reject', function() {
+        if (!confirm('Are you sure?'))
+            return false;
+
+        return true;
+    });
</ins><span class="cx" style="display: block; padding: 0 10px"> }(jQuery));
</span><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentpluginswordcamppaymentsviewsbudgettoolmainphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/views/budget-tool/main.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/views/budget-tool/main.php      2016-07-29 11:58:50 UTC (rev 3742)
+++ sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-payments/views/budget-tool/main.php        2016-07-29 14:24:31 UTC (rev 3743)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,16 +1,50 @@
</span><span class="cx" style="display: block; padding: 0 10px"> <script>
</span><span class="cx" style="display: block; padding: 0 10px"> window.wcb = window.wcb || {models:{}, input:[]};
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-wcb.input = <?php echo json_encode( $budget ); ?>;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+wcb.input = <?php echo json_encode( $budget[ $view ] ); ?>;
</ins><span class="cx" style="display: block; padding: 0 10px"> wcb.urls = <?php echo json_encode( $inspire_urls ); ?>;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+wcb.currencies = <?php echo json_encode( $currencies ); ?>;
+wcb.status = <?php echo json_encode( $budget['status'] ); ?>;
+wcb.view = <?php echo json_encode( $view ); ?>;
+wcb.editable = <?php echo json_encode( $editable ); ?>;
</ins><span class="cx" style="display: block; padding: 0 10px"> </script>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> <div class="wrap wcb-budget-tool">
</span><span class="cx" style="display: block; padding: 0 10px">     <h2 class="nav-tab-wrapper wp-clearfix">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <a href="#" class="nav-tab nav-tab-active">Preliminary Budget</a>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+        <?php if ( $budget['status'] == 'draft' || $budget['status'] == 'pending' ) : ?>
+               <a href="<?php echo esc_url( add_query_arg( 'wcb-view', 'prelim' ) ); ?>"
+            class="nav-tab <?php if ( $view == 'prelim' ) { ?>nav-tab-active<?php } ?>">
+
+            <?php if ( $budget['status'] == 'pending' ) : ?>
+            <svg width="20" height="20" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M640 768h512v-192q0-106-75-181t-181-75-181 75-75 181v192zm832 96v576q0 40-28 68t-68 28h-960q-40 0-68-28t-28-68v-576q0-40 28-68t68-28h32v-192q0-184 132-316t316-132 316 132 132 316v192h32q40 0 68 28t28 68z"/></svg>
+            <?php endif; ?>
+
+            <span>Preliminary Budget</span>
+        </a>
+        <?php elseif ( $budget['status'] == 'approved' ) : ?>
+               <a href="<?php echo esc_url( add_query_arg( 'wcb-view', 'approved' ) ); ?>"
+            class="nav-tab <?php if ( $view == 'approved' ) { ?>nav-tab-active<?php } ?>">
+            <svg width="20" height="20" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M640 768h512v-192q0-106-75-181t-181-75-181 75-75 181v192zm832 96v576q0 40-28 68t-68 28h-960q-40 0-68-28t-28-68v-576q0-40 28-68t68-28h32v-192q0-184 132-316t316-132 316 132 132 316v192h32q40 0 68 28t28 68z"/></svg>
+
+            <span>Approved Budget</span>
+        </a>
+               <a href="<?php echo esc_url( add_query_arg( 'wcb-view', 'working' ) ); ?>"
+            class="nav-tab <?php if ( $view == 'working' ) { ?>nav-tab-active<?php } ?>">
+            <span>Working Budget</span>
+        </a>
+        <?php endif; ?>
</ins><span class="cx" style="display: block; padding: 0 10px">                 <!--<a href="#" class="nav-tab">Working Budget</a>-->
</span><span class="cx" style="display: block; padding: 0 10px">        </h2>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    <?php if ( $budget['status'] == 'draft' ) : ?>
</ins><span class="cx" style="display: block; padding: 0 10px">     <p style="max-width: 800px;">Welcome to your WordCamp budget, it's time to crunch some numbers! When you're done with the preliminary budget, hit the "Submit for Approval" button below – a WordCamp deputy will be notified and will review your work. If you're having trouble with these numbers, or if you have any questions, don't hesitate to reach out to your mentor or Central.</p>
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    <?php elseif ( $budget['status'] == 'pending' ) : ?>
+    <p style="max-width: 800px;">This budget has been submitted for approval. You will be notified when it is approved. Or not.</p>
+    <?php elseif ( $budget['status'] == 'approved' && $view == 'approved' ) : ?>
+    <p style="max-width: 800px;">This budget has been approved and can not be modified. Use the working budget if you'd like to play around with numbers.</p>
+    <?php elseif ( $view == 'working' ) : ?>
+    <p style="max-width: 800px;">Welcome to your working budget. Feel free to play around with numbers here. They will not affect your approved budget.</p>
+    <?php endif; ?>
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     <div class="left">
</span><span class="cx" style="display: block; padding: 0 10px">         <h2>Event Data</h2>
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -37,13 +71,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">     <table class="wcb-budget-container">
</span><span class="cx" style="display: block; padding: 0 10px">         <tbody>
</span><span class="cx" style="display: block; padding: 0 10px">             <tr class="wcb-group-header">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <th style="width: 25%;">Category</th>
-                <th style="width: 25%;">Detail</th>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                <th style="width: 20%;">Category</th>
+                <th style="width: 40%;">Detail</th>
</ins><span class="cx" style="display: block; padding: 0 10px">                 <th style="width: 25%;" class="amount">Amount</th>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <th style="width: 25%;"></th>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                <th style="width: 15%;"></th>
</ins><span class="cx" style="display: block; padding: 0 10px">             </tr>
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">             <tr class="wcb-expense-placeholder">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                <?php if ( $editable ) : ?>
</ins><span class="cx" style="display: block; padding: 0 10px">                 <td colspan="4">New Expense Item</td>
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                <?php endif; ?>
</ins><span class="cx" style="display: block; padding: 0 10px">             </tr>
</span><span class="cx" style="display: block; padding: 0 10px">         </tbody>
</span><span class="cx" style="display: block; padding: 0 10px">     </table>
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -52,14 +89,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">     <table class="wcb-budget-container">
</span><span class="cx" style="display: block; padding: 0 10px">         <tbody>
</span><span class="cx" style="display: block; padding: 0 10px">             <tr class="wcb-group-header">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <th style="width: 25%;">Category</th>
-                <th style="width: 25%;">Detail</th>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                <th style="width: 20%;">Category</th>
+                <th style="width: 40%;">Detail</th>
</ins><span class="cx" style="display: block; padding: 0 10px">                 <th style="width: 25%;" class="amount">Amount</th>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <th style="width: 25%;"></th>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                <th style="width: 15%;"></th>
</ins><span class="cx" style="display: block; padding: 0 10px">             </tr>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">             <tr class="wcb-income-placeholder">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                <?php if ( $editable ) : ?>
</ins><span class="cx" style="display: block; padding: 0 10px">                 <td colspan="4">New Income Item</td>
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                <?php endif; ?>
</ins><span class="cx" style="display: block; padding: 0 10px">             </tr>
</span><span class="cx" style="display: block; padding: 0 10px">         </tbody>
</span><span class="cx" style="display: block; padding: 0 10px">     </table>
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -68,11 +107,24 @@
</span><span class="cx" style="display: block; padding: 0 10px">         <?php settings_fields( 'wcb_budget_noop' ); ?>
</span><span class="cx" style="display: block; padding: 0 10px">         <input type="hidden" name="_wcb_budget_data" value="<?php echo esc_attr( json_encode( $budget ) ); ?>" />
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        <?php if ( $budget['status'] == 'draft' ) : ?>
</ins><span class="cx" style="display: block; padding: 0 10px">         <p class="submit">
</span><span class="cx" style="display: block; padding: 0 10px">             <?php submit_button( 'Save Draft', 'secondary', 'wcb-budget-save-draft', false ); ?>
</span><span class="cx" style="display: block; padding: 0 10px">             <a href="<?php echo admin_url( 'admin.php?page=wordcamp-budget' ); ?>" class="button">Cancel Changes</a>
</span><span class="cx" style="display: block; padding: 0 10px">             <?php submit_button( 'Submit for Approval', 'primary', 'wcb-budget-submit', false ); ?>
</span><span class="cx" style="display: block; padding: 0 10px">         </p>
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        <?php elseif ( $budget['status'] == 'pending' && current_user_can( 'wcb_approve_budget' ) ) : ?>
+        <p class="submit">
+            <?php submit_button( 'Approve', 'primary', 'wcb-budget-approve', false ); ?>
+            <?php submit_button( 'Reject', 'primary', 'wcb-budget-reject', false ); ?>
+        </p>
+        <?php elseif ( $budget['status'] == 'approved' && $view == 'working' ) : ?>
+        <p class="submit">
+            <?php submit_button( 'Update Working Budget', 'primary', 'wcb-budget-update-working', false ); ?>
+            <a href="<?php echo admin_url( 'admin.php?page=wordcamp-budget&wcb-view=working' ); ?>" class="button">Cancel Changes</a>
+            <?php submit_button( 'Reset to Approved Budget', 'secondary', 'wcb-budget-reset', false ); ?>
+        </p>
+        <?php endif; ?>
</ins><span class="cx" style="display: block; padding: 0 10px">     </form>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -84,19 +136,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">         </tr>
</span><span class="cx" style="display: block; padding: 0 10px">         <tr>
</span><span class="cx" style="display: block; padding: 0 10px">             <td>Income</td>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            <td class="amount">{{data.income.toFixed(2)}}</td>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            <td class="amount">{{data.income}}</td>
</ins><span class="cx" style="display: block; padding: 0 10px">         </tr>
</span><span class="cx" style="display: block; padding: 0 10px">         <tr>
</span><span class="cx" style="display: block; padding: 0 10px">             <td>Expenses</td>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            <td class="amount">{{data.expenses.toFixed(2)}}</td>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            <td class="amount">{{data.expenses}}</td>
</ins><span class="cx" style="display: block; padding: 0 10px">         </tr>
</span><span class="cx" style="display: block; padding: 0 10px">         <tr>
</span><span class="cx" style="display: block; padding: 0 10px">             <td>Variance</td>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            <td class="amount <# if (data.variance < 0) { #>wcb-negative<# } #>">{{data.variance.toFixed(2)}}</td>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            <td class="amount <# if (data.variance_raw < 0) { #>wcb-negative<# } #>">{{data.variance}}</td>
</ins><span class="cx" style="display: block; padding: 0 10px">         </tr>
</span><span class="cx" style="display: block; padding: 0 10px">         <tr>
</span><span class="cx" style="display: block; padding: 0 10px">             <td>Cost Per Person Per Day</td>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            <td class="amount">{{data.per_person.toFixed(2)}}</td>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            <td class="amount">{{data.per_person}}</td>
</ins><span class="cx" style="display: block; padding: 0 10px">         </tr>
</span><span class="cx" style="display: block; padding: 0 10px">         <tr>
</span><span class="cx" style="display: block; padding: 0 10px">             <td></td>
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -109,7 +161,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         <tr>
</span><span class="cx" style="display: block; padding: 0 10px">             <td></td>
</span><span class="cx" style="display: block; padding: 0 10px">             <td class="amount">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <# if (data.variance < 0) { #>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                <# if (data.variance_raw < 0) { #>
</ins><span class="cx" style="display: block; padding: 0 10px">                 <a href="#" target="_blank" class="inspire">inspire me</a>
</span><span class="cx" style="display: block; padding: 0 10px">                 <# } #>
</span><span class="cx" style="display: block; padding: 0 10px">             </td>
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -117,32 +169,71 @@
</span><span class="cx" style="display: block; padding: 0 10px">     </tbody>
</span><span class="cx" style="display: block; padding: 0 10px"> </script>
</span><span class="cx" style="display: block; padding: 0 10px"> <script type="text/template" id="wcb-tmpl-entry">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    <# if (data.type == 'meta' ) { #>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    <# if (data.type == 'meta') { #>
</ins><span class="cx" style="display: block; padding: 0 10px">         <td>{{wcb.metaLabels[data.name]}}</td>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        <td class="editable">
-            <input class="value" type="text" value="{{data.value}}" />
-        </td>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+        <# if (wcb.editable) { #>
+            <td class="editable">
+
+            <# if (data.name == 'currency') { #>
+                <select class="value">
+                    <# _.each(wcb.currencies, function(v, k) { #>
+                    <option value="{{k}}" <#if(k==data.value){#>selected<#}#>>{{k}} - {{v}}</option>
+                    <# }); #>
+                </select>
+            <# } else { #>
+                <input class="value" type="text" value="{{data.value}}" />
+            <# } #>
+            </td>
+        <# } else { #>
+            <td>
+                <# if (data.name == 'currency') { #>
+                <div class="value">{{data.value}} - {{wcb.currencies[data.value]}}</div>
+                <# } else { #>
+                <div class="value">{{data.value}}</div>
+                <# } #>
+            </td>
+        <# } #>
+
</ins><span class="cx" style="display: block; padding: 0 10px">     <# } else { #>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        <# if (data.type == 'expense') { #>
-        <td class="editable">
-            <select class="category">
-                <# _.each(wcb.categories, function(label,key){ #>
-                <option value="{{key}}" <#if(key==data.category){#>selected<#}#>>{{label}}</option>
-                <#}); #>
-            </select>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        <# if (wcb.editable) { #>
+            <# if (data.type == 'expense') { #>
+            <td style="width: 20%" class="editable">
+                <select class="category">
+                    <# _.each(wcb.categories, function(label,key){ #>
+                    <option value="{{key}}" <#if(key==data.category){#>selected<#}#>>{{label}}</option>
+                    <#}); #>
+                </select>
+            </td>
+            <# } else { #>
+            <td style="width: 20%">
+                Income
+                <input type="hidden" class="category" value="{{data.category}}" />
+            </td>
+            <# } #>
+        <# } else { #>
+            <td style="width: 20%">
+            <# if (data.type == 'expense') { #>
+                {{wcb.categories[data.category]}}
+            <# } else { #>
+                Income
+            <# } #>
+            </td>
+        <# } #>
+
+        <# if (wcb.editable) { #>
+        <td style="width: 40%" class="editable">
+            <input class="note" type="text" value="{{data.note}}" />
</ins><span class="cx" style="display: block; padding: 0 10px">         </td>
</span><span class="cx" style="display: block; padding: 0 10px">         <# } else { #>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        <td>
-            Income
-            <input type="hidden" class="category" value="{{data.category}}" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        <td style="width: 40%">
+            {{data.note}}
</ins><span class="cx" style="display: block; padding: 0 10px">         </td>
</span><span class="cx" style="display: block; padding: 0 10px">         <# } #>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        <td class="editable">
-            <input class="note" type="text" value="{{data.note}}" />
-        </td>
-        <td class="editable">
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        <# if (wcb.editable) { #>
+        <td style="width: 25%" class="editable">
</ins><span class="cx" style="display: block; padding: 0 10px">             <div class="link-toggle">
</span><span class="cx" style="display: block; padding: 0 10px">                 <select class="link-value">
</span><span class="cx" style="display: block; padding: 0 10px">                     <option value="" <#if(!data.link){#>selected<#}#>>none</option>
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -152,20 +243,39 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 </select>
</span><span class="cx" style="display: block; padding: 0 10px">                 <span class="dashicons dashicons-admin-links"></span>
</span><span class="cx" style="display: block; padding: 0 10px">             </div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            <input class="amount" type="text" value="{{data.realAmount.toFixed(2)}}" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            <input class="amount" type="text" value="{{data.realAmountFormatted}}" />
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">             <# if (data.link) { #>
</span><span class="cx" style="display: block; padding: 0 10px">                 <div class="link">
</span><span class="cx" style="display: block; padding: 0 10px">                     <# if (data.linkHasValue) { #>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                    <span>{{data.amount.toFixed(2)}}</span>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                    <span>{{data.amountFormatted}}</span>
</ins><span class="cx" style="display: block; padding: 0 10px">                     <# } #>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                     {{{data.linkLabel}}}
</span><span class="cx" style="display: block; padding: 0 10px">                 </div>
</span><span class="cx" style="display: block; padding: 0 10px">             <# } #>
</span><span class="cx" style="display: block; padding: 0 10px">         </td>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        <td class="actions">
-            <a href="#" class="delete"><span class="dashicons dashicons-trash"></span></a>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        <# } else { #>
+        <td style="width: 25%;">
+            <div class="amount">{{data.realAmountFormatted}}</div>
+
+            <# if (data.link) { #>
+                <div class="link">
+                    <# if (data.linkHasValue) { #>
+                    <span>{{data.amountFormatted}}</span>
+                    <# } #>
+
+                    {{{data.linkLabel}}}
+                </div>
+            <# } #>
</ins><span class="cx" style="display: block; padding: 0 10px">         </td>
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        <# } #>
+
+        <td style="width: 15%" class="actions">
+            <# if (wcb.editable) { #>
+            <a href="#" class="move">Move</a>
+            <a href="#" class="delete">Delete</a>
+            <# } #>
+        </td>
</ins><span class="cx" style="display: block; padding: 0 10px">     <# } #>
</span><span class="cx" style="display: block; padding: 0 10px"> </script>
</span><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span></span></pre>
</div>
</div>

</body>
</html>