Commit cb794784 authored by Clint Mourlevat's avatar Clint Mourlevat

Making Block Explorer for Address & Transaction Only

parent 8b6d6536
...@@ -403,3 +403,6 @@ fabric.properties ...@@ -403,3 +403,6 @@ fabric.properties
# Editor-based Rest Client # Editor-based Rest Client
.idea/httpRequests .idea/httpRequests
appsettings.Development.json
appsettings.json
\ No newline at end of file
using System;
using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using RestSharp;
using Stratis.Guru.Models;
using Stratis.Guru.Settings;
namespace Stratis.Guru.Controllers
{
[Route("block-explorer")]
public class BlockExplorerController : Controller
{
private readonly NakoApiSettings _nakoApiSettings;
public BlockExplorerController(IOptions<NakoApiSettings> nakoApiSettings)
{
_nakoApiSettings = nakoApiSettings.Value;
}
public IActionResult Index()
{
return View();
}
[Route("search")]
public IActionResult Search(SearchBlockExplorer searchBlockExplorer)
{
if (searchBlockExplorer.Query.Length == 34)
{
return RedirectToAction("Address", new {address = searchBlockExplorer.Query});
}
else if (searchBlockExplorer.Query.Length == 64)
{
return RedirectToAction("Transaction", new {transactionId = searchBlockExplorer.Query});
}
return Content("oh yeay");
}
[Route("block/{block}")]
public IActionResult Block(string block)
{
return View();
}
[Route("address/{address}")]
public IActionResult Address(string address)
{
var endpointClient = new RestClient($"{_nakoApiSettings.Endpoint}address/{address}/transactions");
var enpointRequest = new RestRequest(Method.GET);
var endpointResponse = endpointClient.Execute(enpointRequest);
return View(JsonConvert.DeserializeObject(endpointResponse.Content));
}
[Route("transaction/{transactionId}")]
public IActionResult Transaction(string transactionId)
{
var endpointClient = new RestClient($"{_nakoApiSettings.Endpoint}transaction/{transactionId}");
var enpointRequest = new RestRequest(Method.GET);
var endpointResponse = endpointClient.Execute(enpointRequest);
return View(JsonConvert.DeserializeObject(endpointResponse.Content));
}
}
}
\ No newline at end of file
...@@ -50,12 +50,6 @@ namespace Stratis.Guru.Controllers ...@@ -50,12 +50,6 @@ namespace Stratis.Guru.Controllers
return View(); return View();
} }
[Route("block-explorer")]
public IActionResult Explorer()
{
return View();
}
[Route("vanity")] [Route("vanity")]
public IActionResult Vanity() public IActionResult Vanity()
{ {
......
namespace Stratis.Guru.Models
{
public class SearchBlockExplorer
{
public string Query { get; set; }
}
}
\ No newline at end of file
namespace Stratis.Guru.Settings
{
public class NakoApiSettings
{
public string Endpoint { get; set; }
}
}
\ No newline at end of file
...@@ -16,6 +16,7 @@ using Microsoft.Extensions.FileProviders; ...@@ -16,6 +16,7 @@ using Microsoft.Extensions.FileProviders;
using Stratis.Guru.Hubs; using Stratis.Guru.Hubs;
using Stratis.Guru.Modules; using Stratis.Guru.Modules;
using Stratis.Guru.Services; using Stratis.Guru.Services;
using Stratis.Guru.Settings;
namespace Stratis.Guru namespace Stratis.Guru
{ {
...@@ -37,6 +38,7 @@ namespace Stratis.Guru ...@@ -37,6 +38,7 @@ namespace Stratis.Guru
options.CheckConsentNeeded = context => true; options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None; options.MinimumSameSitePolicy = SameSiteMode.None;
}); });
services.Configure<NakoApiSettings>(Configuration.GetSection("NakoApi"));
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
......
@model dynamic
@{
ViewBag.Title = "title";
Layout = "_Layout";
ViewBag.Query = Model.address;
}
<partial name="SearchBlock" model="@(new SearchBlockExplorer())" />
<section class="block-explorer-section">
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="center-heading">
<h2 class="section-title">Details for Address</h2>
</div>
</div>
@*<div class="offset-lg-3 col-lg-6">
<div class="center-text">
<p>Fusce placerat pretium mauris, vel sollicitudin elit lacinia vitae. Quisque sit amet nisi erat.</p>
</div>
</div>*@
</div>
<div class="row m-bottom-70">
<div class="col-lg-9 col-md-9 col-sm-12">
<div class="table-responsive">
<table class="table table-striped table-latests table-detail">
<tbody>
<tr>
<td><strong>Address</strong></td>
<td>
<a asp-controller="BlockExplorer" asp-action="Address" asp-route-address="@Model.address">@Model.address</a>
<a href="#" class="copy-me"><i class="fa fa-copy"></i></a>
</td>
</tr>
<tr>
<td><strong>No. Transactions</strong></td>
<td>@Model.transactions.Count</td>
</tr>
<tr>
<td><strong>Balance</strong></td>
<td>@Model.balance.ToString("N8") STRAT</td>
</tr>
<tr>
<td><strong>Unconfirmed Balance</strong></td>
<td>@Model.unconfirmedBalance.ToString("N8") STRAT</td>
</tr>
<tr>
<td><strong>Total Received</strong></td>
<td>@Model.totalReceived.ToString("N8") STRAT</td>
</tr>
<tr>
<td><strong>Total Sent</strong></td>
<td>@Model.totalSent.ToString("N8") STRAT</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="col-lg-3 col-md-3 col-sm-12">
<div class="qr">
<img src="@Url.Action("Qr", "Home", new {value=Model.address})" class="img-fluid d-block mx-auto" alt="">
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="center-heading">
<h2 class="section-title">Transactions</h2>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="table-responsive">
<table class="table table-striped table-latests">
<thead>
<tr>
<th>Hash</th>
<th>Block</th>
<th>Date/Time</th>
<th>Amount</th>
<th>Balance</th>
</tr>
</thead>
<tbody>
@foreach (var transaction in Model.transactions)
{
<tr>
<td><a asp-controller="BlockExplorer" asp-action="Transaction" asp-route-transactionId="@transaction.transactionHash">@transaction.transactionHash.ToString().Substring(0, 25)...</a></td>
<td><a asp-controller="BlockExplorer" asp-action="Block" asp-route-block="@transaction.blockIndex">@transaction.blockIndex</a></td>
<td>2018-04-13 10:14:27</td>
<td><span class="@(transaction.value > 0 ? "green":"red")">@transaction.value.ToString("N8") STRAT</span></td>
<td>@Model.balance.ToString("N8") STRAT</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
This diff is collapsed.
@model SearchBlockExplorer
<section class="block-explorer-wrapper" id="welcome-1">
<div class="block-explorer text">
<div class="container text-center">
<div class="row">
<div class="col-lg-12 align-self-center">
<h1>Stratis Blockchain Explorer</h1>
</div>
<div class="offset-lg-3 col-lg-6">
<p>Actual Stratis Blocks Height: 1039459</p>
</div>
</div>
</div>
</div>
<div class="search">
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="input-wrapper">
<form method="post" asp-controller="BlockExplorer" asp-action="Search" class="input">
<input type="text" asp-for="Query" value="@ViewBag.Query" placeholder="Enter for a block, hash, transaction, etc...">
<button type="submit">
<i class="fa fa-search"></i>
</button>
</form>
</div>
</div>
</div>
</div>
</div>
</section>
\ No newline at end of file
@model dynamic
@{
ViewBag.Title = "title";
Layout = "_Layout";
ViewBag.Query = Model.transactionId;
}
<partial name="SearchBlock" model="@(new SearchBlockExplorer())" />
<section class="block-explorer-section">
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="center-heading">
<h2 class="section-title">Details for Address</h2>
</div>
</div>
@*<div class="offset-lg-3 col-lg-6">
<div class="center-text">
<p>Fusce placerat pretium mauris, vel sollicitudin elit lacinia vitae. Quisque sit amet nisi erat.</p>
</div>
</div>*@
</div>
<div class="row m-bottom-70">
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="table-responsive">
<table class="table table-striped table-latests table-detail">
<tbody>
<tr>
<td><strong>Transaction ID</strong></td>
<td>
<a asp-controller="BlockExplorer" asp-action="Address" asp-route-address="@Model.address">@Model.transactionId</a>
<a href="#" class="copy-me"><i class="fa fa-copy"></i></a>
</td>
</tr>
<tr>
<td><strong>Block Hash</strong></td>
<td>
@Model.blockHash
</td>
</tr>
<tr>
<td><strong>Block Height</strong></td>
<td>
@Model.blockIndex
</td>
</tr>
<tr>
<td><strong>Confirmations</strong></td>
<td>
@Model.confirmations
</td>
</tr>
<tr>
<td><strong>Block Date/Time</strong></td>
<td>@Model.timestamp</td>
</tr>
<tr>
<td><strong>Total Output</strong></td>
<td>
@{
double totalOutpus = 0;
}
@foreach (var t in Model.outputs)
{
totalOutpus += (double)t.balance;
}
@totalOutpus.ToString("N8") STRAT
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="center-heading">
<h2 class="section-title">Inputs</h2>
</div>
</div>
</div>
<div class="row m-bottom-70">
<div class="col-lg-12">
<div class="table-responsive">
<table class="table table-striped table-latests">
<thead>
<tr>
<th>Index</th>
<th>Input Transaction ID</th>
</tr>
</thead>
<tbody>
@foreach (var input in Model.inputs)
{
<tr>
<td>@input.inputIndex</td>
<td><a asp-controller="BlockExplorer" asp-action="Transaction" asp-route-transactionId="@input.inputTransactionId">@input.inputTransactionId</a></td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="center-heading">
<h2 class="section-title">Outputs</h2>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="table-responsive">
<table class="table table-striped table-latests">
<thead>
<tr>
<th>Index</th>
<th>Output Address</th>
<th>Output Type</th>
<th>Amount</th>
</tr>
</thead>
<tbody>
@foreach (var output in Model.outputs)
{
<tr>
<td>@output.index</td>
<td><a asp-controller="BlockExplorer" asp-action="Address" asp-route-address="@output.address">@output.address</a></td>
<td>@output.outputType</td>
<td>@output.balance.ToString("N8") STRAT</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
...@@ -39,10 +39,11 @@ ...@@ -39,10 +39,11 @@
</a> </a>
<ul class="nav"> <ul class="nav">
<li><a asp-action="Index" asp-controller="Home"><i class="fa fa-home"></i> HOME</a></li> <li><a asp-action="Index" asp-controller="Home"><i class="fa fa-home"></i> HOME</a></li>
<li><a asp-action="Index" asp-controller="BlockExplorer"><i class="fa fa-cube"></i> BLOCK EXPLORER</a></li>
<li><a asp-action="Vanity" asp-controller="Home"><i class="fa fa-at"></i> VANITY</a></li> <li><a asp-action="Vanity" asp-controller="Home"><i class="fa fa-at"></i> VANITY</a></li>
<li><a asp-action="Generator" asp-controller="Home"><i class="fa fa-qrcode"></i> ADDRESS GENERATOR</a></li> <li><a asp-action="Generator" asp-controller="Home"><i class="fa fa-qrcode"></i> ADDRESS GENERATOR</a></li>
<li><a asp-action="About" asp-controller="Home"><i class="fa fa-info-circle"></i> ABOUT</a></li> <li><a asp-action="About" asp-controller="Home"><i class="fa fa-info-circle"></i> ABOUT STRATIS.GURU</a></li>
<li><a asp-action="Contact" asp-controller="Home"><i class="fa fa-envelope"></i> CONTACT</a></li> @*<li><a asp-action="Contact" asp-controller="Home"><i class="fa fa-envelope"></i> CONTACT</a></li>*@
</ul> </ul>
<a class='menu-trigger'> <a class='menu-trigger'>
<span>Menu</span> <span>Menu</span>
...@@ -54,7 +55,7 @@ ...@@ -54,7 +55,7 @@
</header> </header>
@RenderBody() @RenderBody()
<div id="crafted"> <div id="crafted">
<p class="text-center small">Proudly Crafted with 💖 by <a href="https://twitter.com/clint_network" target="_blank">Clint.Network</a> — Help me to maintain by sending some $STRAT at <a href="https://chainz.cryptoid.info/strat/address.dws?SR2ZXnhRnMqJNoeDiCFUnaug7TKHJocwDd.htm" target="_blank">SR2ZXnhRnMqJNoeDiCFUnaug7TKHJocwDd</a>.</p> <p class="text-center small">Proudly Crafted with 💖 by <a href="https://twitter.com/clint_network" target="_blank">Clint.Network</a> — Help me to maintain by sending some $STRAT at <a asp-controller="BlockExplorer" asp-action="Address" asp-route-address="SR2ZXnhRnMqJNoeDiCFUnaug7TKHJocwDd">SR2ZXnhRnMqJNoeDiCFUnaug7TKHJocwDd</a>.</p>
</div> </div>
<script src="~/js/jquery-2.1.0.min.js"></script> <script src="~/js/jquery-2.1.0.min.js"></script>
<script src="~/js/popper.js"></script> <script src="~/js/popper.js"></script>
......
...@@ -57,11 +57,13 @@ header, nav, section, article, aside, footer, hgroup { ...@@ -57,11 +57,13 @@ header, nav, section, article, aside, footer, hgroup {
html, body { html, body {
font-family: "Raleway", sans-serif; font-family: "Raleway", sans-serif;
font-weight: 400; font-weight: 400;
background: #1b1d20;
font-size: 16px; font-size: 16px;
-ms-text-size-adjust: 100%; -ms-text-size-adjust: 100%;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
background: #1b1d20 url("/images/prodnews-hero.png") fixed;
background-size: cover;
box-shadow: inset 0px 0px 10em rgba(0, 0, 0, 0.6);
} }
a { a {
...@@ -198,7 +200,13 @@ global styles ...@@ -198,7 +200,13 @@ global styles
} }
.table-striped tbody tr:nth-of-type(odd) { .table-striped tbody tr:nth-of-type(odd) {
background: #F3F8FF; background: rgba(95, 96, 99, 0.6);
}
.table td, .table th,
.table thead th {
border-top-color: transparent;
border-bottom-color: transparent;
} }
.section { .section {
...@@ -239,7 +247,7 @@ global styles ...@@ -239,7 +247,7 @@ global styles
.center-heading .section-title { .center-heading .section-title {
font-weight: 400; font-weight: 400;
font-size: 30px; font-size: 30px;
color: #3B566E; color: #EEEEEE;
letter-spacing: 1.30px; letter-spacing: 1.30px;
line-height: 40px; line-height: 40px;
margin-bottom: 20px; margin-bottom: 20px;
...@@ -306,7 +314,7 @@ global styles ...@@ -306,7 +314,7 @@ global styles
text-align: center; text-align: center;
font-weight: 400; font-weight: 400;
font-size: 16px; font-size: 16px;
color: #6F8BA4; color: #EEEEEE;
line-height: 28px; line-height: 28px;
letter-spacing: 1px; letter-spacing: 1px;
margin-bottom: 50px; margin-bottom: 50px;
...@@ -1420,9 +1428,6 @@ welcome area ...@@ -1420,9 +1428,6 @@ welcome area
.welcome-area { .welcome-area {
min-height: 100vh; min-height: 100vh;
position: relative; position: relative;
background-image: url("/images/prodnews-hero.png");
background-size: cover;
box-shadow: inset 0px 0px 10em rgba(0, 0, 0, 0.6);
} }
.welcome-area.bg-top-right:before { .welcome-area.bg-top-right:before {
...@@ -2542,7 +2547,6 @@ block explorer ...@@ -2542,7 +2547,6 @@ block explorer
height: 100%; height: 100%;
left: 0px; left: 0px;
top: 0px; top: 0px;
background: url(../images/dark-top-right-bg.png) top right no-repeat;
z-index: 3; z-index: 3;
} }
...@@ -2553,7 +2557,6 @@ block explorer ...@@ -2553,7 +2557,6 @@ block explorer
height: 100%; height: 100%;
left: 0px; left: 0px;
top: 0px; top: 0px;
background: url(../images/section-bg-bottom.png) bottom center no-repeat;
z-index: 3; z-index: 3;
} }
...@@ -2564,7 +2567,7 @@ block explorer ...@@ -2564,7 +2567,7 @@ block explorer
height: 100%; height: 100%;
left: 0px; left: 0px;
top: 0px; top: 0px;
background-image: linear-gradient(134deg, #0EB8D9 0%, #2CDDC9 100%); /*background-image: linear-gradient(134deg, #0EB8D9 0%, #2CDDC9 100%);*/
z-index: 2; z-index: 2;
} }
...@@ -2617,7 +2620,7 @@ block explorer ...@@ -2617,7 +2620,7 @@ block explorer
.block-explorer-wrapper .search .input-wrapper { .block-explorer-wrapper .search .input-wrapper {
padding: 40px; padding: 40px;
background: #fff; background: #44464a99;
box-shadow: 0 0 34px 0 rgba(63, 66, 87, 0.1); box-shadow: 0 0 34px 0 rgba(63, 66, 87, 0.1);
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
-moz-border-radius: 3px; -moz-border-radius: 3px;
...@@ -2637,8 +2640,11 @@ block explorer ...@@ -2637,8 +2640,11 @@ block explorer
width: 100%; width: 100%;
height: 100%; height: 100%;
outline: none; outline: none;
background: transparent;
border: none; border: none;
border: 1px solid #e6ecf5; /*border: 1px solid #e6ecf5;*/
border: 1px solid #0EB8D9;
color: #ffffff;
padding-left: 20px; padding-left: 20px;
padding-right: 20px; padding-right: 20px;
-webkit-transition: all 0.3s ease 0s; -webkit-transition: all 0.3s ease 0s;
...@@ -2781,11 +2787,12 @@ block explorer ...@@ -2781,11 +2787,12 @@ block explorer
.block-explorer-section { .block-explorer-section {
padding-top: 130px; padding-top: 130px;
padding-bottom: 70px;
} }
.block-explorer-section .table-latests { .block-explorer-section .table-latests {
background: #fff; background: #44464a99;
border: 1px solid #CEE1F8; border: 0;
} }
.block-explorer-section .table-latests.table-detail td { .block-explorer-section .table-latests.table-detail td {
...@@ -2795,31 +2802,31 @@ block explorer ...@@ -2795,31 +2802,31 @@ block explorer
.block-explorer-section .table-latests.table-detail strong { .block-explorer-section .table-latests.table-detail strong {
font-weight: 600; font-weight: 600;
font-size: 14px; font-size: 14px;
color: #3B566E; color: #EEEEEE;
letter-spacing: 1px; letter-spacing: 1px;
} }
.block-explorer-section .table-latests td { .block-explorer-section .table-latests td {
padding: 15px 15px; padding: 15px 15px;
border-top: 1px solid #CEE1F8;
} }
.block-explorer-section .table-latests thead { .block-explorer-section .table-latests thead {
font-weight: 600; font-weight: 600;
font-size: 14px; font-size: 14px;
color: #3B566E; color: #EEEEEE;
letter-spacing: 1px; letter-spacing: 1px;
} }
.block-explorer-section .table-latests tbody { .block-explorer-section .table-latests tbody {
font-weight: 400; font-weight: 400;
font-size: 14px; font-size: 14px;
color: #3B566E; color: #EEEEEE;
letter-spacing: 0.78px; letter-spacing: 0.78px;
} }
.block-explorer-section .table-latests tbody a { .block-explorer-section .table-latests tbody a:not(.copy-me) {
color: #256592; color: #EEEEEE;
border-bottom: 1px dotted #EEEEEE;
} }
.block-explorer-section .table-latests tbody .table-progress { .block-explorer-section .table-latests tbody .table-progress {
...@@ -2853,18 +2860,23 @@ block explorer ...@@ -2853,18 +2860,23 @@ block explorer
} }
.block-explorer-section .table-latests tbody span.red { .block-explorer-section .table-latests tbody span.red {
color: #c7254e; color: orangered;
} }
.block-explorer-section .table-latests tbody span.green { .block-explorer-section .table-latests tbody span.green {
color: #23A236; color: lawngreen;
} }
.block-explorer-section .qr { .block-explorer-section .qr {
border: 1px solid #CEE1F8; /*border: 1px solid #CEE1F8;
padding-top: 25px;
padding-bottom: 25px;
background: #fff; background: #fff;
padding-top: 25px;*/
padding-bottom: 25px;
}
.block-explorer-section .qr img {
width: 250px;
border: 20px solid white;
} }
@media (max-width: 991px) { @media (max-width: 991px) {
...@@ -3117,7 +3129,7 @@ header .nav a:hover::after { ...@@ -3117,7 +3129,7 @@ header .nav a:hover::after {
transform-origin: bottom left; transform-origin: bottom left;
} }
.qr img.qr
{ {
border: 10px solid white; border: 10px solid white;
width: 250px; width: 250px;
...@@ -3222,4 +3234,10 @@ h2 ...@@ -3222,4 +3234,10 @@ h2
[contenteditable="true"] * { [contenteditable="true"] * {
display: inline; display: inline;
white-space: nowrap; white-space: nowrap;
}
@media (min-width: 1200px) {
.container {
max-width: 1250px;
}
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment