monopyly 1.4.6__py3-none-any.whl → 1.4.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. monopyly/CHANGELOG.md +195 -0
  2. monopyly/README.md +14 -3
  3. monopyly/__init__.py +20 -1
  4. monopyly/_version.py +2 -2
  5. monopyly/auth/actions.py +7 -2
  6. monopyly/banking/accounts.py +1 -1
  7. monopyly/banking/actions.py +51 -10
  8. monopyly/banking/routes.py +2 -1
  9. monopyly/cli/apps.py +51 -28
  10. monopyly/cli/{run.py → launch.py} +18 -10
  11. monopyly/common/forms/_forms.py +4 -1
  12. monopyly/core/actions.py +108 -21
  13. monopyly/core/blueprint.py +1 -1
  14. monopyly/core/context_processors.py +10 -0
  15. monopyly/core/errors.py +9 -0
  16. monopyly/core/filters.py +4 -2
  17. monopyly/core/routes.py +22 -9
  18. monopyly/credit/routes.py +9 -1
  19. monopyly/credit/transactions/_transactions.py +1 -1
  20. monopyly/static/css/style.css +166 -73
  21. monopyly/static/js/make-payment.js +4 -2
  22. monopyly/templates/banking/account_summaries.html +26 -12
  23. monopyly/templates/banking/account_summaries_page.html +2 -1
  24. monopyly/templates/banking/account_summary.html +7 -2
  25. monopyly/templates/banking/accounts_page.html +2 -2
  26. monopyly/templates/core/credits.html +32 -0
  27. monopyly/templates/core/errors/400.html +8 -0
  28. monopyly/templates/core/errors/401.html +8 -0
  29. monopyly/templates/core/errors/403.html +8 -0
  30. monopyly/templates/core/errors/404.html +8 -0
  31. monopyly/templates/core/errors/405.html +8 -0
  32. monopyly/templates/core/errors/408.html +8 -0
  33. monopyly/templates/core/errors/418.html +8 -0
  34. monopyly/templates/core/errors/425.html +8 -0
  35. monopyly/templates/core/errors/500.html +8 -0
  36. monopyly/templates/core/errors/error.html +31 -0
  37. monopyly/templates/{profile.html → core/profile.html} +3 -1
  38. monopyly/templates/core/story.html +62 -0
  39. monopyly/templates/credit/statement_summary.html +7 -2
  40. monopyly/templates/credit/statements.html +7 -6
  41. monopyly/templates/layout.html +11 -2
  42. {monopyly-1.4.6.dist-info → monopyly-1.4.8.dist-info}/METADATA +15 -4
  43. {monopyly-1.4.6.dist-info → monopyly-1.4.8.dist-info}/RECORD +48 -36
  44. monopyly-1.4.8.dist-info/entry_points.txt +2 -0
  45. monopyly/templates/credits.html +0 -20
  46. monopyly/templates/story.html +0 -47
  47. monopyly-1.4.6.dist-info/entry_points.txt +0 -2
  48. /monopyly/templates/{index.html → core/index.html} +0 -0
  49. {monopyly-1.4.6.dist-info → monopyly-1.4.8.dist-info}/WHEEL +0 -0
  50. {monopyly-1.4.6.dist-info → monopyly-1.4.8.dist-info}/licenses/COPYING +0 -0
  51. {monopyly-1.4.6.dist-info → monopyly-1.4.8.dist-info}/licenses/LICENSE +0 -0
@@ -7,7 +7,10 @@
7
7
  :root {
8
8
  --moneytree: #5e8f40;
9
9
  --moneytree-leaves: #85bb65;
10
+ --silver-dollar: #cccccc;
10
11
  --masthead-height: 50px;
12
+ --masthead-color: #2b2b2b;
13
+ --border-gray: #dddddd;
11
14
  }
12
15
 
13
16
  html {
@@ -94,7 +97,7 @@ header#masthead {
94
97
  border-width: 0 0 4px 3px;
95
98
  border-style: solid;
96
99
  border-color: var(--moneytree-leaves);
97
- background-color: #2b2b2b;
100
+ background-color: var(--masthead-color);
98
101
  opacity: 0.9;
99
102
  }
100
103
 
@@ -117,7 +120,12 @@ header#masthead {
117
120
  }
118
121
 
119
122
  .monopyly-logo:hover {
120
- color: #f5f5f5;
123
+ filter: brightness(0.95);
124
+ }
125
+
126
+ .monopyly-logo .development-mode {
127
+ font-weight: normal;
128
+ text-transform: none;
121
129
  }
122
130
 
123
131
 
@@ -161,7 +169,7 @@ footer#site-info {
161
169
  }
162
170
 
163
171
  #site-info p {
164
- color: #cccccc;
172
+ color: var(--silver-dollar);
165
173
  font-size: 9pt;
166
174
  text-align: center;
167
175
  }
@@ -193,7 +201,7 @@ aside.sidebar {
193
201
  height: 100%;
194
202
  width: 10%;
195
203
  min-width: 50px;
196
- margin-top: 50px; /* Account for content header */
204
+ margin-top: 50px; /* account for content header */
197
205
  }
198
206
 
199
207
  #content-header h1 {
@@ -201,12 +209,40 @@ aside.sidebar {
201
209
  box-sizing: border-box;
202
210
  margin: 0 0 30px 0;
203
211
  padding-bottom: 10px;
204
- border-bottom: 1px solid #dddddd;
212
+ border-bottom: 1px solid var(--border-gray);
205
213
  text-align: center;
206
214
  font-size: 2em;
207
215
  letter-spacing: -2px;
208
216
  }
209
217
 
218
+ #content-header h1.error {
219
+ text-align: left;
220
+ }
221
+
222
+
223
+ /*
224
+ * Provide styles for error pages
225
+ */
226
+ .error span.code {
227
+ margin-left: 30px;
228
+ color: var(--silver-dollar);
229
+ font-weight: 300;
230
+ letter-spacing: 1px;
231
+ }
232
+
233
+ .custom-error-content p {
234
+ font-size: 18pt;
235
+ }
236
+
237
+ .standard-error-content {
238
+ margin-top: 50px;
239
+ }
240
+
241
+ .standard-error-content p.error-description {
242
+ font-size: 12pt;
243
+ font-style: oblique;
244
+ }
245
+
210
246
 
211
247
  /*
212
248
  * General object characteristics
@@ -233,7 +269,8 @@ aside.sidebar {
233
269
  }
234
270
 
235
271
  .button-block {
236
- border: 1px solid #dddddd;
272
+ margin: 15px 0;
273
+ border: 1px solid var(--border-gray);
237
274
  border-radius: 10px;
238
275
  box-shadow: 1px 1px 3px #bbbbbb;
239
276
  background-color: #eeeeee;
@@ -241,6 +278,14 @@ aside.sidebar {
241
278
  color: inherit;
242
279
  }
243
280
 
281
+ .button-block:first-of-type {
282
+ margin-top: 0;
283
+ }
284
+
285
+ .button-block:last-of-type {
286
+ margin-bottom: 0;
287
+ }
288
+
244
289
  .button-block:hover {
245
290
  filter: brightness(0.98);
246
291
  text-decoration: none;
@@ -253,16 +298,34 @@ aside.sidebar {
253
298
  .screenshot {
254
299
  width: 100%; /* override the markdown default */
255
300
  margin: 20px 0;
256
- border: 1px solid #f3f3f3;
301
+ border: 1px solid #bbbbbb;
257
302
  box-shadow: 3px 3px 5px #bbbbbb;
258
303
  }
259
304
 
260
- .grouping {
305
+ .group-stack {
306
+ margin: 15px 10px 25px;
307
+ padding: 20px 30px;
261
308
  border-radius: 15px;
262
309
  box-shadow: 0 0 20px #eeeeee;
263
310
  background-color: #eef5eb;
264
311
  }
265
312
 
313
+ .group-stack .stack-title {
314
+ display: flex;
315
+ justify-content: space-between;
316
+ margin: 0 0 15px 0;
317
+ padding: 0 15px;
318
+ font-size: 1.1em;
319
+ letter-spacing: 1px;
320
+ text-transform: uppercase;
321
+ }
322
+
323
+ .group-stack .stack-title-info {
324
+ margin-left: 15px;
325
+ color: #888888;
326
+ font-weight: 400;
327
+ }
328
+
266
329
  .paid-notice {
267
330
  color: var(--moneytree-leaves);
268
331
  font-weight: bold;
@@ -491,7 +554,8 @@ form .autocomplete-box {
491
554
  z-index: 99;
492
555
  width: 100%;
493
556
  padding-right: 10px;
494
- border: 1px solid #cccccc;
557
+ border: 1px solid var(--silver-dollar);
558
+ box-sizing: border-box;
495
559
  background-color: white;
496
560
  }
497
561
 
@@ -502,7 +566,7 @@ form .autocomplete-box .item {
502
566
  }
503
567
 
504
568
  form .autocomplete-box .item:hover {
505
- background-color: #cccccc;
569
+ background-color: var(--silver-dollar);
506
570
  }
507
571
 
508
572
  form .autocomplete-box .item.active {
@@ -643,7 +707,7 @@ form .autocomplete-box .item.active {
643
707
  position: relative;
644
708
  right: -100%;
645
709
  width: min-content;
646
- transition: 0.4s;
710
+ transition: 0.4s 0.2s;
647
711
  }
648
712
 
649
713
  .slide-text-gadget:hover .sleeve {
@@ -653,7 +717,7 @@ form .autocomplete-box .item.active {
653
717
  .slide-text-gadget .sleeve .main {
654
718
  position: absolute;
655
719
  transform: translateX(-100%);
656
- transition: 0.2s;
720
+ transition: 0.2s 0.2s;
657
721
  }
658
722
 
659
723
  .slide-text-gadget:hover .sleeve .main {
@@ -746,8 +810,8 @@ form .autocomplete-box .item.active {
746
810
  .toggle-switch-gadget .option .slider .switch {
747
811
  position: relative;
748
812
  left: 0;
749
- width: 50%;
750
813
  height: 100%;
814
+ width: 50%;
751
815
  box-sizing: border-box;
752
816
  border-radius: 50%;
753
817
  background-color: #eeeeee;
@@ -772,7 +836,7 @@ form .autocomplete-box .item.active {
772
836
  * Style generic box tables
773
837
  */
774
838
  .box-table {
775
- border: 2px solid #dddddd;
839
+ border: 2px solid var(--border-gray);
776
840
  }
777
841
 
778
842
  .box-table .icon-button {
@@ -789,8 +853,8 @@ form .autocomplete-box .item.active {
789
853
  }
790
854
 
791
855
  .box-table .box-row {
792
- border-top: 0.5px solid #dddddd;
793
- border-bottom: 0.5px solid #dddddd;
856
+ border-top: 0.5px solid var(--border-gray);
857
+ border-bottom: 0.5px solid var(--border-gray);
794
858
  background-color: #f5f5f5;
795
859
  }
796
860
 
@@ -822,7 +886,7 @@ form .autocomplete-box .item.active {
822
886
  }
823
887
 
824
888
  #card-filter .card:hover {
825
- background-color: #cccccc;
889
+ background-color: var(--silver-dollar);
826
890
  text-decoration: none;
827
891
  }
828
892
 
@@ -878,7 +942,7 @@ form .autocomplete-box .item.active {
878
942
  position: absolute;
879
943
  height: 100%;
880
944
  width: 100%;
881
- border: 1px solid #cccccc;
945
+ border: 1px solid var(--silver-dollar);
882
946
  border-radius: 20px;
883
947
  box-shadow: 1px 1px 3px #222222;
884
948
  text-align: center;
@@ -949,7 +1013,7 @@ form .autocomplete-box .item.active {
949
1013
  }
950
1014
 
951
1015
  .credit-card.inactive .card-face.front {
952
- color: #cccccc;
1016
+ color: var(--silver-dollar);
953
1017
  filter: brightness(0.9);
954
1018
  }
955
1019
 
@@ -1088,7 +1152,7 @@ form .autocomplete-box .item.active {
1088
1152
 
1089
1153
  .transactions-table .titles,
1090
1154
  .transactions-table .transaction {
1091
- border-bottom: 1px solid #dddddd;
1155
+ border-bottom: 1px solid var(--border-gray);
1092
1156
  }
1093
1157
 
1094
1158
  .transactions-table .titles {
@@ -1612,13 +1676,12 @@ form .autocomplete-box .item.active {
1612
1676
  display: flex;
1613
1677
  flex-direction: column;
1614
1678
  flex-wrap: wrap;
1615
- align-items: center;
1679
+ align-items: stretch;
1616
1680
  gap: 10px;
1617
1681
  width: 100%;
1618
1682
  }
1619
1683
  @media screen and (max-width: 1500px) {
1620
1684
  .details .primary-info {
1621
- display: flex;
1622
1685
  align-items: center;
1623
1686
  }
1624
1687
  }
@@ -1639,14 +1702,16 @@ form .autocomplete-box .item.active {
1639
1702
  .details .summary-container {
1640
1703
  display: flex;
1641
1704
  justify-content: center;
1642
- min-width: 45%;
1705
+ width: 45%;
1706
+ min-width: 500px;
1643
1707
  margin: 0 0 0 0;
1644
1708
  }
1645
1709
 
1646
1710
  .details .summary-box {
1647
1711
  display: flex;
1648
1712
  flex-direction: column;
1649
- width: min-content;
1713
+ width: 500px;
1714
+ box-sizing: border-box;
1650
1715
  padding: 40px 50px 60px;
1651
1716
  border-radius: 25px;
1652
1717
  box-shadow: 1px 1px 5px #dddddd;
@@ -1656,7 +1721,6 @@ form .autocomplete-box .item.active {
1656
1721
  .details .summary-box .balance {
1657
1722
  display: flex;
1658
1723
  justify-content: space-between;
1659
- min-width: 325px;
1660
1724
  margin: 20px 0;
1661
1725
  font-size: 72pt;
1662
1726
  font-weight: bold;
@@ -1664,10 +1728,6 @@ form .autocomplete-box .item.active {
1664
1728
  text-align: center;
1665
1729
  }
1666
1730
 
1667
- .details .summary-box .balance .dollar-sign {
1668
- margin-right: 5px;
1669
- }
1670
-
1671
1731
  .details .summary-box .projected-balance .amount {
1672
1732
  color: var(--moneytree);
1673
1733
  font-weight: 500;
@@ -1698,12 +1758,13 @@ form .autocomplete-box .item.active {
1698
1758
  }
1699
1759
 
1700
1760
  .details .transactions-container {
1701
- width: 50%;
1761
+ width: 52.5%;
1702
1762
  order: 2;
1703
1763
  min-width: 500px;
1704
1764
  }
1705
1765
  @media screen and (max-width: 1500px) {
1706
1766
  .details .transactions-container {
1767
+ width: 50%;
1707
1768
  order: 1;
1708
1769
  margin-top: 50px;
1709
1770
  }
@@ -1820,10 +1881,10 @@ form .autocomplete-box .item.active {
1820
1881
  #homepage-block {
1821
1882
  margin-bottom: 20px;
1822
1883
  padding: 0 0 30px 0;
1823
- background-color: #dddddd;
1824
- border: 1px solid #d8d8d8;
1884
+ background-color: gainsboro;
1885
+ border: 1px solid lightgray;
1825
1886
  border-radius: 6px;
1826
- box-shadow: 2px 2px 5px #cccccc;
1887
+ box-shadow: 2px 2px 5px var(--silver-dollar);
1827
1888
  }
1828
1889
 
1829
1890
  #homepage-block h2 {
@@ -1873,7 +1934,7 @@ form .autocomplete-box .item.active {
1873
1934
  margin: 20px;
1874
1935
  padding: 50px;
1875
1936
  border: 1px solid #f5f5f5;
1876
- box-shadow: 2px 2px 5px #cccccc;
1937
+ box-shadow: 2px 2px 5px var(--silver-dollar);
1877
1938
  background-color: #fafafa;
1878
1939
  }
1879
1940
 
@@ -1961,6 +2022,38 @@ form .autocomplete-box .item.active {
1961
2022
  margin-top: 50px;
1962
2023
  }
1963
2024
 
2025
+ #readme .warning {
2026
+ padding: 15px 25px;
2027
+ border: 1px solid var(--silver-dollar);
2028
+ border-radius: 10px;
2029
+ box-shadow: 2px 2px 3px var(--silver-dollar);
2030
+ background-color: #f2d7a5;
2031
+ }
2032
+
2033
+ #readme .warning h5 {
2034
+ margin: 0 0 5px 0;
2035
+ }
2036
+
2037
+ #changelog {
2038
+ width: 80%;
2039
+ margin: 0 auto;
2040
+ }
2041
+
2042
+ #changelog h1 {
2043
+ font-size: 32pt;
2044
+ text-align: center;
2045
+ }
2046
+
2047
+ #changelog h2 {
2048
+ border-bottom: 1px solid var(--border-gray);
2049
+ }
2050
+
2051
+ #changelog a.latest-release {
2052
+ display: block;
2053
+ margin: 30px 0;
2054
+ font-size: 1.5em;
2055
+ }
2056
+
1964
2057
  #story .signature {
1965
2058
  margin-bottom: 100px;
1966
2059
  font-weight: bold;
@@ -1969,6 +2062,14 @@ form .autocomplete-box .item.active {
1969
2062
  }
1970
2063
 
1971
2064
 
2065
+ /*
2066
+ * Customization for the 'Credits' page
2067
+ */
2068
+ .affiliation-disclaimer {
2069
+ margin-top: 80px;
2070
+ }
2071
+
2072
+
1972
2073
  /*
1973
2074
  * Customization for the 'Profile' page
1974
2075
  */
@@ -2002,7 +2103,7 @@ form .autocomplete-box .item.active {
2002
2103
  flex-basis: 100%;
2003
2104
  margin-right: 0;
2004
2105
  padding-bottom: 50px;
2005
- border-bottom: 0.5px solid #dddddd;
2106
+ border-bottom: 0.5px solid var(--border-gray);
2006
2107
  }
2007
2108
 
2008
2109
  #profile .banking.profile-section .bank-list {
@@ -2025,15 +2126,9 @@ form .autocomplete-box .item.active {
2025
2126
  /*
2026
2127
  * Customization for the 'Bank Accounts' page
2027
2128
  */
2028
- #bank-container .bank-block {
2029
- margin: 25px 0;
2030
- padding: 30px;
2031
- }
2032
-
2033
- #bank-container .bank-block h3 {
2034
- margin-top: 0;
2129
+ #bank-container .bank-stack .stack-title {
2035
2130
  padding: 0 30px;
2036
- /*text-align: center;*/
2131
+ text-align: left;
2037
2132
  }
2038
2133
 
2039
2134
  #bank-container .account-block {
@@ -2068,7 +2163,7 @@ form .autocomplete-box .item.active {
2068
2163
  #account-type-container {
2069
2164
  width: 30%;
2070
2165
  min-width: 350px;
2071
- border: 2px solid #dddddd;
2166
+ border: 2px solid var(--border-gray);
2072
2167
  background-color: #f5f5f5;
2073
2168
  }
2074
2169
 
@@ -2078,13 +2173,13 @@ form .autocomplete-box .item.active {
2078
2173
  }
2079
2174
 
2080
2175
  #account-type-container .account-types {
2081
- border-top: 2px solid #dddddd;
2176
+ border-top: 2px solid var(--border-gray);
2082
2177
  }
2083
2178
 
2084
2179
  #account-type-container .account-type {
2085
2180
  padding: 10px;
2086
- border-top: 0.5px solid #dddddd;
2087
- border-bottom: 0.5px solid #dddddd;
2181
+ border-top: 0.5px solid var(--border-gray);
2182
+ border-bottom: 0.5px solid var(--border-gray);
2088
2183
  }
2089
2184
 
2090
2185
 
@@ -2105,10 +2200,22 @@ form#bank-account .hidden {
2105
2200
  align-items: center
2106
2201
  }
2107
2202
 
2108
- #bank-account-summaries-container .bank {
2109
- margin: 0 0 10px;
2203
+ #bank-account-summaries-container h2.bank {
2204
+ margin: 0 0 5px;
2205
+ font-size: 1.6em;
2206
+ letter-spacing: 1px;
2207
+ text-transform: uppercase;
2110
2208
  text-align: center;
2209
+ }
2210
+
2211
+ #bank-account-summaries-container h3.balance {
2212
+ margin: 0 0 10px;
2213
+ color: gray;
2214
+ font-size: 1em;
2215
+ font-weight: 300;
2111
2216
  text-transform: uppercase;
2217
+ text-align: center;
2218
+ letter-spacing: 1px;
2112
2219
  }
2113
2220
 
2114
2221
  #bank-account-summaries {
@@ -2117,29 +2224,21 @@ form#bank-account .hidden {
2117
2224
  width: 100%;
2118
2225
  }
2119
2226
 
2120
- #bank-account-summaries .account-type-block {
2227
+ #bank-account-summaries .account-type-stack {
2121
2228
  display: flex;
2122
2229
  flex-direction: column;
2123
- width: 50%;
2230
+ width: 60%;
2124
2231
  min-width: 400px;
2125
- margin: 10px auto;
2126
- padding: 25px;
2232
+ margin: 15px auto 25px;
2127
2233
  }
2128
2234
 
2129
2235
  #bank-account-summaries .account-block {
2130
2236
  display: flex;
2131
2237
  justify-content: space-between;
2132
2238
  align-items: center;
2133
- width: 100%;
2134
- box-sizing: border-box;
2135
- margin-bottom: 15px;
2136
2239
  padding: 30px 10%;
2137
2240
  }
2138
2241
 
2139
- #bank-account-summaries a.account-block:last-of-type {
2140
- margin-bottom: 0;
2141
- }
2142
-
2143
2242
  #bank-account-summaries .account-block .title {
2144
2243
  font-size: 16pt;
2145
2244
  }
@@ -2408,27 +2507,21 @@ form#card #statement-due-day-field {
2408
2507
  justify-content: space-around;
2409
2508
  }
2410
2509
 
2411
- #credit-statements .card-column {
2510
+ #credit-statements .card-stack {
2412
2511
  display: flex;
2413
2512
  flex-direction: column;
2414
2513
  height: min-content;
2415
- margin: 15px 10px;
2416
- padding: 20px;
2417
- text-transform: uppercase;
2418
- text-align: center;
2419
- font-size: 1.1em;
2420
2514
  }
2421
2515
 
2422
- #credit-statements-container .card-column .digits {
2423
- color: #888888;
2516
+ #credit-statements .card-stack .stack-title {
2517
+ justify-content: center;
2424
2518
  }
2425
2519
 
2426
2520
  #credit-statements .statement-block {
2427
2521
  display: flex;
2428
- align-items: center;
2429
2522
  justify-content: space-between;
2523
+ align-items: center;
2430
2524
  width: 275px;
2431
- margin: 15px;
2432
2525
  padding: 45px 50px;
2433
2526
  }
2434
2527
 
@@ -2511,7 +2604,7 @@ form#pay input {
2511
2604
  }
2512
2605
 
2513
2606
  form#pay .form-inputs {
2514
- border: 1px solid #cccccc;
2607
+ border: 1px solid var(--silver-dollar);
2515
2608
  border-radius: inherit;
2516
2609
  }
2517
2610
 
@@ -2677,7 +2770,7 @@ form#credit-transaction .merchant-field {
2677
2770
  border-radius: 20px;
2678
2771
  text-align: center;
2679
2772
  outline: none;
2680
- caret-color: #cccccc;
2773
+ caret-color: var(--silver-dollar);
2681
2774
  transition: border 0.1s ease;
2682
2775
  }
2683
2776
 
@@ -2733,6 +2826,6 @@ form#credit-transaction .merchant-field {
2733
2826
  #transaction-tags .subtags {
2734
2827
  margin: 0 0 0 10px;
2735
2828
  padding-left: 40px;
2736
- border-left: 1px solid #dddddd;
2829
+ border-left: 1px solid var(--border-gray);
2737
2830
  }
2738
2831
 
@@ -17,7 +17,8 @@ import { executeAjaxRequest } from './modules/ajax.js';
17
17
 
18
18
  (function() {
19
19
 
20
- const $container = $('#statement-summary-container');
20
+ const $summaryContainer = $('#statement-summary-container');
21
+ const $transactionContainer = $('#statement-transactions-container');
21
22
  prepareForm();
22
23
 
23
24
  function prepareForm() {
@@ -82,7 +83,8 @@ import { executeAjaxRequest } from './modules/ajax.js';
82
83
  function updateStatementPaymentAjaxRequest(rawData) {
83
84
  // Return the newly updated statement payment info
84
85
  function updateAction(response) {
85
- $container.html(response)
86
+ $summaryContainer.html(response[0]);
87
+ $transactionContainer.html(response[1]);
86
88
  // Prepare the form again (in case statement is not paid in full)
87
89
  prepareForm();
88
90
  }
@@ -1,21 +1,35 @@
1
1
  <div id="bank-account-summaries">
2
2
 
3
- {% for account_type in type_accounts %}
4
- <div class="account-type-block grouping">
3
+ {% for account_type, accounts in type_accounts|items %}
4
+ {# Use a scoped variable so that the accounts generator can be reused #}
5
+ {% with accounts = accounts|list %}
5
6
 
6
- {% for account in type_accounts[account_type]|sort(attribute='last_four_digits') %}
7
+ <div class="account-type-stack group-stack">
7
8
 
8
- <a class="account-block button-block" href="{{ url_for('banking.load_account_details', account_id=account.id) }}">
9
- <div class="title">
10
- <span class="digits">{{ account.last_four_digits }}</span>
11
- <b>{{ account.account_type.type_name }}</b>
12
- </div>
13
- <div class="balance">${{ account.balance|currency }}</div>
14
- </a>
9
+ <h2 class="stack-title">
10
+ {{ account_type.type_name }}
11
+ {% if accounts|length> 1 %}
12
+ <span class="stack-title-info">${{ accounts|sum(attribute='balance')|currency }}</span>
13
+ {% endif %}
14
+ </h2>
15
15
 
16
- {% endfor %}
16
+ <div class="account-blocks">
17
+ {% for account in accounts|sort(attribute='last_four_digits') %}
17
18
 
18
- </div>
19
+ <a class="account-block button-block" href="{{ url_for('banking.load_account_details', account_id=account.id) }}">
20
+ <div class="title">
21
+ <span class="digits">{{ account.last_four_digits }}</span>
22
+ <b>{{ account.account_type.type_name }}</b>
23
+ </div>
24
+ <div class="balance">${{ account.balance|currency }}</div>
25
+ </a>
26
+
27
+ {% endfor %}
28
+ </div>
29
+
30
+ </div>
31
+
32
+ {% endwith %}
19
33
  {% endfor %}
20
34
 
21
35
  </div>
@@ -44,7 +44,8 @@
44
44
  {% block content %}
45
45
 
46
46
  <div id="bank-account-summaries-container">
47
- <h2 class="bank">{{ bank.bank_name }} (${{ bank_balance|currency }})</h2>
47
+ <h2 class="bank">{{ bank.bank_name }}</h2>
48
+ <h3 class="balance">${{ bank_balance|currency }}</h3>
48
49
 
49
50
  {% include 'banking/account_summaries.html' %}
50
51
 
@@ -9,8 +9,13 @@
9
9
  </div>
10
10
 
11
11
  <div class="balance">
12
- <div class="dollar-sign">$</div>
13
- <div>{{ account.balance|currency }}</div>
12
+ {% with account_balance = account.balance|currency %}
13
+ {% set vbox_width = calculate_summary_balance_width(account_balance) %}
14
+ <svg viewBox="0 0 {{ vbox_width }} 100">
15
+ <text x="0" y="75" fill="currentColor">$</text>
16
+ <text x="75" y="75" fill="currentColor">{{ account_balance }}</text>
17
+ </svg>
18
+ {% endwith %}
14
19
  </div>
15
20
 
16
21
  {% if account.balance != account.projected_balance %}
@@ -19,8 +19,8 @@
19
19
  {% set bank_accounts = bank.bank_accounts %}
20
20
  {% if bank_accounts %}
21
21
 
22
- <div class="bank-block grouping">
23
- <h3>{{ bank.bank_name }}</h3>
22
+ <div class="bank-stack group-stack">
23
+ <h2 class="stack-title">{{ bank.bank_name }}</h2>
24
24
 
25
25
  <div class="account-blocks box-table">
26
26
  {% for account in bank_accounts %}
@@ -0,0 +1,32 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block title %}
4
+ Credits
5
+ {% endblock %}
6
+
7
+ {% block header %}
8
+ <h1>Credits</h1>
9
+ {% endblock %}
10
+
11
+ {% block content %}
12
+
13
+ <div class="credits">
14
+
15
+ <h3>Image Credits</h3>
16
+ <p>
17
+ The chain link icon was adapted from <a href="https://commons.wikimedia.org/wiki/File:Chain_link_icon.png">Wikipedia Commons</a>.
18
+ The original image was created by user Mdowdell and published under the <a href="https://creativecommons.org/licenses/by-sa/3.0/legalcode">CC BY-SA 3.0 License</a>.
19
+ </p>
20
+
21
+ </div>
22
+
23
+ <div class="affiliation-disclaimer">
24
+
25
+ <h3>Disclaimer</h3>
26
+ <p>
27
+ At risk of stating the obvious, given that this is a <b>homemade personal finance manager</b>, the <i>Monopyly</i> app is in no way affiliated, associated, authorized, endorsed by, or in any way officially connected with Hasbro, the present publisher and trademark holder of the board game MONOPOLY.
28
+ </p>
29
+
30
+ </div>
31
+
32
+ {% endblock %}
@@ -0,0 +1,8 @@
1
+ {% extends "core/errors/error.html" %}
2
+
3
+
4
+ {% block custom_error_content %}
5
+
6
+ <p>Nice try, but something went wrong in that request.</p>
7
+
8
+ {% endblock %}