Renames danish to english

This commit is contained in:
Janus C. H. Knudsen 2026-01-11 21:42:24 +01:00
parent 754681059d
commit 5e0bd9db74
29 changed files with 405 additions and 438 deletions

View file

@ -1,12 +1,12 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.Kasse.Components; namespace PlanTempus.Application.Features.CashRegister.Components;
/// <summary> /// <summary>
/// ViewComponent for the approval section. /// ViewComponent for the approval section.
/// Handles status, approver selection, and confirmation checkbox. /// Handles status, approver selection, and confirmation checkbox.
/// </summary> /// </summary>
public class KasseGodkendelseViewComponent : ViewComponent public class CashApprovalViewComponent : ViewComponent
{ {
public IViewComponentResult Invoke() public IViewComponentResult Invoke()
{ {

View file

@ -1,12 +1,12 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.Kasse.Components; namespace PlanTempus.Application.Features.CashRegister.Components;
/// <summary> /// <summary>
/// ViewComponent for cash calculation section. /// ViewComponent for cash calculation section.
/// Handles starting balance, payouts, bank deposits, and actual cash count. /// Handles starting balance, payouts, bank deposits, and actual cash count.
/// </summary> /// </summary>
public class KasseKontanterViewComponent : ViewComponent public class CashBalanceViewComponent : ViewComponent
{ {
public IViewComponentResult Invoke() public IViewComponentResult Invoke()
{ {

View file

@ -1,12 +1,12 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.Kasse.Components; namespace PlanTempus.Application.Features.CashRegister.Components;
/// <summary> /// <summary>
/// ViewComponent for displaying the cash difference. /// ViewComponent for displaying the cash difference.
/// Shows positive/negative/neutral states with color coding. /// Shows positive/negative/neutral states with color coding.
/// </summary> /// </summary>
public class KasseDifferenceViewComponent : ViewComponent public class CashDifferenceViewComponent : ViewComponent
{ {
public IViewComponentResult Invoke() public IViewComponentResult Invoke()
{ {

View file

@ -1,12 +1,12 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.Kasse.Components; namespace PlanTempus.Application.Features.CashRegister.Components;
/// <summary> /// <summary>
/// ViewComponent for daily reconciliation info. /// ViewComponent for period reconciliation info.
/// Shows period, register, and employee information. /// Shows period, register, and employee information.
/// </summary> /// </summary>
public class KasseDagsoplysningerViewComponent : ViewComponent public class PeriodInfoViewComponent : ViewComponent
{ {
public IViewComponentResult Invoke() public IViewComponentResult Invoke()
{ {

View file

@ -1,12 +1,12 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.Kasse.Components; namespace PlanTempus.Application.Features.CashRegister.Components;
/// <summary> /// <summary>
/// ViewComponent for displaying today's payment figures. /// ViewComponent for displaying period payment figures.
/// Shows system values vs. optional control values for different payment types. /// Shows system values vs. optional control values for different payment types.
/// </summary> /// </summary>
public class KasseDagensTalViewComponent : ViewComponent public class PeriodRevenueViewComponent : ViewComponent
{ {
public IViewComponentResult Invoke() public IViewComponentResult Invoke()
{ {

View file

@ -1,12 +1,12 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.Kasse.Components; namespace PlanTempus.Application.Features.CashRegister.Components;
/// <summary> /// <summary>
/// ViewComponent for the note field. /// ViewComponent for the note field.
/// Optional field for explaining cash differences. /// Optional field for explaining cash differences.
/// </summary> /// </summary>
public class KasseNoteViewComponent : ViewComponent public class ReconciliationNoteViewComponent : ViewComponent
{ {
public IViewComponentResult Invoke() public IViewComponentResult Invoke()
{ {

View file

@ -0,0 +1,191 @@
<!-- Action Bar -->
<swp-action-bar>
<swp-selection-info>
<span id="selectionCount">0 valgt</span>
</swp-selection-info>
<swp-btn class="primary" id="exportBtn" disabled>
<i class="ph ph-download"></i>
Eksporter SAF-T
</swp-btn>
</swp-action-bar>
<!-- Table -->
<swp-cash-table>
<swp-cash-table-header>
<swp-cash-th class="checkbox"><input type="checkbox" id="selectAll" /></swp-cash-th>
<swp-cash-th>Dato</swp-cash-th>
<swp-cash-th>ID</swp-cash-th>
<swp-cash-th>Periode</swp-cash-th>
<swp-cash-th>Kassepunkt</swp-cash-th>
<swp-cash-th>Afsluttet af</swp-cash-th>
<swp-cash-th class="right">Omsætning</swp-cash-th>
<swp-cash-th class="right">Difference</swp-cash-th>
<swp-cash-th>Status</swp-cash-th>
<swp-cash-th></swp-cash-th>
</swp-cash-table-header>
<swp-cash-table-body>
<!-- Draft row (current day) -->
<swp-cash-table-row data-id="draft" class="draft-row">
<swp-cash-td class="checkbox"></swp-cash-td>
<swp-cash-td class="muted">I dag</swp-cash-td>
<swp-cash-td class="id muted"></swp-cash-td>
<swp-cash-td>
<swp-period-cell>
<span class="dates">29. dec 17:45 → ...</span>
</swp-period-cell>
</swp-cash-td>
<swp-cash-td>Kasse 1</swp-cash-td>
<swp-cash-td class="muted"></swp-cash-td>
<swp-cash-td class="right mono muted">4.250 kr</swp-cash-td>
<swp-cash-td class="right mono muted"></swp-cash-td>
<swp-cash-td><swp-status-badge class="draft">Kladde</swp-status-badge></swp-cash-td>
<swp-cash-td><swp-row-arrow><i class="ph ph-caret-right"></i></swp-row-arrow></swp-cash-td>
</swp-cash-table-row>
<swp-cash-table-row data-id="043">
<swp-cash-td class="checkbox"><input type="checkbox" class="row-select" /></swp-cash-td>
<swp-cash-td>29. dec</swp-cash-td>
<swp-cash-td class="id">Z-043</swp-cash-td>
<swp-cash-td>
<swp-period-cell>
<span class="dates">28. dec 18:00 → 29. dec 17:45</span>
</swp-period-cell>
</swp-cash-td>
<swp-cash-td>Kasse 1</swp-cash-td>
<swp-cash-td>Anna Jensen</swp-cash-td>
<swp-cash-td class="right mono">18.865 kr</swp-cash-td>
<swp-cash-td class="right mono">0 kr</swp-cash-td>
<swp-cash-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-cash-td>
<swp-cash-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-cash-td>
</swp-cash-table-row>
<swp-cash-row-detail data-for="043">
<swp-row-detail-content>
<swp-row-detail-actions>
<swp-btn class="secondary">
<i class="ph ph-file-csv"></i>
Download CSV
</swp-btn>
<swp-btn class="secondary">
<i class="ph ph-file-pdf"></i>
Download PDF
</swp-btn>
<swp-btn class="primary">
<i class="ph ph-list-bullets"></i>
Se transaktioner
</swp-btn>
</swp-row-detail-actions>
</swp-row-detail-content>
</swp-cash-row-detail>
<swp-cash-table-row data-id="042">
<swp-cash-td class="checkbox"><input type="checkbox" class="row-select" /></swp-cash-td>
<swp-cash-td>28. dec</swp-cash-td>
<swp-cash-td class="id">Z-042</swp-cash-td>
<swp-cash-td>
<swp-period-cell>
<span class="dates">27. dec 18:30 → 28. dec 18:00</span>
</swp-period-cell>
</swp-cash-td>
<swp-cash-td>Kasse 1</swp-cash-td>
<swp-cash-td>Karina Knudsen</swp-cash-td>
<swp-cash-td class="right mono">12.450 kr</swp-cash-td>
<swp-cash-td class="right mono negative">-25 kr</swp-cash-td>
<swp-cash-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-cash-td>
<swp-cash-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-cash-td>
</swp-cash-table-row>
<swp-cash-row-detail data-for="042">
<swp-row-detail-content>
<swp-row-detail-actions>
<swp-btn class="secondary">
<i class="ph ph-file-csv"></i>
Download CSV
</swp-btn>
<swp-btn class="secondary">
<i class="ph ph-file-pdf"></i>
Download PDF
</swp-btn>
<swp-btn class="primary">
<i class="ph ph-list-bullets"></i>
Se transaktioner
</swp-btn>
</swp-row-detail-actions>
</swp-row-detail-content>
</swp-cash-row-detail>
<swp-cash-table-row data-id="041">
<swp-cash-td class="checkbox"><input type="checkbox" class="row-select" /></swp-cash-td>
<swp-cash-td>27. dec</swp-cash-td>
<swp-cash-td class="id">Z-041</swp-cash-td>
<swp-cash-td>
<swp-period-cell>
<span class="dates">26. dec 18:00 → 27. dec 18:30</span>
</swp-period-cell>
</swp-cash-td>
<swp-cash-td>Kasse 1</swp-cash-td>
<swp-cash-td>Martin Nielsen</swp-cash-td>
<swp-cash-td class="right mono">21.340 kr</swp-cash-td>
<swp-cash-td class="right mono">0 kr</swp-cash-td>
<swp-cash-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-cash-td>
<swp-cash-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-cash-td>
</swp-cash-table-row>
<swp-cash-row-detail data-for="041">
<swp-row-detail-content>
<swp-row-detail-actions>
<swp-btn class="secondary">
<i class="ph ph-file-csv"></i>
Download CSV
</swp-btn>
<swp-btn class="secondary">
<i class="ph ph-file-pdf"></i>
Download PDF
</swp-btn>
<swp-btn class="primary">
<i class="ph ph-list-bullets"></i>
Se transaktioner
</swp-btn>
</swp-row-detail-actions>
</swp-row-detail-content>
</swp-cash-row-detail>
<swp-cash-table-row data-id="040">
<swp-cash-td class="checkbox"><input type="checkbox" class="row-select" /></swp-cash-td>
<swp-cash-td>23. dec</swp-cash-td>
<swp-cash-td class="id">Z-040</swp-cash-td>
<swp-cash-td>
<swp-period-cell>
<span class="dates">22. dec 18:00 → 23. dec 17:30</span>
</swp-period-cell>
</swp-cash-td>
<swp-cash-td>Kasse 1</swp-cash-td>
<swp-cash-td>Anna Jensen</swp-cash-td>
<swp-cash-td class="right mono">28.750 kr</swp-cash-td>
<swp-cash-td class="right mono negative">-50 kr</swp-cash-td>
<swp-cash-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-cash-td>
<swp-cash-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-cash-td>
</swp-cash-table-row>
<swp-cash-row-detail data-for="040">
<swp-row-detail-content>
<swp-row-detail-actions>
<swp-btn class="secondary">
<i class="ph ph-file-csv"></i>
Download CSV
</swp-btn>
<swp-btn class="secondary">
<i class="ph ph-file-pdf"></i>
Download PDF
</swp-btn>
<swp-btn class="primary">
<i class="ph ph-list-bullets"></i>
Se transaktioner
</swp-btn>
</swp-row-detail-actions>
</swp-row-detail-content>
</swp-cash-row-detail>
</swp-cash-table-body>
<swp-cash-table-footer>
<span>Viser 5 afstemninger</span>
<span>Z-040 → Z-043</span>
</swp-cash-table-footer>
</swp-cash-table>

View file

@ -0,0 +1,15 @@
using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.CashRegister.Components;
/// <summary>
/// ViewComponent for the reconciliation table on the Cash Register list page.
/// Shows all reconciliations with action bar and SAF-T export.
/// </summary>
public class ReconciliationTableViewComponent : ViewComponent
{
public IViewComponentResult Invoke()
{
return View();
}
}

View file

@ -0,0 +1,15 @@
using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.CashRegister.Components;
/// <summary>
/// ViewComponent for the filter bar on the Cash Register list page.
/// Contains date range, register point, and status filters.
/// </summary>
public class RegisterFilterBarViewComponent : ViewComponent
{
public IViewComponentResult Invoke()
{
return View();
}
}

View file

@ -0,0 +1,93 @@
@page "/kasse"
@using PlanTempus.Application.Features.CashRegister.Pages
@model PlanTempus.Application.Features.CashRegister.Pages.IndexModel
@{
ViewData["Title"] = "Kasse";
}
<!-- Sticky Header (Stats + Tabs) -->
<swp-cash-sticky-header>
<!-- Context Stats (changes based on active tab) -->
<swp-cash-header>
<!-- Stats for Oversigt tab -->
<swp-cash-stats data-for-tab="oversigt" class="active">
<swp-cash-stat>
<swp-cash-stat-value>12</swp-cash-stat-value>
<swp-cash-stat-label>Afstemninger i periode</swp-cash-stat-label>
</swp-cash-stat>
<swp-cash-stat class="highlight">
<swp-cash-stat-value>186.450 kr</swp-cash-stat-value>
<swp-cash-stat-label>Total omsætning</swp-cash-stat-label>
</swp-cash-stat>
<swp-cash-stat>
<swp-cash-stat-value>42.340 kr</swp-cash-stat-value>
<swp-cash-stat-label>Kontantsalg</swp-cash-stat-label>
</swp-cash-stat>
<swp-cash-stat class="warning">
<swp-cash-stat-value>-75 kr</swp-cash-stat-value>
<swp-cash-stat-label>Samlet difference</swp-cash-stat-label>
</swp-cash-stat>
</swp-cash-stats>
<!-- Stats for Kasseafstemning tab -->
<swp-cash-stats data-for-tab="afstemning">
<swp-cash-stat>
<swp-cash-stat-value>47</swp-cash-stat-value>
<swp-cash-stat-label>Transaktioner i dag</swp-cash-stat-label>
</swp-cash-stat>
<swp-cash-stat class="highlight">
<swp-cash-stat-value>18.865 kr</swp-cash-stat-value>
<swp-cash-stat-label>Omsætning i dag</swp-cash-stat-label>
</swp-cash-stat>
<swp-cash-stat>
<swp-cash-stat-value>29. dec 17:45</swp-cash-stat-value>
<swp-cash-stat-label>Sidste afstemning</swp-cash-stat-label>
</swp-cash-stat>
<swp-cash-stat>
<swp-cash-stat-value>Anna J.</swp-cash-stat-value>
<swp-cash-stat-label>Åbnede kassen 29. dec 09:05</swp-cash-stat-label>
</swp-cash-stat>
</swp-cash-stats>
</swp-cash-header>
<!-- Tab Bar -->
<swp-tab-bar>
<swp-tab class="active" data-tab="oversigt">
<i class="ph ph-list-checks"></i>
Oversigt
</swp-tab>
<swp-tab data-tab="afstemning">
<i class="ph ph-cash-register"></i>
Kasseafstemning
</swp-tab>
</swp-tab-bar>
</swp-cash-sticky-header>
<!-- Tab Content: Oversigt -->
<swp-tab-content data-tab="oversigt" class="active">
<swp-page-container>
@await Component.InvokeAsync("RegisterFilterBar")
@await Component.InvokeAsync("ReconciliationTable")
</swp-page-container>
</swp-tab-content>
<!-- Tab Content: Kasseafstemning -->
<swp-tab-content data-tab="afstemning">
<swp-page-container>
<swp-cash-grid>
<swp-cash-column>
@await Component.InvokeAsync("PeriodRevenue")
@await Component.InvokeAsync("CashBalance")
@await Component.InvokeAsync("CashDifference")
</swp-cash-column>
<swp-cash-column>
@await Component.InvokeAsync("PeriodInfo")
@await Component.InvokeAsync("ReconciliationNote")
@await Component.InvokeAsync("CashApproval")
</swp-cash-column>
</swp-cash-grid>
<swp-system-note>Systemet gemmer hvornår og af hvem der er godkendt enkelt kontrolspor.</swp-system-note>
</swp-page-container>
</swp-tab-content>

View file

@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
namespace PlanTempus.Application.Features.Kasse.Pages; namespace PlanTempus.Application.Features.CashRegister.Pages;
public class IndexModel : PageModel public class IndexModel : PageModel
{ {

View file

@ -1,15 +0,0 @@
using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.Kasse.Components;
/// <summary>
/// ViewComponent for the filter bar on the Kasse list page.
/// Contains date range, kassepunkt, and status filters.
/// </summary>
public class KasseFilterBarViewComponent : ViewComponent
{
public IViewComponentResult Invoke()
{
return View();
}
}

View file

@ -1,18 +0,0 @@
<swp-kasse-stats>
<swp-kasse-stat>
<swp-kasse-stat-value>12</swp-kasse-stat-value>
<swp-kasse-stat-label>Afstemninger i periode</swp-kasse-stat-label>
</swp-kasse-stat>
<swp-kasse-stat class="highlight">
<swp-kasse-stat-value>186.450 kr</swp-kasse-stat-value>
<swp-kasse-stat-label>Total omsætning</swp-kasse-stat-label>
</swp-kasse-stat>
<swp-kasse-stat>
<swp-kasse-stat-value>42.340 kr</swp-kasse-stat-value>
<swp-kasse-stat-label>Kontantsalg</swp-kasse-stat-label>
</swp-kasse-stat>
<swp-kasse-stat class="warning">
<swp-kasse-stat-value>-75 kr</swp-kasse-stat-value>
<swp-kasse-stat-label>Samlet difference</swp-kasse-stat-label>
</swp-kasse-stat>
</swp-kasse-stats>

View file

@ -1,15 +0,0 @@
using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.Kasse.Components;
/// <summary>
/// ViewComponent for the stats bar on the Kasse list page.
/// Shows summary statistics for reconciliations.
/// </summary>
public class KasseStatsBarViewComponent : ViewComponent
{
public IViewComponentResult Invoke()
{
return View();
}
}

View file

@ -1,191 +0,0 @@
<!-- Action Bar -->
<swp-action-bar>
<swp-selection-info>
<span id="selectionCount">0 valgt</span>
</swp-selection-info>
<swp-btn class="primary" id="exportBtn" disabled>
<i class="ph ph-download"></i>
Eksporter SAF-T
</swp-btn>
</swp-action-bar>
<!-- Table -->
<swp-kasse-table>
<swp-kasse-table-header>
<swp-kasse-th class="checkbox"><input type="checkbox" id="selectAll" /></swp-kasse-th>
<swp-kasse-th>Dato</swp-kasse-th>
<swp-kasse-th>ID</swp-kasse-th>
<swp-kasse-th>Periode</swp-kasse-th>
<swp-kasse-th>Kassepunkt</swp-kasse-th>
<swp-kasse-th>Afsluttet af</swp-kasse-th>
<swp-kasse-th class="right">Omsætning</swp-kasse-th>
<swp-kasse-th class="right">Difference</swp-kasse-th>
<swp-kasse-th>Status</swp-kasse-th>
<swp-kasse-th></swp-kasse-th>
</swp-kasse-table-header>
<swp-kasse-table-body>
<!-- Draft row (current day) -->
<swp-kasse-table-row data-id="draft" class="draft-row">
<swp-kasse-td class="checkbox"></swp-kasse-td>
<swp-kasse-td class="muted">I dag</swp-kasse-td>
<swp-kasse-td class="id muted"></swp-kasse-td>
<swp-kasse-td>
<swp-period-cell>
<span class="dates">29. dec 17:45 → ...</span>
</swp-period-cell>
</swp-kasse-td>
<swp-kasse-td>Kasse 1</swp-kasse-td>
<swp-kasse-td class="muted"></swp-kasse-td>
<swp-kasse-td class="right mono muted">4.250 kr</swp-kasse-td>
<swp-kasse-td class="right mono muted"></swp-kasse-td>
<swp-kasse-td><swp-status-badge class="draft">Kladde</swp-status-badge></swp-kasse-td>
<swp-kasse-td><swp-row-arrow><i class="ph ph-caret-right"></i></swp-row-arrow></swp-kasse-td>
</swp-kasse-table-row>
<swp-kasse-table-row data-id="043">
<swp-kasse-td class="checkbox"><input type="checkbox" class="row-select" /></swp-kasse-td>
<swp-kasse-td>29. dec</swp-kasse-td>
<swp-kasse-td class="id">Z-043</swp-kasse-td>
<swp-kasse-td>
<swp-period-cell>
<span class="dates">28. dec 18:00 → 29. dec 17:45</span>
</swp-period-cell>
</swp-kasse-td>
<swp-kasse-td>Kasse 1</swp-kasse-td>
<swp-kasse-td>Anna Jensen</swp-kasse-td>
<swp-kasse-td class="right mono">18.865 kr</swp-kasse-td>
<swp-kasse-td class="right mono">0 kr</swp-kasse-td>
<swp-kasse-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-kasse-td>
<swp-kasse-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-kasse-td>
</swp-kasse-table-row>
<swp-kasse-row-detail data-for="043">
<swp-row-detail-content>
<swp-row-detail-actions>
<swp-btn class="secondary">
<i class="ph ph-file-csv"></i>
Download CSV
</swp-btn>
<swp-btn class="secondary">
<i class="ph ph-file-pdf"></i>
Download PDF
</swp-btn>
<swp-btn class="primary">
<i class="ph ph-list-bullets"></i>
Se transaktioner
</swp-btn>
</swp-row-detail-actions>
</swp-row-detail-content>
</swp-kasse-row-detail>
<swp-kasse-table-row data-id="042">
<swp-kasse-td class="checkbox"><input type="checkbox" class="row-select" /></swp-kasse-td>
<swp-kasse-td>28. dec</swp-kasse-td>
<swp-kasse-td class="id">Z-042</swp-kasse-td>
<swp-kasse-td>
<swp-period-cell>
<span class="dates">27. dec 18:30 → 28. dec 18:00</span>
</swp-period-cell>
</swp-kasse-td>
<swp-kasse-td>Kasse 1</swp-kasse-td>
<swp-kasse-td>Karina Knudsen</swp-kasse-td>
<swp-kasse-td class="right mono">12.450 kr</swp-kasse-td>
<swp-kasse-td class="right mono negative">-25 kr</swp-kasse-td>
<swp-kasse-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-kasse-td>
<swp-kasse-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-kasse-td>
</swp-kasse-table-row>
<swp-kasse-row-detail data-for="042">
<swp-row-detail-content>
<swp-row-detail-actions>
<swp-btn class="secondary">
<i class="ph ph-file-csv"></i>
Download CSV
</swp-btn>
<swp-btn class="secondary">
<i class="ph ph-file-pdf"></i>
Download PDF
</swp-btn>
<swp-btn class="primary">
<i class="ph ph-list-bullets"></i>
Se transaktioner
</swp-btn>
</swp-row-detail-actions>
</swp-row-detail-content>
</swp-kasse-row-detail>
<swp-kasse-table-row data-id="041">
<swp-kasse-td class="checkbox"><input type="checkbox" class="row-select" /></swp-kasse-td>
<swp-kasse-td>27. dec</swp-kasse-td>
<swp-kasse-td class="id">Z-041</swp-kasse-td>
<swp-kasse-td>
<swp-period-cell>
<span class="dates">26. dec 18:00 → 27. dec 18:30</span>
</swp-period-cell>
</swp-kasse-td>
<swp-kasse-td>Kasse 1</swp-kasse-td>
<swp-kasse-td>Martin Nielsen</swp-kasse-td>
<swp-kasse-td class="right mono">21.340 kr</swp-kasse-td>
<swp-kasse-td class="right mono">0 kr</swp-kasse-td>
<swp-kasse-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-kasse-td>
<swp-kasse-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-kasse-td>
</swp-kasse-table-row>
<swp-kasse-row-detail data-for="041">
<swp-row-detail-content>
<swp-row-detail-actions>
<swp-btn class="secondary">
<i class="ph ph-file-csv"></i>
Download CSV
</swp-btn>
<swp-btn class="secondary">
<i class="ph ph-file-pdf"></i>
Download PDF
</swp-btn>
<swp-btn class="primary">
<i class="ph ph-list-bullets"></i>
Se transaktioner
</swp-btn>
</swp-row-detail-actions>
</swp-row-detail-content>
</swp-kasse-row-detail>
<swp-kasse-table-row data-id="040">
<swp-kasse-td class="checkbox"><input type="checkbox" class="row-select" /></swp-kasse-td>
<swp-kasse-td>23. dec</swp-kasse-td>
<swp-kasse-td class="id">Z-040</swp-kasse-td>
<swp-kasse-td>
<swp-period-cell>
<span class="dates">22. dec 18:00 → 23. dec 17:30</span>
</swp-period-cell>
</swp-kasse-td>
<swp-kasse-td>Kasse 1</swp-kasse-td>
<swp-kasse-td>Anna Jensen</swp-kasse-td>
<swp-kasse-td class="right mono">28.750 kr</swp-kasse-td>
<swp-kasse-td class="right mono negative">-50 kr</swp-kasse-td>
<swp-kasse-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-kasse-td>
<swp-kasse-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-kasse-td>
</swp-kasse-table-row>
<swp-kasse-row-detail data-for="040">
<swp-row-detail-content>
<swp-row-detail-actions>
<swp-btn class="secondary">
<i class="ph ph-file-csv"></i>
Download CSV
</swp-btn>
<swp-btn class="secondary">
<i class="ph ph-file-pdf"></i>
Download PDF
</swp-btn>
<swp-btn class="primary">
<i class="ph ph-list-bullets"></i>
Se transaktioner
</swp-btn>
</swp-row-detail-actions>
</swp-row-detail-content>
</swp-kasse-row-detail>
</swp-kasse-table-body>
<swp-kasse-table-footer>
<span>Viser 5 afstemninger</span>
<span>Z-040 → Z-043</span>
</swp-kasse-table-footer>
</swp-kasse-table>

View file

@ -1,15 +0,0 @@
using Microsoft.AspNetCore.Mvc;
namespace PlanTempus.Application.Features.Kasse.Components;
/// <summary>
/// ViewComponent for the reconciliation table on the Kasse list page.
/// Shows all reconciliations with action bar and SAF-T export.
/// </summary>
public class KasseTableViewComponent : ViewComponent
{
public IViewComponentResult Invoke()
{
return View();
}
}

View file

@ -1,93 +0,0 @@
@page "/kasse"
@using PlanTempus.Application.Features.Kasse.Pages
@model PlanTempus.Application.Features.Kasse.Pages.IndexModel
@{
ViewData["Title"] = "Kasse";
}
<!-- Sticky Header (Stats + Tabs) -->
<swp-kasse-sticky-header>
<!-- Context Stats (changes based on active tab) -->
<swp-kasse-header>
<!-- Stats for Oversigt tab -->
<swp-kasse-stats data-for-tab="oversigt" class="active">
<swp-kasse-stat>
<swp-kasse-stat-value>12</swp-kasse-stat-value>
<swp-kasse-stat-label>Afstemninger i periode</swp-kasse-stat-label>
</swp-kasse-stat>
<swp-kasse-stat class="highlight">
<swp-kasse-stat-value>186.450 kr</swp-kasse-stat-value>
<swp-kasse-stat-label>Total omsætning</swp-kasse-stat-label>
</swp-kasse-stat>
<swp-kasse-stat>
<swp-kasse-stat-value>42.340 kr</swp-kasse-stat-value>
<swp-kasse-stat-label>Kontantsalg</swp-kasse-stat-label>
</swp-kasse-stat>
<swp-kasse-stat class="warning">
<swp-kasse-stat-value>-75 kr</swp-kasse-stat-value>
<swp-kasse-stat-label>Samlet difference</swp-kasse-stat-label>
</swp-kasse-stat>
</swp-kasse-stats>
<!-- Stats for Dagens afstemning tab -->
<swp-kasse-stats data-for-tab="afstemning">
<swp-kasse-stat>
<swp-kasse-stat-value>47</swp-kasse-stat-value>
<swp-kasse-stat-label>Transaktioner i dag</swp-kasse-stat-label>
</swp-kasse-stat>
<swp-kasse-stat class="highlight">
<swp-kasse-stat-value>18.865 kr</swp-kasse-stat-value>
<swp-kasse-stat-label>Omsætning i dag</swp-kasse-stat-label>
</swp-kasse-stat>
<swp-kasse-stat>
<swp-kasse-stat-value>29. dec 17:45</swp-kasse-stat-value>
<swp-kasse-stat-label>Sidste afstemning</swp-kasse-stat-label>
</swp-kasse-stat>
<swp-kasse-stat>
<swp-kasse-stat-value>Anna J.</swp-kasse-stat-value>
<swp-kasse-stat-label>Åbnede kassen 29. dec 09:05</swp-kasse-stat-label>
</swp-kasse-stat>
</swp-kasse-stats>
</swp-kasse-header>
<!-- Tab Bar -->
<swp-tab-bar>
<swp-tab class="active" data-tab="oversigt">
<i class="ph ph-list-checks"></i>
Oversigt
</swp-tab>
<swp-tab data-tab="afstemning">
<i class="ph ph-cash-register"></i>
Kasseafstemning
</swp-tab>
</swp-tab-bar>
</swp-kasse-sticky-header>
<!-- Tab Content: Oversigt -->
<swp-tab-content data-tab="oversigt" class="active">
<swp-page-container>
@await Component.InvokeAsync("KasseFilterBar")
@await Component.InvokeAsync("KasseTable")
</swp-page-container>
</swp-tab-content>
<!-- Tab Content: Dagens Afstemning -->
<swp-tab-content data-tab="afstemning">
<swp-page-container>
<swp-kasse-grid>
<swp-kasse-column>
@await Component.InvokeAsync("KasseDagensTal")
@await Component.InvokeAsync("KasseKontanter")
@await Component.InvokeAsync("KasseDifference")
</swp-kasse-column>
<swp-kasse-column>
@await Component.InvokeAsync("KasseDagsoplysninger")
@await Component.InvokeAsync("KasseNote")
@await Component.InvokeAsync("KasseGodkendelse")
</swp-kasse-column>
</swp-kasse-grid>
<swp-system-note>Systemet gemmer hvornår og af hvem der er godkendt enkelt kontrolspor.</swp-system-note>
</swp-page-container>
</swp-tab-content>

View file

@ -24,7 +24,7 @@
<link rel="stylesheet" href="~/css/quick-stats.css"> <link rel="stylesheet" href="~/css/quick-stats.css">
<link rel="stylesheet" href="~/css/waitlist.css"> <link rel="stylesheet" href="~/css/waitlist.css">
<link rel="stylesheet" href="~/css/tabs.css"> <link rel="stylesheet" href="~/css/tabs.css">
<link rel="stylesheet" href="~/css/kasse.css"> <link rel="stylesheet" href="~/css/cash.css">
@await RenderSectionAsync("Styles", required: false) @await RenderSectionAsync("Styles", required: false)
</head> </head>
<body class="has-demo-banner"> <body class="has-demo-banner">

View file

@ -1,5 +1,5 @@
/** /**
* Kasse (Cash Register) - Page Styling * Cash Register - Page Styling
* *
* Filter bar, stats, table, forms, and difference box * Filter bar, stats, table, forms, and difference box
*/ */
@ -7,7 +7,7 @@
/* =========================================== /* ===========================================
STICKY HEADER CONTAINER STICKY HEADER CONTAINER
=========================================== */ =========================================== */
swp-kasse-sticky-header { swp-cash-sticky-header {
display: block; display: block;
position: sticky; position: sticky;
top: 0; top: 0;
@ -17,7 +17,7 @@ swp-kasse-sticky-header {
} }
/* Override tab-bar sticky when inside sticky header */ /* Override tab-bar sticky when inside sticky header */
swp-kasse-sticky-header swp-tab-bar { swp-cash-sticky-header swp-tab-bar {
position: static; position: static;
top: auto; top: auto;
} }
@ -25,7 +25,7 @@ swp-kasse-sticky-header swp-tab-bar {
/* =========================================== /* ===========================================
KASSE HEADER (Stats above tabs) KASSE HEADER (Stats above tabs)
=========================================== */ =========================================== */
swp-kasse-header { swp-cash-header {
display: block; display: block;
background: var(--color-surface); background: var(--color-surface);
border-bottom: 1px solid var(--color-border); border-bottom: 1px solid var(--color-border);
@ -82,7 +82,7 @@ swp-filter-spacer {
/* =========================================== /* ===========================================
KASSE STATS BAR KASSE STATS BAR
=========================================== */ =========================================== */
swp-kasse-stats { swp-cash-stats {
display: grid; display: grid;
grid-template-columns: repeat(4, 1fr); grid-template-columns: repeat(4, 1fr);
gap: var(--spacing-8); gap: var(--spacing-8);
@ -90,17 +90,17 @@ swp-kasse-stats {
margin: 0 auto; margin: 0 auto;
} }
swp-kasse-stats:not(.active) { swp-cash-stats:not(.active) {
display: none; display: none;
} }
swp-kasse-stat { swp-cash-stat {
background: var(--color-background-alt); background: var(--color-background-alt);
border-radius: var(--radius-lg); border-radius: var(--radius-lg);
padding: var(--spacing-6) var(--spacing-8); padding: var(--spacing-6) var(--spacing-8);
} }
swp-kasse-stat-value { swp-cash-stat-value {
display: block; display: block;
font-size: var(--font-size-2xl); font-size: var(--font-size-2xl);
font-weight: var(--font-weight-semibold); font-weight: var(--font-weight-semibold);
@ -108,26 +108,26 @@ swp-kasse-stat-value {
color: var(--color-text); color: var(--color-text);
} }
swp-kasse-stat-label { swp-cash-stat-label {
display: block; display: block;
font-size: var(--font-size-sm); font-size: var(--font-size-sm);
color: var(--color-text-secondary); color: var(--color-text-secondary);
margin-top: var(--spacing-2); margin-top: var(--spacing-2);
} }
swp-kasse-stat.highlight swp-kasse-stat-value { swp-cash-stat.highlight swp-cash-stat-value {
color: var(--color-teal); color: var(--color-teal);
} }
swp-kasse-stat.warning swp-kasse-stat-value { swp-cash-stat.warning swp-cash-stat-value {
color: var(--color-amber); color: var(--color-amber);
} }
swp-kasse-stat.negative swp-kasse-stat-value { swp-cash-stat.negative swp-cash-stat-value {
color: var(--color-red); color: var(--color-red);
} }
swp-kasse-stat.user swp-kasse-stat-value { swp-cash-stat.user swp-cash-stat-value {
color: var(--color-blue); color: var(--color-blue);
} }
@ -153,7 +153,7 @@ swp-selection-info {
/* =========================================== /* ===========================================
KASSE TABLE (Grid + Subgrid pattern) KASSE TABLE (Grid + Subgrid pattern)
=========================================== */ =========================================== */
swp-kasse-table { swp-cash-table {
display: grid; display: grid;
grid-template-columns: 50px 70px 60px minmax(140px, 1fr) 90px 100px 100px 110px 120px 40px; grid-template-columns: 50px 70px 60px minmax(140px, 1fr) 90px 100px 100px 110px 120px 40px;
background: var(--color-surface); background: var(--color-surface);
@ -162,28 +162,28 @@ swp-kasse-table {
overflow: hidden; overflow: hidden;
} }
swp-kasse-table-header, swp-cash-table-header,
swp-kasse-table-body { swp-cash-table-body {
display: grid; display: grid;
grid-column: 1 / -1; grid-column: 1 / -1;
grid-template-columns: subgrid; grid-template-columns: subgrid;
} }
swp-kasse-table-header { swp-cash-table-header {
background: var(--color-background-alt); background: var(--color-background-alt);
border-bottom: 1px solid var(--color-border); border-bottom: 1px solid var(--color-border);
padding: var(--spacing-6) var(--spacing-10); padding: var(--spacing-6) var(--spacing-10);
align-items: center; align-items: center;
} }
swp-kasse-table-row { swp-cash-table-row {
display: grid; display: grid;
grid-column: 1 / -1; grid-column: 1 / -1;
grid-template-columns: subgrid; grid-template-columns: subgrid;
align-items: center; align-items: center;
} }
swp-kasse-th { swp-cash-th {
font-size: var(--font-size-xs); font-size: var(--font-size-xs);
font-weight: var(--font-weight-semibold); font-weight: var(--font-weight-semibold);
text-transform: uppercase; text-transform: uppercase;
@ -191,76 +191,76 @@ swp-kasse-th {
color: var(--color-text-secondary); color: var(--color-text-secondary);
} }
swp-kasse-th.right { swp-cash-th.right {
text-align: right; text-align: right;
} }
swp-kasse-th.checkbox, swp-cash-th.checkbox,
swp-kasse-td.checkbox { swp-cash-td.checkbox {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
swp-kasse-table input[type="checkbox"] { swp-cash-table input[type="checkbox"] {
width: 16px; width: 16px;
height: 16px; height: 16px;
accent-color: var(--color-teal); accent-color: var(--color-teal);
cursor: pointer; cursor: pointer;
} }
swp-kasse-table-row { swp-cash-table-row {
padding: var(--spacing-7) var(--spacing-10); padding: var(--spacing-7) var(--spacing-10);
border-bottom: 1px solid var(--color-border); border-bottom: 1px solid var(--color-border);
cursor: pointer; cursor: pointer;
transition: background var(--transition-fast); transition: background var(--transition-fast);
} }
swp-kasse-table-row:last-child { swp-cash-table-row:last-child {
border-bottom: none; border-bottom: none;
} }
swp-kasse-table-row:hover { swp-cash-table-row:hover {
background: var(--color-background-hover); background: var(--color-background-hover);
} }
/* Draft row - clickable to go to Kasseafstemning */ /* Draft row - clickable to go to Kasseafstemning */
swp-kasse-table-row.draft-row { swp-cash-table-row.draft-row {
background: color-mix(in srgb, var(--color-amber) 5%, transparent); background: color-mix(in srgb, var(--color-amber) 5%, transparent);
cursor: pointer; cursor: pointer;
} }
swp-kasse-table-row.draft-row:hover { swp-cash-table-row.draft-row:hover {
background: color-mix(in srgb, var(--color-amber) 12%, transparent); background: color-mix(in srgb, var(--color-amber) 12%, transparent);
} }
swp-kasse-td { swp-cash-td {
font-size: var(--font-size-base); font-size: var(--font-size-base);
color: var(--color-text); color: var(--color-text);
} }
swp-kasse-td.right { swp-cash-td.right {
text-align: right; text-align: right;
} }
swp-kasse-td.mono { swp-cash-td.mono {
font-family: var(--font-mono); font-family: var(--font-mono);
} }
swp-kasse-td.muted { swp-cash-td.muted {
color: var(--color-text-secondary); color: var(--color-text-secondary);
font-size: var(--font-size-sm); font-size: var(--font-size-sm);
} }
swp-kasse-td.negative { swp-cash-td.negative {
color: var(--color-red); color: var(--color-red);
} }
swp-kasse-td.positive { swp-cash-td.positive {
color: var(--color-green); color: var(--color-green);
} }
swp-kasse-td.id { swp-cash-td.id {
font-size: var(--font-size-sm); font-size: var(--font-size-sm);
color: var(--color-text-secondary); color: var(--color-text-secondary);
font-family: var(--font-mono); font-family: var(--font-mono);
@ -301,7 +301,7 @@ swp-row-toggle i {
} }
/* Row detail - hidden by default */ /* Row detail - hidden by default */
swp-kasse-row-detail { swp-cash-row-detail {
grid-column: 1 / -1; grid-column: 1 / -1;
display: none; display: none;
overflow: hidden; overflow: hidden;
@ -309,7 +309,7 @@ swp-kasse-row-detail {
border-bottom: 1px solid var(--color-border); border-bottom: 1px solid var(--color-border);
} }
swp-kasse-row-detail.expanded { swp-cash-row-detail.expanded {
display: block; display: block;
} }
@ -336,7 +336,7 @@ swp-row-arrow i {
font-size: var(--font-size-lg); font-size: var(--font-size-lg);
} }
swp-kasse-table-footer { swp-cash-table-footer {
grid-column: 1 / -1; grid-column: 1 / -1;
display: flex; display: flex;
align-items: center; align-items: center;
@ -352,8 +352,8 @@ swp-kasse-table-footer {
STATUS BADGE STATUS BADGE
=========================================== */ =========================================== */
/* Center status column */ /* Center status column */
swp-kasse-th:nth-child(9), swp-cash-th:nth-child(9),
swp-kasse-td:nth-child(9) { swp-cash-td:nth-child(9) {
text-align: center; text-align: center;
} }
@ -388,19 +388,19 @@ swp-status-badge.draft {
/* =========================================== /* ===========================================
TWO-COLUMN GRID (Detail View) TWO-COLUMN GRID (Detail View)
=========================================== */ =========================================== */
swp-kasse-grid { swp-cash-grid {
display: grid; display: grid;
grid-template-columns: 1fr 1fr; grid-template-columns: 1fr 1fr;
gap: var(--spacing-12); gap: var(--spacing-12);
} }
@media (max-width: 900px) { @media (max-width: 900px) {
swp-kasse-grid { swp-cash-grid {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
} }
swp-kasse-column { swp-cash-column {
display: grid; display: grid;
gap: var(--spacing-10); gap: var(--spacing-10);
align-content: start; align-content: start;
@ -866,20 +866,20 @@ swp-system-note {
RESPONSIVE RESPONSIVE
=========================================== */ =========================================== */
@media (max-width: 1000px) { @media (max-width: 1000px) {
swp-kasse-stats { swp-cash-stats {
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
} }
/* Table columns defined on parent - subgrid inherits */ /* Table columns defined on parent - subgrid inherits */
swp-kasse-table { swp-cash-table {
grid-template-columns: 50px 80px 1fr 100px 110px 120px 40px; grid-template-columns: 50px 80px 1fr 100px 110px 120px 40px;
} }
/* Hide some columns on smaller screens */ /* Hide some columns on smaller screens */
swp-kasse-th:nth-child(3), swp-cash-th:nth-child(3),
swp-kasse-td:nth-child(3), swp-cash-td:nth-child(3),
swp-kasse-th:nth-child(6), swp-cash-th:nth-child(6),
swp-kasse-td:nth-child(6) { swp-cash-td:nth-child(6) {
display: none; display: none;
} }
} }

File diff suppressed because one or more lines are too long

View file

@ -9,7 +9,7 @@ import { DrawerController } from './modules/drawers';
import { ThemeController } from './modules/theme'; import { ThemeController } from './modules/theme';
import { SearchController } from './modules/search'; import { SearchController } from './modules/search';
import { LockScreenController } from './modules/lockscreen'; import { LockScreenController } from './modules/lockscreen';
import { KasseController } from './modules/kasse'; import { CashController } from './modules/cash';
/** /**
* Main application class * Main application class
@ -20,7 +20,7 @@ export class App {
readonly theme: ThemeController; readonly theme: ThemeController;
readonly search: SearchController; readonly search: SearchController;
readonly lockScreen: LockScreenController; readonly lockScreen: LockScreenController;
readonly kasse: KasseController; readonly cash: CashController;
constructor() { constructor() {
// Initialize controllers // Initialize controllers
@ -29,7 +29,7 @@ export class App {
this.theme = new ThemeController(); this.theme = new ThemeController();
this.search = new SearchController(); this.search = new SearchController();
this.lockScreen = new LockScreenController(this.drawers); this.lockScreen = new LockScreenController(this.drawers);
this.kasse = new KasseController(); this.cash = new CashController();
} }
} }

View file

@ -1,11 +1,11 @@
/** /**
* Kasse Controller * Cash Controller
* *
* Handles tab switching, cash calculations, and form interactions * Handles tab switching, cash calculations, and form interactions
* for the Kasse (Cash Register) page. * for the Cash Register page.
*/ */
export class KasseController { export class CashController {
// Base values (from system - would come from server in real app) // Base values (from system - would come from server in real app)
private readonly startBalance = 2000; private readonly startBalance = 2000;
private readonly cashSales = 3540; private readonly cashSales = 3540;
@ -42,7 +42,7 @@ export class KasseController {
private switchToTab(targetTab: string): void { private switchToTab(targetTab: string): void {
const tabs = document.querySelectorAll<HTMLElement>('swp-tab[data-tab]'); const tabs = document.querySelectorAll<HTMLElement>('swp-tab[data-tab]');
const contents = document.querySelectorAll<HTMLElement>('swp-tab-content[data-tab]'); const contents = document.querySelectorAll<HTMLElement>('swp-tab-content[data-tab]');
const statsBars = document.querySelectorAll<HTMLElement>('swp-kasse-stats[data-for-tab]'); const statsBars = document.querySelectorAll<HTMLElement>('swp-cash-stats[data-for-tab]');
// Update tab states // Update tab states
tabs.forEach(t => { tabs.forEach(t => {
@ -243,13 +243,13 @@ export class KasseController {
* Setup row toggle for expandable details * Setup row toggle for expandable details
*/ */
private setupRowToggle(): void { private setupRowToggle(): void {
const rows = document.querySelectorAll<HTMLElement>('swp-kasse-table-row[data-id]:not(.draft-row)'); const rows = document.querySelectorAll<HTMLElement>('swp-cash-table-row[data-id]:not(.draft-row)');
rows.forEach(row => { rows.forEach(row => {
const rowId = row.getAttribute('data-id'); const rowId = row.getAttribute('data-id');
if (!rowId) return; if (!rowId) return;
const detail = document.querySelector<HTMLElement>(`swp-kasse-row-detail[data-for="${rowId}"]`); const detail = document.querySelector<HTMLElement>(`swp-cash-row-detail[data-for="${rowId}"]`);
if (!detail) return; if (!detail) return;
row.addEventListener('click', (e) => { row.addEventListener('click', (e) => {
@ -260,11 +260,11 @@ export class KasseController {
const isExpanded = row.classList.contains('expanded'); const isExpanded = row.classList.contains('expanded');
// Close other expanded rows // Close other expanded rows
document.querySelectorAll('swp-kasse-table-row.expanded').forEach(r => { document.querySelectorAll('swp-cash-table-row.expanded').forEach(r => {
if (r !== row) { if (r !== row) {
const otherId = r.getAttribute('data-id'); const otherId = r.getAttribute('data-id');
if (otherId) { if (otherId) {
const otherDetail = document.querySelector<HTMLElement>(`swp-kasse-row-detail[data-for="${otherId}"]`); const otherDetail = document.querySelector<HTMLElement>(`swp-cash-row-detail[data-for="${otherId}"]`);
const otherIcon = r.querySelector('swp-row-toggle i'); const otherIcon = r.querySelector('swp-row-toggle i');
if (otherDetail && otherIcon) { if (otherDetail && otherIcon) {
this.collapseRow(r, otherDetail, otherIcon as HTMLElement); this.collapseRow(r, otherDetail, otherIcon as HTMLElement);
@ -353,10 +353,10 @@ export class KasseController {
} }
/** /**
* Setup draft row click to navigate to Kasseafstemning tab * Setup draft row click to navigate to reconciliation tab
*/ */
private setupDraftRowClick(): void { private setupDraftRowClick(): void {
const draftRow = document.querySelector<HTMLElement>('swp-kasse-table-row.draft-row'); const draftRow = document.querySelector<HTMLElement>('swp-cash-table-row.draft-row');
if (!draftRow) return; if (!draftRow) return;
draftRow.style.cursor = 'pointer'; draftRow.style.cursor = 'pointer';