monopyly 1.4.5__py3-none-any.whl → 1.4.7__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 (50) hide show
  1. monopyly/CHANGELOG.md +187 -0
  2. monopyly/README.md +13 -2
  3. monopyly/__init__.py +19 -0
  4. monopyly/_version.py +2 -2
  5. monopyly/banking/accounts.py +1 -1
  6. monopyly/cli/apps.py +25 -4
  7. monopyly/common/forms/_forms.py +14 -11
  8. monopyly/core/actions.py +108 -21
  9. monopyly/core/blueprint.py +1 -1
  10. monopyly/core/context_processors.py +10 -0
  11. monopyly/core/errors.py +9 -0
  12. monopyly/core/filters.py +4 -2
  13. monopyly/core/routes.py +22 -9
  14. monopyly/credit/actions.py +29 -2
  15. monopyly/credit/routes.py +11 -6
  16. monopyly/credit/statements.py +21 -1
  17. monopyly/credit/transactions/_transactions.py +1 -1
  18. monopyly/static/css/style.css +161 -69
  19. monopyly/static/js/make-payment.js +4 -2
  20. monopyly/templates/auth/login.html +1 -1
  21. monopyly/templates/auth/register.html +1 -1
  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/banking/transaction_form/transaction_form.html +1 -1
  27. monopyly/templates/core/credits.html +32 -0
  28. monopyly/templates/core/errors/400.html +8 -0
  29. monopyly/templates/core/errors/401.html +8 -0
  30. monopyly/templates/core/errors/403.html +8 -0
  31. monopyly/templates/core/errors/404.html +8 -0
  32. monopyly/templates/core/errors/405.html +8 -0
  33. monopyly/templates/core/errors/408.html +8 -0
  34. monopyly/templates/core/errors/418.html +8 -0
  35. monopyly/templates/core/errors/425.html +8 -0
  36. monopyly/templates/core/errors/500.html +8 -0
  37. monopyly/templates/core/errors/error.html +31 -0
  38. monopyly/templates/{profile.html → core/profile.html} +3 -1
  39. monopyly/templates/credit/card_graphic/card_back.html +1 -1
  40. monopyly/templates/credit/statement_summary.html +9 -4
  41. monopyly/templates/credit/statements.html +7 -6
  42. {monopyly-1.4.5.dist-info → monopyly-1.4.7.dist-info}/METADATA +16 -5
  43. {monopyly-1.4.5.dist-info → monopyly-1.4.7.dist-info}/RECORD +49 -37
  44. monopyly/templates/credits.html +0 -20
  45. /monopyly/templates/{index.html → core/index.html} +0 -0
  46. /monopyly/templates/{story.html → core/story.html} +0 -0
  47. {monopyly-1.4.5.dist-info → monopyly-1.4.7.dist-info}/WHEEL +0 -0
  48. {monopyly-1.4.5.dist-info → monopyly-1.4.7.dist-info}/entry_points.txt +0 -0
  49. {monopyly-1.4.5.dist-info → monopyly-1.4.7.dist-info}/licenses/COPYING +0 -0
  50. {monopyly-1.4.5.dist-info → monopyly-1.4.7.dist-info}/licenses/LICENSE +0 -0
@@ -13,7 +13,7 @@ def get_card_statement_grouping(cards):
13
13
 
14
14
  Parameters
15
15
  ----------
16
- cards : list of sqlite3.Row
16
+ cards : list of database.models.CreditCard
17
17
  The database card entries for which to get statements.
18
18
 
19
19
  Returns
@@ -31,6 +31,33 @@ def get_card_statement_grouping(cards):
31
31
  return card_statements
32
32
 
33
33
 
34
+ def get_statement_and_transactions(statement_id, transaction_sort_order="DESC"):
35
+ """
36
+ Given a statement ID, get the corresponding statement and transactions.
37
+
38
+ Parameters
39
+ ----------
40
+ statement_id : int
41
+ The ID of the statement to acquire.
42
+ transaction_sort_order : str
43
+ The order to sort transactions returned for the statement. The
44
+ default is 'DESC' for transactions sorted in descending order.
45
+
46
+ Returns
47
+ -------
48
+ statement : database.models.CreditStatementView
49
+ The statement with the given ID.
50
+ transactions : list of database.models.CreditTransactionView
51
+ All transactions on the statement with the given ID.
52
+ """
53
+ statement = CreditStatementHandler.get_entry(statement_id)
54
+ transactions = CreditTransactionHandler.get_transactions(
55
+ statement_ids=(statement_id,),
56
+ sort_order=transaction_sort_order,
57
+ )
58
+ return statement, transactions.all()
59
+
60
+
34
61
  def get_potential_preceding_card(card):
35
62
  """
36
63
  Get the card that this new card may be intended to replace (if any).
@@ -42,7 +69,7 @@ def get_potential_preceding_card(card):
42
69
 
43
70
  Parameters
44
71
  ----------
45
- card : sqlite3.Row
72
+ card : database.models.CreditCard
46
73
  The new card being added to the database.
47
74
 
48
75
  Returns
monopyly/credit/routes.py CHANGED
@@ -22,6 +22,7 @@ from .accounts import CreditAccountHandler
22
22
  from .actions import (
23
23
  get_card_statement_grouping,
24
24
  get_potential_preceding_card,
25
+ get_statement_and_transactions,
25
26
  make_payment,
26
27
  transfer_credit_card_statement,
27
28
  )
@@ -177,11 +178,7 @@ def update_statements_display():
177
178
  @bp.route("/statement/<int:statement_id>")
178
179
  @login_required
179
180
  def load_statement_details(statement_id):
180
- statement = CreditStatementHandler.get_entry(statement_id)
181
- transactions = CreditTransactionHandler.get_transactions(
182
- statement_ids=(statement_id,),
183
- sort_order="DESC",
184
- )
181
+ statement, transactions = get_statement_and_transactions(statement_id)
185
182
  # Get bank accounts for potential payments
186
183
  bank_accounts = BankAccountHandler.get_accounts()
187
184
  return render_template(
@@ -219,12 +216,20 @@ def pay_credit_card(card_id, statement_id):
219
216
  make_payment(card_id, payment_account_id, payment_date, payment_amount)
220
217
  # Get the current statement information from the database
221
218
  statement = CreditStatementHandler.get_entry(statement_id)
219
+ transactions = CreditTransactionHandler.get_transactions(
220
+ statement_ids=(statement_id,)
221
+ )
222
222
  bank_accounts = BankAccountHandler.get_accounts()
223
- return render_template(
223
+ summary_template = render_template(
224
224
  "credit/statement_summary.html",
225
225
  statement=statement,
226
226
  bank_accounts=bank_accounts,
227
227
  )
228
+ transactions_table_template = render_template(
229
+ "credit/transactions_table/transactions.html",
230
+ transactions=transactions,
231
+ )
232
+ return jsonify((summary_template, transactions_table_template))
228
233
 
229
234
 
230
235
  @bp.route("/transactions", defaults={"card_id": None})
@@ -3,6 +3,7 @@ Tools for interacting with the credit statements in the database.
3
3
  """
4
4
 
5
5
  from authanor.database.handler import DatabaseViewHandler
6
+ from dateutil.relativedelta import relativedelta
6
7
 
7
8
  from ..common.utils import get_next_occurrence_of_day
8
9
  from ..database.models import (
@@ -136,7 +137,7 @@ class CreditStatementHandler(
136
137
 
137
138
  Returns
138
139
  -------
139
- statement : database.models.CreditStatementView
140
+ statement : database.models.CreditStatement
140
141
  The inferred statement entry for the transaction.
141
142
  """
142
143
  issue_day = card.account.statement_issue_day
@@ -146,6 +147,25 @@ class CreditStatementHandler(
146
147
  statement = cls.add_statement(card, issue_date)
147
148
  return statement
148
149
 
150
+ @classmethod
151
+ @DatabaseViewHandler.view_query
152
+ def get_prior_statement(cls, statement):
153
+ """
154
+ Given a statement, get the immediately preceding statement.
155
+
156
+ Parameters
157
+ ----------
158
+ statement : database.models.CreditStatement
159
+ The statement for which to find the preceding statement.
160
+
161
+ Returns
162
+ -------
163
+ statement : database.models.CreditStatementView
164
+ The statement immediately preceding the given statement.
165
+ """
166
+ issue_date = statement.issue_date + relativedelta(months=-1)
167
+ return cls.find_statement(statement.card.id, issue_date=issue_date)
168
+
149
169
  @classmethod
150
170
  def add_statement(cls, card, issue_date, due_date=None):
151
171
  """Add a statement to the database."""
@@ -52,7 +52,7 @@ class CreditTransactionHandler(
52
52
 
53
53
  Parameters
54
54
  ----------
55
- statement_ids : tuple of str, optional
55
+ statement_ids : tuple of int, optional
56
56
  A sequence of statement IDs with which to filter
57
57
  transactions (if `None`, all statement IDs will be shown).
58
58
  card_ids : tuple of int, optional
@@ -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,7 @@ header#masthead {
117
120
  }
118
121
 
119
122
  .monopyly-logo:hover {
120
- color: #f5f5f5;
123
+ filter: brightness(0.95);
121
124
  }
122
125
 
123
126
 
@@ -161,7 +164,7 @@ footer#site-info {
161
164
  }
162
165
 
163
166
  #site-info p {
164
- color: #cccccc;
167
+ color: var(--silver-dollar);
165
168
  font-size: 9pt;
166
169
  text-align: center;
167
170
  }
@@ -193,7 +196,7 @@ aside.sidebar {
193
196
  height: 100%;
194
197
  width: 10%;
195
198
  min-width: 50px;
196
- margin-top: 50px; /* Account for content header */
199
+ margin-top: 50px; /* account for content header */
197
200
  }
198
201
 
199
202
  #content-header h1 {
@@ -201,12 +204,40 @@ aside.sidebar {
201
204
  box-sizing: border-box;
202
205
  margin: 0 0 30px 0;
203
206
  padding-bottom: 10px;
204
- border-bottom: 1px solid #dddddd;
207
+ border-bottom: 1px solid var(--border-gray);
205
208
  text-align: center;
206
209
  font-size: 2em;
207
210
  letter-spacing: -2px;
208
211
  }
209
212
 
213
+ #content-header h1.error {
214
+ text-align: left;
215
+ }
216
+
217
+
218
+ /*
219
+ * Provide styles for error pages
220
+ */
221
+ .error span.code {
222
+ margin-left: 30px;
223
+ color: var(--silver-dollar);
224
+ font-weight: 300;
225
+ letter-spacing: 1px;
226
+ }
227
+
228
+ .custom-error-content p {
229
+ font-size: 18pt;
230
+ }
231
+
232
+ .standard-error-content {
233
+ margin-top: 50px;
234
+ }
235
+
236
+ .standard-error-content p.error-description {
237
+ font-size: 12pt;
238
+ font-style: oblique;
239
+ }
240
+
210
241
 
211
242
  /*
212
243
  * General object characteristics
@@ -233,7 +264,8 @@ aside.sidebar {
233
264
  }
234
265
 
235
266
  .button-block {
236
- border: 1px solid #dddddd;
267
+ margin: 15px 0;
268
+ border: 1px solid var(--border-gray);
237
269
  border-radius: 10px;
238
270
  box-shadow: 1px 1px 3px #bbbbbb;
239
271
  background-color: #eeeeee;
@@ -241,6 +273,14 @@ aside.sidebar {
241
273
  color: inherit;
242
274
  }
243
275
 
276
+ .button-block:first-of-type {
277
+ margin-top: 0;
278
+ }
279
+
280
+ .button-block:last-of-type {
281
+ margin-bottom: 0;
282
+ }
283
+
244
284
  .button-block:hover {
245
285
  filter: brightness(0.98);
246
286
  text-decoration: none;
@@ -253,16 +293,34 @@ aside.sidebar {
253
293
  .screenshot {
254
294
  width: 100%; /* override the markdown default */
255
295
  margin: 20px 0;
256
- border: 1px solid #f3f3f3;
296
+ border: 1px solid #bbbbbb;
257
297
  box-shadow: 3px 3px 5px #bbbbbb;
258
298
  }
259
299
 
260
- .grouping {
300
+ .group-stack {
301
+ margin: 15px 10px 25px;
302
+ padding: 20px 30px;
261
303
  border-radius: 15px;
262
304
  box-shadow: 0 0 20px #eeeeee;
263
305
  background-color: #eef5eb;
264
306
  }
265
307
 
308
+ .group-stack .stack-title {
309
+ display: flex;
310
+ justify-content: space-between;
311
+ margin: 0 0 15px 0;
312
+ padding: 0 15px;
313
+ font-size: 1.1em;
314
+ letter-spacing: 1px;
315
+ text-transform: uppercase;
316
+ }
317
+
318
+ .group-stack .stack-title-info {
319
+ margin-left: 15px;
320
+ color: #888888;
321
+ font-weight: 400;
322
+ }
323
+
266
324
  .paid-notice {
267
325
  color: var(--moneytree-leaves);
268
326
  font-weight: bold;
@@ -491,7 +549,8 @@ form .autocomplete-box {
491
549
  z-index: 99;
492
550
  width: 100%;
493
551
  padding-right: 10px;
494
- border: 1px solid #cccccc;
552
+ border: 1px solid var(--silver-dollar);
553
+ box-sizing: border-box;
495
554
  background-color: white;
496
555
  }
497
556
 
@@ -502,7 +561,7 @@ form .autocomplete-box .item {
502
561
  }
503
562
 
504
563
  form .autocomplete-box .item:hover {
505
- background-color: #cccccc;
564
+ background-color: var(--silver-dollar);
506
565
  }
507
566
 
508
567
  form .autocomplete-box .item.active {
@@ -643,7 +702,7 @@ form .autocomplete-box .item.active {
643
702
  position: relative;
644
703
  right: -100%;
645
704
  width: min-content;
646
- transition: 0.4s;
705
+ transition: 0.4s 0.2s;
647
706
  }
648
707
 
649
708
  .slide-text-gadget:hover .sleeve {
@@ -653,7 +712,7 @@ form .autocomplete-box .item.active {
653
712
  .slide-text-gadget .sleeve .main {
654
713
  position: absolute;
655
714
  transform: translateX(-100%);
656
- transition: 0.2s;
715
+ transition: 0.2s 0.2s;
657
716
  }
658
717
 
659
718
  .slide-text-gadget:hover .sleeve .main {
@@ -746,8 +805,8 @@ form .autocomplete-box .item.active {
746
805
  .toggle-switch-gadget .option .slider .switch {
747
806
  position: relative;
748
807
  left: 0;
749
- width: 50%;
750
808
  height: 100%;
809
+ width: 50%;
751
810
  box-sizing: border-box;
752
811
  border-radius: 50%;
753
812
  background-color: #eeeeee;
@@ -772,7 +831,7 @@ form .autocomplete-box .item.active {
772
831
  * Style generic box tables
773
832
  */
774
833
  .box-table {
775
- border: 2px solid #dddddd;
834
+ border: 2px solid var(--border-gray);
776
835
  }
777
836
 
778
837
  .box-table .icon-button {
@@ -789,8 +848,8 @@ form .autocomplete-box .item.active {
789
848
  }
790
849
 
791
850
  .box-table .box-row {
792
- border-top: 0.5px solid #dddddd;
793
- border-bottom: 0.5px solid #dddddd;
851
+ border-top: 0.5px solid var(--border-gray);
852
+ border-bottom: 0.5px solid var(--border-gray);
794
853
  background-color: #f5f5f5;
795
854
  }
796
855
 
@@ -822,7 +881,7 @@ form .autocomplete-box .item.active {
822
881
  }
823
882
 
824
883
  #card-filter .card:hover {
825
- background-color: #cccccc;
884
+ background-color: var(--silver-dollar);
826
885
  text-decoration: none;
827
886
  }
828
887
 
@@ -878,7 +937,7 @@ form .autocomplete-box .item.active {
878
937
  position: absolute;
879
938
  height: 100%;
880
939
  width: 100%;
881
- border: 1px solid #cccccc;
940
+ border: 1px solid var(--silver-dollar);
882
941
  border-radius: 20px;
883
942
  box-shadow: 1px 1px 3px #222222;
884
943
  text-align: center;
@@ -949,7 +1008,7 @@ form .autocomplete-box .item.active {
949
1008
  }
950
1009
 
951
1010
  .credit-card.inactive .card-face.front {
952
- color: #cccccc;
1011
+ color: var(--silver-dollar);
953
1012
  filter: brightness(0.9);
954
1013
  }
955
1014
 
@@ -1088,7 +1147,7 @@ form .autocomplete-box .item.active {
1088
1147
 
1089
1148
  .transactions-table .titles,
1090
1149
  .transactions-table .transaction {
1091
- border-bottom: 1px solid #dddddd;
1150
+ border-bottom: 1px solid var(--border-gray);
1092
1151
  }
1093
1152
 
1094
1153
  .transactions-table .titles {
@@ -1612,13 +1671,12 @@ form .autocomplete-box .item.active {
1612
1671
  display: flex;
1613
1672
  flex-direction: column;
1614
1673
  flex-wrap: wrap;
1615
- align-items: center;
1674
+ align-items: stretch;
1616
1675
  gap: 10px;
1617
1676
  width: 100%;
1618
1677
  }
1619
1678
  @media screen and (max-width: 1500px) {
1620
1679
  .details .primary-info {
1621
- display: flex;
1622
1680
  align-items: center;
1623
1681
  }
1624
1682
  }
@@ -1639,14 +1697,16 @@ form .autocomplete-box .item.active {
1639
1697
  .details .summary-container {
1640
1698
  display: flex;
1641
1699
  justify-content: center;
1642
- min-width: 45%;
1700
+ width: 45%;
1701
+ min-width: 500px;
1643
1702
  margin: 0 0 0 0;
1644
1703
  }
1645
1704
 
1646
1705
  .details .summary-box {
1647
1706
  display: flex;
1648
1707
  flex-direction: column;
1649
- width: min-content;
1708
+ width: 500px;
1709
+ box-sizing: border-box;
1650
1710
  padding: 40px 50px 60px;
1651
1711
  border-radius: 25px;
1652
1712
  box-shadow: 1px 1px 5px #dddddd;
@@ -1656,7 +1716,6 @@ form .autocomplete-box .item.active {
1656
1716
  .details .summary-box .balance {
1657
1717
  display: flex;
1658
1718
  justify-content: space-between;
1659
- min-width: 325px;
1660
1719
  margin: 20px 0;
1661
1720
  font-size: 72pt;
1662
1721
  font-weight: bold;
@@ -1694,12 +1753,13 @@ form .autocomplete-box .item.active {
1694
1753
  }
1695
1754
 
1696
1755
  .details .transactions-container {
1697
- width: 50%;
1756
+ width: 52.5%;
1698
1757
  order: 2;
1699
1758
  min-width: 500px;
1700
1759
  }
1701
1760
  @media screen and (max-width: 1500px) {
1702
1761
  .details .transactions-container {
1762
+ width: 50%;
1703
1763
  order: 1;
1704
1764
  margin-top: 50px;
1705
1765
  }
@@ -1816,10 +1876,10 @@ form .autocomplete-box .item.active {
1816
1876
  #homepage-block {
1817
1877
  margin-bottom: 20px;
1818
1878
  padding: 0 0 30px 0;
1819
- background-color: #dddddd;
1820
- border: 1px solid #d8d8d8;
1879
+ background-color: gainsboro;
1880
+ border: 1px solid lightgray;
1821
1881
  border-radius: 6px;
1822
- box-shadow: 2px 2px 5px #cccccc;
1882
+ box-shadow: 2px 2px 5px var(--silver-dollar);
1823
1883
  }
1824
1884
 
1825
1885
  #homepage-block h2 {
@@ -1869,7 +1929,7 @@ form .autocomplete-box .item.active {
1869
1929
  margin: 20px;
1870
1930
  padding: 50px;
1871
1931
  border: 1px solid #f5f5f5;
1872
- box-shadow: 2px 2px 5px #cccccc;
1932
+ box-shadow: 2px 2px 5px var(--silver-dollar);
1873
1933
  background-color: #fafafa;
1874
1934
  }
1875
1935
 
@@ -1957,6 +2017,38 @@ form .autocomplete-box .item.active {
1957
2017
  margin-top: 50px;
1958
2018
  }
1959
2019
 
2020
+ #readme .warning {
2021
+ padding: 15px 25px;
2022
+ border: 1px solid var(--silver-dollar);
2023
+ border-radius: 10px;
2024
+ box-shadow: 2px 2px 3px var(--silver-dollar);
2025
+ background-color: #f2d7a5;
2026
+ }
2027
+
2028
+ #readme .warning h5 {
2029
+ margin: 0 0 5px 0;
2030
+ }
2031
+
2032
+ #changelog {
2033
+ width: 80%;
2034
+ margin: 0 auto;
2035
+ }
2036
+
2037
+ #changelog h1 {
2038
+ font-size: 32pt;
2039
+ text-align: center;
2040
+ }
2041
+
2042
+ #changelog h2 {
2043
+ border-bottom: 1px solid var(--border-gray);
2044
+ }
2045
+
2046
+ #changelog a.latest-release {
2047
+ display: block;
2048
+ margin: 30px 0;
2049
+ font-size: 1.5em;
2050
+ }
2051
+
1960
2052
  #story .signature {
1961
2053
  margin-bottom: 100px;
1962
2054
  font-weight: bold;
@@ -1965,6 +2057,14 @@ form .autocomplete-box .item.active {
1965
2057
  }
1966
2058
 
1967
2059
 
2060
+ /*
2061
+ * Customization for the 'Credits' page
2062
+ */
2063
+ .affiliation-disclaimer {
2064
+ margin-top: 80px;
2065
+ }
2066
+
2067
+
1968
2068
  /*
1969
2069
  * Customization for the 'Profile' page
1970
2070
  */
@@ -1998,7 +2098,7 @@ form .autocomplete-box .item.active {
1998
2098
  flex-basis: 100%;
1999
2099
  margin-right: 0;
2000
2100
  padding-bottom: 50px;
2001
- border-bottom: 0.5px solid #dddddd;
2101
+ border-bottom: 0.5px solid var(--border-gray);
2002
2102
  }
2003
2103
 
2004
2104
  #profile .banking.profile-section .bank-list {
@@ -2021,15 +2121,9 @@ form .autocomplete-box .item.active {
2021
2121
  /*
2022
2122
  * Customization for the 'Bank Accounts' page
2023
2123
  */
2024
- #bank-container .bank-block {
2025
- margin: 25px 0;
2026
- padding: 30px;
2027
- }
2028
-
2029
- #bank-container .bank-block h3 {
2030
- margin-top: 0;
2124
+ #bank-container .bank-stack .stack-title {
2031
2125
  padding: 0 30px;
2032
- /*text-align: center;*/
2126
+ text-align: left;
2033
2127
  }
2034
2128
 
2035
2129
  #bank-container .account-block {
@@ -2064,7 +2158,7 @@ form .autocomplete-box .item.active {
2064
2158
  #account-type-container {
2065
2159
  width: 30%;
2066
2160
  min-width: 350px;
2067
- border: 2px solid #dddddd;
2161
+ border: 2px solid var(--border-gray);
2068
2162
  background-color: #f5f5f5;
2069
2163
  }
2070
2164
 
@@ -2074,13 +2168,13 @@ form .autocomplete-box .item.active {
2074
2168
  }
2075
2169
 
2076
2170
  #account-type-container .account-types {
2077
- border-top: 2px solid #dddddd;
2171
+ border-top: 2px solid var(--border-gray);
2078
2172
  }
2079
2173
 
2080
2174
  #account-type-container .account-type {
2081
2175
  padding: 10px;
2082
- border-top: 0.5px solid #dddddd;
2083
- border-bottom: 0.5px solid #dddddd;
2176
+ border-top: 0.5px solid var(--border-gray);
2177
+ border-bottom: 0.5px solid var(--border-gray);
2084
2178
  }
2085
2179
 
2086
2180
 
@@ -2101,10 +2195,22 @@ form#bank-account .hidden {
2101
2195
  align-items: center
2102
2196
  }
2103
2197
 
2104
- #bank-account-summaries-container .bank {
2105
- margin: 0 0 10px;
2198
+ #bank-account-summaries-container h2.bank {
2199
+ margin: 0 0 5px;
2200
+ font-size: 1.6em;
2201
+ letter-spacing: 1px;
2202
+ text-transform: uppercase;
2106
2203
  text-align: center;
2204
+ }
2205
+
2206
+ #bank-account-summaries-container h3.balance {
2207
+ margin: 0 0 10px;
2208
+ color: gray;
2209
+ font-size: 1em;
2210
+ font-weight: 300;
2107
2211
  text-transform: uppercase;
2212
+ text-align: center;
2213
+ letter-spacing: 1px;
2108
2214
  }
2109
2215
 
2110
2216
  #bank-account-summaries {
@@ -2113,29 +2219,21 @@ form#bank-account .hidden {
2113
2219
  width: 100%;
2114
2220
  }
2115
2221
 
2116
- #bank-account-summaries .account-type-block {
2222
+ #bank-account-summaries .account-type-stack {
2117
2223
  display: flex;
2118
2224
  flex-direction: column;
2119
- width: 50%;
2225
+ width: 60%;
2120
2226
  min-width: 400px;
2121
- margin: 10px auto;
2122
- padding: 25px;
2227
+ margin: 15px auto 25px;
2123
2228
  }
2124
2229
 
2125
2230
  #bank-account-summaries .account-block {
2126
2231
  display: flex;
2127
2232
  justify-content: space-between;
2128
2233
  align-items: center;
2129
- width: 100%;
2130
- box-sizing: border-box;
2131
- margin-bottom: 15px;
2132
2234
  padding: 30px 10%;
2133
2235
  }
2134
2236
 
2135
- #bank-account-summaries a.account-block:last-of-type {
2136
- margin-bottom: 0;
2137
- }
2138
-
2139
2237
  #bank-account-summaries .account-block .title {
2140
2238
  font-size: 16pt;
2141
2239
  }
@@ -2404,27 +2502,21 @@ form#card #statement-due-day-field {
2404
2502
  justify-content: space-around;
2405
2503
  }
2406
2504
 
2407
- #credit-statements .card-column {
2505
+ #credit-statements .card-stack {
2408
2506
  display: flex;
2409
2507
  flex-direction: column;
2410
2508
  height: min-content;
2411
- margin: 15px 10px;
2412
- padding: 20px;
2413
- text-transform: uppercase;
2414
- text-align: center;
2415
- font-size: 1.1em;
2416
2509
  }
2417
2510
 
2418
- #credit-statements-container .card-column .digits {
2419
- color: #888888;
2511
+ #credit-statements .card-stack .stack-title {
2512
+ justify-content: center;
2420
2513
  }
2421
2514
 
2422
2515
  #credit-statements .statement-block {
2423
2516
  display: flex;
2424
- align-items: center;
2425
2517
  justify-content: space-between;
2518
+ align-items: center;
2426
2519
  width: 275px;
2427
- margin: 15px;
2428
2520
  padding: 45px 50px;
2429
2521
  }
2430
2522
 
@@ -2507,7 +2599,7 @@ form#pay input {
2507
2599
  }
2508
2600
 
2509
2601
  form#pay .form-inputs {
2510
- border: 1px solid #cccccc;
2602
+ border: 1px solid var(--silver-dollar);
2511
2603
  border-radius: inherit;
2512
2604
  }
2513
2605
 
@@ -2673,7 +2765,7 @@ form#credit-transaction .merchant-field {
2673
2765
  border-radius: 20px;
2674
2766
  text-align: center;
2675
2767
  outline: none;
2676
- caret-color: #cccccc;
2768
+ caret-color: var(--silver-dollar);
2677
2769
  transition: border 0.1s ease;
2678
2770
  }
2679
2771
 
@@ -2729,6 +2821,6 @@ form#credit-transaction .merchant-field {
2729
2821
  #transaction-tags .subtags {
2730
2822
  margin: 0 0 0 10px;
2731
2823
  padding-left: 40px;
2732
- border-left: 1px solid #dddddd;
2824
+ border-left: 1px solid var(--border-gray);
2733
2825
  }
2734
2826
 
@@ -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
  }