home · contact · privacy
Improve ledger layout. master
authorChristian Heller <c.heller@plomlompom.de>
Tue, 28 Jan 2025 18:51:44 +0000 (19:51 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 28 Jan 2025 18:51:44 +0000 (19:51 +0100)
ledger.py
templates/_macros.tmpl
templates/ledger_raw.tmpl
templates/ledger_structured.tmpl

index d7ebad6e139e4809e66f6e3095746fd7380bffb8..098c6f6a82c6c5ae4d05536ae38b6b4d5591c441 100755 (executable)
--- a/ledger.py
+++ b/ledger.py
@@ -136,6 +136,7 @@ class BookingLine:
     def __init__(self, booking: 'Booking') -> None:
         self.errors: list[str] = []
         self.booking = booking
     def __init__(self, booking: 'Booking') -> None:
         self.errors: list[str] = []
         self.booking = booking
+        self.idx = 0
 
 
 class IntroLine(BookingLine):
 
 
 class IntroLine(BookingLine):
@@ -170,8 +171,9 @@ class IntroLine(BookingLine):
 class TransferLine(BookingLine):
     """Non-first Booking line, expected to carry value movement."""
 
 class TransferLine(BookingLine):
     """Non-first Booking line, expected to carry value movement."""
 
-    def __init__(self, booking: 'Booking', code: str) -> None:
+    def __init__(self, booking: 'Booking', code: str, idx: int) -> None:
         super().__init__(booking)
         super().__init__(booking)
+        self.idx = idx
         self.currency = ''
         self.amount: Optional[Decimal] = None
         if not code[0].isspace():
         self.currency = ''
         self.amount: Optional[Decimal] = None
         if not code[0].isspace():
@@ -211,8 +213,8 @@ class Booking:
         self.intro_line = IntroLine(self, dat_lines[0].code)
         dat_lines[0].booking_line = self.intro_line
         self._transfer_lines = []
         self.intro_line = IntroLine(self, dat_lines[0].code)
         dat_lines[0].booking_line = self.intro_line
         self._transfer_lines = []
-        for dat_line in dat_lines[1:]:
-            dat_line.booking_line = TransferLine(self, dat_line.code)
+        for i, dat_line in enumerate(dat_lines[1:]):
+            dat_line.booking_line = TransferLine(self, dat_line.code, i + 1)
             self._transfer_lines += [dat_line.booking_line]
         changes = Wealth()
         sink_account = None
             self._transfer_lines += [dat_line.booking_line]
         changes = Wealth()
         sink_account = None
index a89969998bcfad480ae45abff7bb35f6c9f5198b..c88bce683b2f4e0d0a9dc60b446e3e5c99daa697 100644 (file)
@@ -7,15 +7,21 @@ td.amt, td.curr { font-family: monospace; font-size: 1.3em; }
 td.invalid, tr.warning td.invalid { background-color: #ff0000; }
 {% endmacro %}
 
 td.invalid, tr.warning td.invalid { background-color: #ff0000; }
 {% endmacro %}
 
+{% macro css_ledger_index_col() %}
+table.ledger tr > td:first-child { background-color: white; }
+{% endmacro %}
+
 {% macro table_dat_lines(dat_lines, raw) %}
 {% macro table_dat_lines(dat_lines, raw) %}
-<table>
+<table class="ledger">
 {% for dat_line in dat_lines %}
   {% if (not raw) and dat_line.is_intro and loop.index > 1 %}
 {% for dat_line in dat_lines %}
   {% if (not raw) and dat_line.is_intro and loop.index > 1 %}
-    <tr class="alternating"><td colspan=5>&nbsp;</td></tr>
+    <tr class="alternating"><td><td colspan=4>&nbsp;</td></tr>
   {% endif %}
   <tr class="alternating{% if dat_line.is_questionable %} warning{% endif %}">
   {% if dat_line.is_intro %}
   {% endif %}
   <tr class="alternating{% if dat_line.is_questionable %} warning{% endif %}">
   {% if dat_line.is_intro %}
-    <td id="{{dat_line.booking_id}}"><a href="#{{dat_line.booking_id}}">#</a>/<a href="/balance?up_incl={{dat_line.booking_id}}">b</a></td>
+    <td id="{{dat_line.booking_id}}"><a href="#{{dat_line.booking_id}}">[#]</a></td>
+  {% elif dat_line.booking_line.idx == 1 %}
+    <td><a href="/balance?up_incl={{dat_line.booking_id}}">[b]</a></td>
   {% else %}
     <td></td>
   {% endif %}
   {% else %}
     <td></td>
   {% endif %}
@@ -29,8 +35,8 @@ td.invalid, tr.warning td.invalid { background-color: #ff0000; }
     </td>
   {% else %}
     {% if dat_line.is_intro %}
     </td>
   {% else %}
     {% if dat_line.is_intro %}
-      <td{% if dat_line.error %} class="invalid"{% endif %}><a href="/bookings/{{dat_line.booking_id}}">{{dat_line.booking_line.date}}</a></td>
-      <td{% if dat_line.error %} class="invalid"{% endif %} colspan=2>{{dat_line.booking_line.target}}</td>
+      <td class="date {% if dat_line.error %} invalid{% endif %}" colspan=2><a href="/bookings/{{dat_line.booking_id}}">{{dat_line.booking_line.date}}</a></td>
+      <td{% if dat_line.error %} class="invalid"{% endif %}>{{dat_line.booking_line.target}}</td>
     {% elif not dat_line.error %}
       <td class="amt">{{dat_line.booking_line.amount_short}}</td>
       <td class="curr">{{dat_line.booking_line.currency|truncate(4,true,"…")}}</td>
     {% elif not dat_line.error %}
       <td class="amt">{{dat_line.booking_line.amount_short}}</td>
       <td class="curr">{{dat_line.booking_line.currency|truncate(4,true,"…")}}</td>
index d09e722183c3482807d06a073b93dc82f9e56431..d11e1927d7bc5bdb67f52d0326cb41daa0bf6158 100644 (file)
@@ -4,6 +4,7 @@
 {% block css %}
 table { font-family: monospace; }
 {{ macros.css_errors() }}
 {% block css %}
 table { font-family: monospace; }
 {{ macros.css_errors() }}
+{{ macros.css_ledger_index_col() }}
 {% endblock %}
 
 {% block content %}
 {% endblock %}
 
 {% block content %}
index 1669ce9fc99e360bf9d8c2f6bd59116cf5c5237e..654cf80a27e8bd542f7c6437b89c33c71ef4f626 100644 (file)
@@ -4,6 +4,9 @@
 {% block css %}
 {{ macros.css_td_money() }}
 {{ macros.css_errors() }}
 {% block css %}
 {{ macros.css_td_money() }}
 {{ macros.css_errors() }}
+{{ macros.css_ledger_index_col() }}
+table.ledger > tbody > tr > td.date, table.ledger > tbody > tr > td:first-child { font-family: monospace; font-size: 1.3em; text-align: center; }
+table.ledger > tbody > tr > td { vertical-align: middle; }
 {% endblock %}
 
 {% block content %}
 {% endblock %}
 
 {% block content %}