| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- @model LotteryWebApp.Models.UserTicketHistoryModel
- @using LotteryWebApp.Languages
- @using LotteryWebApp.Common
- @functions {
- public string FormatMoney(string amount) {
- if (string.IsNullOrEmpty(amount)) return "0";
- var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
- if (long.TryParse(clean, out long val)) {
- return val.ToString("#,##0", new System.Globalization.CultureInfo("vi-VN")).Replace(",", ".");
- }
- return amount;
- }
- }
- @if (Model != null && Model.listTicket != null && Model.listTicket.Count > 0)
- {
- foreach (var item in Model.listTicket)
- {
- <div class="ticket-card animate__animated animate__fadeInUp">
- <div class="ticket-card-top">
- <div class="ticket-header">
- <span class="ticket-id">#@item.seq</span>
- </div>
- <div class="ticket-numbers flex flex-wrap gap-2">
- @if (!string.IsNullOrEmpty(item.code))
- {
- var delimiters = new[] { ';', ',' };
- var balls = item.code.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
-
- // Prepare winning numbers for comparison
- var winningBalls = new HashSet<string>();
- if (!string.IsNullOrEmpty(item.termResult))
- {
- var winningSplit = item.termResult.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
- foreach (var wb in winningSplit) winningBalls.Add(wb.Trim());
- }
- foreach (var ball in balls)
- {
- var ballValue = ball.Trim();
- if (!string.IsNullOrEmpty(ballValue))
- {
- string ballClass = "";
- if (item.status == Constants.NOT_DRAW_CODE) {
- ballClass = "ball-waiting";
- } else if (winningBalls.Contains(ballValue)) {
- ballClass = "ball-win";
- } else {
- ballClass = "ball-lose";
- }
- // Map single-letter codes to full labels
- var displayValue = ballValue;
- var isLabel = false;
- switch (ballValue.ToUpper())
- {
- case "B": displayValue = "Big"; isLabel = true; break;
- case "S": displayValue = "Small"; isLabel = true; break;
- case "O": displayValue = "Odd"; isLabel = true; break;
- case "E": displayValue = "Even"; isLabel = true; break;
- }
- if (isLabel)
- {
- <div class="ticket-ball @ballClass" style="width: auto; min-width: 50px; padding: 2px 10px; border-radius: 16px; font-size: 13px;">@displayValue</div>
- }
- else
- {
- <div class="ticket-ball @ballClass">@displayValue</div>
- }
- }
- }
- }
- </div>
- </div>
- <div class="ticket-perforation"></div>
- <div class="ticket-card-bottom">
- <div class="ticket-info-grid">
- <div class="info-row">
- <span class="info-label">@Lang.millions_date_and_time</span>
- <span class="info-value">@item.createDate</span>
- </div>
- <div class="info-row">
- <span class="info-label">@Lang.millions_amount_won</span>
- <span class="info-value win-amount">@FormatMoney(item.moneyWin) HTG</span>
- </div>
- <div class="info-row">
- <span class="info-label">@Lang.millions_amount_played</span>
- <span class="info-value">@FormatMoney(item.money) HTG</span>
- </div>
- </div>
- <!-- Ticket Action: Detail Button -->
- <div class="mt-3 pt-3 border-t border-gray-100 flex justify-between items-center">
- <div class="flex items-center gap-1.5 text-gray-400">
- <i class="fa-solid fa-circle-info text-[12px]"></i>
- <span class="text-[10px] font-bold uppercase tracking-tight">@Lang.millions_tap_to_see_detail</span>
- </div>
- <button onclick="showTicketDetail('@item.billCode', '@item.money', '@item.moneyWin', '@item.createDate', '@item.channel', '@item.channelPayment', '@item.code', '@item.gameId', '@item.termRandomDate', '@item.id')"
- class="bg-[#00A3FF] text-white px-5 py-1.5 rounded-lg font-black text-[12px] shadow-[0_4px_10px_rgba(0,163,255,0.3)] active:scale-95 transition-all border-[1.5px] border-white uppercase tracking-wide">
- @Lang.millions_detail
- </button>
- </div>
- </div>
- </div>
- }
- @if (Model.totalPage != null && int.Parse(Model.totalPage) > 1)
- {
- var seq = int.Parse(Model.seqPage);
- var total = int.Parse(Model.totalPage);
- <div class="flex justify-center items-center gap-4 py-8 pb-32">
- <button onclick="changePage(currentSeqPage - 1)"
- class="p-2 px-6 bg-white rounded-xl shadow-sm font-bold text-gray-500 active:scale-95 transition-transform disabled:opacity-30 disabled:pointer-events-none"
- id="prevPage" @(seq <= 1 ? "disabled" : "")>
- <i class="fas fa-chevron-left mr-1"></i> Prev
- </button>
-
- <div class="flex flex-col items-center">
- <span class="text-[10px] text-gray-400 font-bold uppercase tracking-widest">Page</span>
- <span class="font-black text-[#0062FF] text-lg" id="pageDisplay">@Model.seqPage / @Model.totalPage</span>
- </div>
- <button onclick="changePage(currentSeqPage + 1)"
- class="p-2 px-6 bg-white rounded-xl shadow-sm font-bold text-gray-500 active:scale-95 transition-transform disabled:opacity-30 disabled:pointer-events-none"
- id="nextPage" @(seq >= total ? "disabled" : "")>
- Next <i class="fas fa-chevron-right ml-1"></i>
- </button>
- </div>
- <script>
- totalPages = parseInt('@Model.totalPage');
- </script>
- }
- else
- {
- <div class="w-full pb-32"></div>
- }
- }
- else
- {
- <div class="w-full py-24 flex flex-col items-center justify-center text-gray-400 opacity-60">
- <i class="fas fa-receipt text-5xl mb-4"></i>
- <p class="font-bold">@Lang.no_results_found</p>
- </div>
- }
|