u
This commit is contained in:
11
src/FrontOffice.Main/App.razor
Normal file
11
src/FrontOffice.Main/App.razor
Normal file
@@ -0,0 +1,11 @@
|
||||
<Router AppAssembly="@typeof(App).Assembly">
|
||||
<Found Context="routeData">
|
||||
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
|
||||
</Found>
|
||||
<NotFound>
|
||||
<PageTitle>Not found</PageTitle>
|
||||
<LayoutView Layout="@typeof(MainLayout)">
|
||||
<p role="alert">Sorry, there's nothing at this address.</p>
|
||||
</LayoutView>
|
||||
</NotFound>
|
||||
</Router>
|
||||
68
src/FrontOffice.Main/ConfigureServices.cs
Normal file
68
src/FrontOffice.Main/ConfigureServices.cs
Normal file
@@ -0,0 +1,68 @@
|
||||
using Blazored.LocalStorage;
|
||||
using Grpc.Core;
|
||||
using Grpc.Net.Client.Web;
|
||||
using Grpc.Net.Client;
|
||||
using MudBlazor.Services;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using FrontOffice.BFF.Package.Protobuf.Protos.Package;
|
||||
using FrontOffice.BFF.User.Protobuf.Protos.User;
|
||||
using FrontOffice.BFF.UserAddress.Protobuf.Protos.UserAddress;
|
||||
using FrontOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
|
||||
|
||||
namespace Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
public static class ConfigureServices
|
||||
{
|
||||
public static IServiceCollection AddCommonServices(this IServiceCollection services)
|
||||
{
|
||||
services.AddMudServices();
|
||||
services.AddBlazoredLocalStorage(config =>
|
||||
{
|
||||
config.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
|
||||
config.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
|
||||
config.JsonSerializerOptions.IgnoreReadOnlyProperties = true;
|
||||
config.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
|
||||
config.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
||||
config.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip;
|
||||
config.JsonSerializerOptions.WriteIndented = false;
|
||||
});
|
||||
return services;
|
||||
}
|
||||
|
||||
public static IServiceCollection AddGrpcServices(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
var baseUrl = configuration["GwUrl"];
|
||||
var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWeb, new HttpClientHandler()));
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(10); // TODO Check Timeout
|
||||
var serviceProvider = services.BuildServiceProvider();
|
||||
var channel = CreateAuthenticatedChannel(baseUrl, httpClient, serviceProvider);
|
||||
|
||||
services.AddSingleton(sp => new PackageContract.PackageContractClient(channel));
|
||||
services.AddSingleton(sp => new UserContract.UserContractClient(channel));
|
||||
services.AddSingleton(sp => new UserAddressContract.UserAddressContractClient(channel));
|
||||
services.AddSingleton(sp => new UserOrderContract.UserOrderContractClient(channel));
|
||||
|
||||
return services;
|
||||
}
|
||||
|
||||
private static GrpcChannel CreateAuthenticatedChannel(string address, HttpClient httpClient, IServiceProvider serviceProvider)
|
||||
{
|
||||
var credentials = CallCredentials.FromInterceptor(async (context, metadata) =>
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
});
|
||||
|
||||
// SslCredentials is used here because this channel is using TLS.
|
||||
// CallCredentials can't be used with ChannelCredentials.Insecure on non-TLS channels.
|
||||
var channel = GrpcChannel.ForAddress(address, new GrpcChannelOptions
|
||||
{
|
||||
UnsafeUseInsecureChannelCallCredentials = true,
|
||||
Credentials = ChannelCredentials.Create(new SslCredentials(), credentials),
|
||||
HttpClient = httpClient,
|
||||
MaxReceiveMessageSize = 1000 * 1024 * 1024, // 1 GB
|
||||
MaxSendMessageSize = 1000 * 1024 * 1024 // 1 GB
|
||||
});
|
||||
return channel;
|
||||
}
|
||||
}
|
||||
25
src/FrontOffice.Main/FrontOffice.Main.csproj
Normal file
25
src/FrontOffice.Main/FrontOffice.Main.csproj
Normal file
@@ -0,0 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Foursat.FrontOffice.BFF.Package.Protobuf" Version="0.0.112" />
|
||||
<PackageReference Include="Foursat.FrontOffice.BFF.User.Protobuf" Version="0.0.112" />
|
||||
<PackageReference Include="Foursat.FrontOffice.BFF.UserAddress.Protobuf" Version="0.0.112" />
|
||||
<PackageReference Include="Foursat.FrontOffice.BFF.UserOrder.Protobuf" Version="0.0.112" />
|
||||
<PackageReference Include="MudBlazor" Version="7.16.0" />
|
||||
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
|
||||
<PackageReference Include="Mapster" Version="7.4.0" />
|
||||
<PackageReference Include="Grpc.Net.Client.Web" Version="2.59.0" />
|
||||
<PackageReference Include="Grpc.Net.ClientFactory" Version="2.59.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Components\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
42
src/FrontOffice.Main/Pages/Error.cshtml
Normal file
42
src/FrontOffice.Main/Pages/Error.cshtml
Normal file
@@ -0,0 +1,42 @@
|
||||
@page
|
||||
@model FrontOffice.Main.Pages.ErrorModel
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
<title>Error</title>
|
||||
<link href="~/css/bootstrap/bootstrap.min.css" rel="stylesheet" />
|
||||
<link href="~/css/site.css" rel="stylesheet" asp-append-version="true" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="main">
|
||||
<div class="content px-4">
|
||||
<h1 class="text-danger">Error.</h1>
|
||||
<h2 class="text-danger">An error occurred while processing your request.</h2>
|
||||
|
||||
@if (Model.ShowRequestId)
|
||||
{
|
||||
<p>
|
||||
<strong>Request ID:</strong> <code>@Model.RequestId</code>
|
||||
</p>
|
||||
}
|
||||
|
||||
<h3>Development Mode</h3>
|
||||
<p>
|
||||
Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
|
||||
</p>
|
||||
<p>
|
||||
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
|
||||
It can result in displaying sensitive information from exceptions to end users.
|
||||
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
|
||||
and restarting the app.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
25
src/FrontOffice.Main/Pages/Error.cshtml.cs
Normal file
25
src/FrontOffice.Main/Pages/Error.cshtml.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace FrontOffice.Main.Pages;
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
[IgnoreAntiforgeryToken]
|
||||
public class ErrorModel : PageModel
|
||||
{
|
||||
public string? RequestId { get; set; }
|
||||
|
||||
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
||||
|
||||
private readonly ILogger<ErrorModel> _logger;
|
||||
|
||||
public ErrorModel(ILogger<ErrorModel> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public void OnGet()
|
||||
{
|
||||
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
|
||||
}
|
||||
}
|
||||
7
src/FrontOffice.Main/Pages/Index.razor
Normal file
7
src/FrontOffice.Main/Pages/Index.razor
Normal file
@@ -0,0 +1,7 @@
|
||||
@attribute [Route(RouteConstants.Main.MainPage)]
|
||||
|
||||
<PageTitle>خانه</PageTitle>
|
||||
|
||||
<h1>Hello, world!</h1>
|
||||
|
||||
Welcome to your new app.
|
||||
37
src/FrontOffice.Main/Pages/_Host.cshtml
Normal file
37
src/FrontOffice.Main/Pages/_Host.cshtml
Normal file
@@ -0,0 +1,37 @@
|
||||
@page "/"
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@namespace FrontOffice.Main.Pages
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="fa">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<base href="~/" />
|
||||
<link href="css/site.css" rel="stylesheet" />
|
||||
<link href="FrontOffice.Main.styles.css" rel="stylesheet" />
|
||||
<link rel="icon" type="image/png" href="favicon.png"/>
|
||||
<component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
|
||||
|
||||
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
|
||||
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet" />
|
||||
</head>
|
||||
<body>
|
||||
<component type="typeof(App)" render-mode="ServerPrerendered" />
|
||||
|
||||
<div id="blazor-error-ui">
|
||||
<environment include="Staging,Production">
|
||||
یک خطا رخ داده است. این برنامه ممکن است تا زمان بارگذاری مجدد پاسخگو نباشد.
|
||||
</environment>
|
||||
<environment include="Development">
|
||||
خطای مدیریتنشده ای اتفاق افتاده است. برای مشاهده جزئیات، ابزار توسعه (DevTools) مرورگر را بررسی نمایید.
|
||||
</environment>
|
||||
<a href="" class="reload">بارگذاری مجدد</a>
|
||||
<a class="dismiss">🗙</a>
|
||||
</div>
|
||||
|
||||
<script src="_framework/blazor.server.js"></script>
|
||||
<script src="_content/MudBlazor/MudBlazor.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
48
src/FrontOffice.Main/Program.cs
Normal file
48
src/FrontOffice.Main/Program.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using FrontOffice.Main.Utilities;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
builder.Services.AddRazorPages();
|
||||
builder.Services.AddServerSideBlazor();
|
||||
|
||||
#region AddCommonServices
|
||||
|
||||
builder.Services.AddCommonServices();
|
||||
|
||||
#endregion
|
||||
#region AddGrpcServices
|
||||
|
||||
builder.Services.AddGrpcServices(builder.Configuration);
|
||||
|
||||
#endregion
|
||||
|
||||
var appSettings = builder.Configuration.Get<AppSettings>();
|
||||
UrlUtility.DownloadUrl = appSettings.DownloadUrl;
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
if (!app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseExceptionHandler("/Error");
|
||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
||||
app.UseHsts();
|
||||
}
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.UseStaticFiles();
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
app.MapBlazorHub();
|
||||
app.MapFallbackToPage("/_Host");
|
||||
|
||||
app.Run();
|
||||
|
||||
|
||||
public class AppSettings
|
||||
{
|
||||
public string DownloadUrl { get; set; }
|
||||
}
|
||||
37
src/FrontOffice.Main/Properties/launchSettings.json
Normal file
37
src/FrontOffice.Main/Properties/launchSettings.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:59107",
|
||||
"sslPort": 44381
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "http://localhost:5268",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"https": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "https://localhost:7080;http://localhost:5268",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
16
src/FrontOffice.Main/Shared/MainLayout.razor
Normal file
16
src/FrontOffice.Main/Shared/MainLayout.razor
Normal file
@@ -0,0 +1,16 @@
|
||||
@inherits LayoutComponentBase
|
||||
|
||||
<PageTitle>فرصت</PageTitle>
|
||||
|
||||
<MudRTLProvider RightToLeft="true">
|
||||
<MudThemeProvider @ref="_mudThemeProvider" Theme="CustomMudTheme.CustomMudBlazorTheme" />
|
||||
<MudPopoverProvider/>
|
||||
<MudDialogProvider/>
|
||||
<MudSnackbarProvider/>
|
||||
<MudLayout>
|
||||
<MudMainContent>
|
||||
@Body
|
||||
</MudMainContent>
|
||||
</MudLayout>
|
||||
</MudRTLProvider>
|
||||
|
||||
12
src/FrontOffice.Main/Shared/MainLayout.razor.cs
Normal file
12
src/FrontOffice.Main/Shared/MainLayout.razor.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using Microsoft.JSInterop;
|
||||
using MudBlazor;
|
||||
|
||||
namespace FrontOffice.Main.Shared;
|
||||
public partial class MainLayout
|
||||
{
|
||||
private MudThemeProvider _mudThemeProvider;
|
||||
private async void Back()
|
||||
{
|
||||
await JSRuntime.InvokeVoidAsync("history.back");
|
||||
}
|
||||
}
|
||||
3
src/FrontOffice.Main/Shared/MainLayout.razor.css
Normal file
3
src/FrontOffice.Main/Shared/MainLayout.razor.css
Normal file
@@ -0,0 +1,3 @@
|
||||
body{
|
||||
|
||||
}
|
||||
39
src/FrontOffice.Main/Shared/NavMenu.razor
Normal file
39
src/FrontOffice.Main/Shared/NavMenu.razor
Normal file
@@ -0,0 +1,39 @@
|
||||
<div class="top-row ps-3 navbar navbar-dark">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="">FrontOffice.Main</a>
|
||||
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
|
||||
<nav class="flex-column">
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
|
||||
<span class="oi oi-home" aria-hidden="true"></span> Home
|
||||
</NavLink>
|
||||
</div>
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="counter">
|
||||
<span class="oi oi-plus" aria-hidden="true"></span> Counter
|
||||
</NavLink>
|
||||
</div>
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="fetchdata">
|
||||
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
|
||||
</NavLink>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
private bool collapseNavMenu = true;
|
||||
|
||||
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
|
||||
|
||||
private void ToggleNavMenu()
|
||||
{
|
||||
collapseNavMenu = !collapseNavMenu;
|
||||
}
|
||||
}
|
||||
182
src/FrontOffice.Main/Utilities/CustomMudTheme.cs
Normal file
182
src/FrontOffice.Main/Utilities/CustomMudTheme.cs
Normal file
@@ -0,0 +1,182 @@
|
||||
using MudBlazor;
|
||||
|
||||
namespace FrontOffice.Main.Utilities;
|
||||
|
||||
public static class CustomMudTheme
|
||||
{
|
||||
public static MudTheme CustomMudBlazorTheme { get; set; } = new()
|
||||
{
|
||||
PaletteLight = new PaletteLight()
|
||||
{
|
||||
Primary = "#0380C0",
|
||||
//Secondary = CustomColor.Secondary.Default,
|
||||
//Tertiary = CustomColor.Tertiary.Default,
|
||||
|
||||
Background = "#F5F5F5",
|
||||
AppbarBackground = "#F5F5F5",
|
||||
|
||||
//PrimaryContrastText = "#FFFFFF",
|
||||
//SecondaryContrastText = "#FFFFFF",
|
||||
//ErrorContrastText = "#FFFFFF",
|
||||
//SuccessContrastText = "#FFFFFF",
|
||||
//InfoContrastText = "#FFFFFF",
|
||||
//WarningContrastText = "#FFFFFF",
|
||||
TextPrimary = Colors.Gray.Darken3,
|
||||
|
||||
//// TextSecondary = "#FFFFFF",
|
||||
|
||||
//Error = CustomColor.Error.Default,
|
||||
//ErrorLighten = CustomColor.Error.Error100,
|
||||
|
||||
//// Info = "#3977AD",
|
||||
//InfoLighten = CustomColor.Info.Lighten,
|
||||
//InfoDarken = CustomColor.Info.Darken,
|
||||
|
||||
//// Success = "#05AF82",
|
||||
//SuccessDarken = CustomColor.Success.Darken,
|
||||
//SuccessLighten = CustomColor.Success.Lighten,
|
||||
|
||||
////Warning = "#EF7300",
|
||||
//WarningDarken = CustomColor.Warning.Lighten,
|
||||
//WarningLighten = CustomColor.Warning.Lighten,
|
||||
|
||||
//BackgroundGrey = CustomColor.Other.Background,
|
||||
//GrayDefault = CustomColor.Other.Background,
|
||||
//GrayDark = CustomColor.Gray.Gray10,
|
||||
//GrayLight = CustomColor.Gray.Gray60,
|
||||
//GrayLighter = CustomColor.Gray.Gray80,
|
||||
|
||||
|
||||
//TextDisabled = CustomColor.Other.DisableText,
|
||||
//ActionDisabled = CustomColor.Other.DisableText,
|
||||
//ActionDisabledBackground = CustomColor.Other.DisableBackground,
|
||||
|
||||
Surface = "#FFFFFF",
|
||||
Divider = "#B2BFCB",
|
||||
},
|
||||
|
||||
Typography = new Typography()
|
||||
{
|
||||
Default = new Default()
|
||||
{
|
||||
FontFamily = new[] { "Vazir" }
|
||||
},
|
||||
//Display/Large
|
||||
H1 = new H1()
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "3.5625rem",
|
||||
LineHeight = 4,
|
||||
FontWeight = 500,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
//Display/Medium
|
||||
H2 = new H2()
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "2.8125rem",
|
||||
LineHeight = 3.25,
|
||||
FontWeight = 500,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
//Display/Small
|
||||
H3 = new H3()
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "2.25rem",
|
||||
LineHeight = 2.75,
|
||||
FontWeight = 500,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
//Headline/Large
|
||||
H4 = new H4()
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "2rem",
|
||||
LineHeight = 2.5,
|
||||
FontWeight = 600,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
//Headline/Medium
|
||||
H5 = new H5()
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "1.75rem",
|
||||
LineHeight = 2.25,
|
||||
FontWeight = 600,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
//Headline/Small
|
||||
H6 = new H6()
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "1.5rem",
|
||||
LineHeight = 2,
|
||||
FontWeight = 600,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
Button = new Button
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "0.875rem",
|
||||
LineHeight = 1.75,
|
||||
FontWeight = 700,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
//Body/Large
|
||||
Body1 = new Body1
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "0.875rem",
|
||||
LineHeight = 1.75,
|
||||
FontWeight = 400,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
//Body/Medium
|
||||
Body2 = new Body2
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "0.875rem",
|
||||
LineHeight = 1.43,
|
||||
FontWeight = 400,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
//Body/small
|
||||
Overline = new Overline
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "0.75rem",
|
||||
LineHeight = 1.33,
|
||||
FontWeight = 400,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
//Title/Large
|
||||
Caption = new Caption
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "1.125rem",
|
||||
LineHeight = 1.714,
|
||||
FontWeight = 700,
|
||||
LetterSpacing = "0"
|
||||
},
|
||||
//Title/medium
|
||||
Subtitle1 = new Subtitle1
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "1rem",
|
||||
LineHeight = 1.5,
|
||||
FontWeight = 700,
|
||||
LetterSpacing = "0.009em"
|
||||
},
|
||||
//Title/small
|
||||
Subtitle2 = new Subtitle2
|
||||
{
|
||||
FontFamily = new[] { "Vazir" },
|
||||
FontSize = "0.875rem",
|
||||
LineHeight = 1.43,
|
||||
FontWeight = 700,
|
||||
LetterSpacing = "0.006em"
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
407
src/FrontOffice.Main/Utilities/Extensions.cs
Normal file
407
src/FrontOffice.Main/Utilities/Extensions.cs
Normal file
@@ -0,0 +1,407 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Text.RegularExpressions;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
|
||||
namespace FrontOffice.Main.Utilities;
|
||||
|
||||
public static class Extensions
|
||||
{
|
||||
public static string ExtractUserFriendlyMessage(this string errorMessage)
|
||||
{
|
||||
// کلیدواژهای که بعد از آن بخش مورد نظر شروع میشود
|
||||
string keyword = "Exception:";
|
||||
|
||||
// بررسی وجود کلیدواژه در پیام خطا
|
||||
int keywordIndex = errorMessage.IndexOf(keyword);
|
||||
|
||||
if (keywordIndex >= 0)
|
||||
{
|
||||
// استخراج بخش بعد از کلیدواژه
|
||||
string userFriendlyMessage = errorMessage.Substring(keywordIndex + keyword.Length).Trim();
|
||||
if (userFriendlyMessage.EndsWith(")"))
|
||||
{
|
||||
userFriendlyMessage = userFriendlyMessage.Substring(0, userFriendlyMessage.Length - 2);
|
||||
}
|
||||
return userFriendlyMessage;
|
||||
}
|
||||
|
||||
// اگر کلیدواژه وجود نداشت، کل پیام خطا برگردانده شود
|
||||
return errorMessage;
|
||||
}
|
||||
public static string DiffDateTime(this DateTime dateTime)
|
||||
{
|
||||
const int SECOND = 1;
|
||||
const int MINUTE = 60 * SECOND;
|
||||
const int HOUR = 60 * MINUTE;
|
||||
const int DAY = 24 * HOUR;
|
||||
const int MONTH = 30 * DAY;
|
||||
var ts = new TimeSpan(DateTime.Now.Ticks - dateTime.Ticks);
|
||||
double delta = Math.Abs(ts.TotalSeconds);
|
||||
if (delta < 1 * MINUTE)
|
||||
{
|
||||
return ts.Seconds == 1 ? "لحظه ای قبل" : ts.Seconds + " ثانیه قبل";
|
||||
}
|
||||
if (delta < 2 * MINUTE)
|
||||
{
|
||||
return "یک دقیقه قبل";
|
||||
}
|
||||
if (delta < 45 * MINUTE)
|
||||
{
|
||||
return ts.Minutes + " دقیقه قبل";
|
||||
}
|
||||
if (delta < 90 * MINUTE)
|
||||
{
|
||||
return "یک ساعت قبل";
|
||||
}
|
||||
if (delta < 24 * HOUR)
|
||||
{
|
||||
return ts.Hours + " ساعت قبل";
|
||||
}
|
||||
if (delta < 48 * HOUR)
|
||||
{
|
||||
return "دیروز";
|
||||
}
|
||||
if (delta < 30 * DAY)
|
||||
{
|
||||
return ts.Days + " روز قبل";
|
||||
}
|
||||
if (delta < 12 * MONTH)
|
||||
{
|
||||
int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
|
||||
return months <= 1 ? "یک ماه قبل" : months + " ماه قبل";
|
||||
}
|
||||
int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
|
||||
return years <= 1 ? "یک سال قبل" : years + " سال قبل";
|
||||
}
|
||||
public static string StripHtmlTags(this string html)
|
||||
{
|
||||
if (string.IsNullOrEmpty(html))
|
||||
return string.Empty;
|
||||
|
||||
// حذف تمامی تگهای HTML
|
||||
string textOnly = Regex.Replace(html, "<.*?>", string.Empty);
|
||||
|
||||
// تبدیل کاراکترهای HTML به متن معمولی (مثلاً -> فضای خالی)
|
||||
textOnly = WebUtility.HtmlDecode(textOnly);
|
||||
|
||||
return textOnly.Trim();
|
||||
}
|
||||
public static string ConfuseId(this string? value)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(value) && value.Length > 6)
|
||||
return string.Concat(value[..3], "*****", value.AsSpan(value.Length - 3, 3));
|
||||
else if (!string.IsNullOrWhiteSpace(value) && value.Length > 4)
|
||||
return string.Concat(value[..2], "*****", value.AsSpan(value.Length - 2, 2));
|
||||
else
|
||||
return value;
|
||||
}
|
||||
public static Timestamp DateTimeToTimestamp(this DateTime dateTime)
|
||||
{
|
||||
return Timestamp.FromDateTime(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc));
|
||||
}
|
||||
public static Timestamp? DateTimeToTimestamp(this DateTime? dateTime)
|
||||
{
|
||||
if (dateTime == null)
|
||||
return null;
|
||||
|
||||
return Timestamp.FromDateTime(DateTime.SpecifyKind(dateTime.Value, DateTimeKind.Utc));
|
||||
}
|
||||
//public static string ToThousands(this string numberString)
|
||||
//{
|
||||
// if (double.TryParse(numberString, out var number))
|
||||
// {
|
||||
// return string.Format("{0:#,###0.################}", number);
|
||||
// }
|
||||
|
||||
// return numberString;
|
||||
//}
|
||||
|
||||
public static string ToThousands(this string numberString)
|
||||
{
|
||||
if (double.TryParse(numberString, out var number))
|
||||
{
|
||||
// حذف اعشار
|
||||
var integerPart = Math.Truncate(number);
|
||||
|
||||
// فرمتبندی سه رقمی
|
||||
return string.Format("{0:#,###0}", integerPart);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (numberString.Split('.').Length > 1)
|
||||
return numberString.Split('.')[0];
|
||||
}
|
||||
|
||||
return numberString;
|
||||
}
|
||||
public static string ToThousands(this long number)
|
||||
{
|
||||
return number.ToString().ToThousands();
|
||||
}
|
||||
|
||||
public static string ToThousands(this long? number)
|
||||
{
|
||||
return number?.ToString().ToThousands();
|
||||
}
|
||||
|
||||
public static string ToThousands(this int number)
|
||||
{
|
||||
return number.ToString().ToThousands();
|
||||
}
|
||||
|
||||
public static string ToThousands(this int? number)
|
||||
{
|
||||
return number?.ToString().ToThousands();
|
||||
}
|
||||
|
||||
public static string ToThousands(this float number)
|
||||
{
|
||||
return number.ToString().ToThousands();
|
||||
}
|
||||
public static string ToThousands(this float? number)
|
||||
{
|
||||
return number?.ToString().ToThousands();
|
||||
}
|
||||
|
||||
public static string ToThousands(this double number)
|
||||
{
|
||||
return number.ToString().ToThousands();
|
||||
}
|
||||
|
||||
public static string ToThousands(this double? number)
|
||||
{
|
||||
return number?.ToString().ToThousands();
|
||||
}
|
||||
public static long ToIRT(this long number)
|
||||
{
|
||||
return (long)(number * 0.1);
|
||||
}
|
||||
public static string ToCurrencyUnitIRR(this string str) => str + " ریال";
|
||||
public static string ToCurrencyUnitIRT(this string str) => str + " تومان";
|
||||
public static string FaToAr(this string str) => str.Replace("ک", "ك").Replace("ی", "ي");
|
||||
public static string ArToFa(this string str) => str.Replace("ك", "ک").Replace("ي", "ی");
|
||||
|
||||
public static string Truncate(this string value, int maxLength, bool isAppendDots = false)
|
||||
{
|
||||
if (string.IsNullOrEmpty(value)) return value;
|
||||
return value.Length <= maxLength ? value : isAppendDots ? value.Substring(0, maxLength) + "..." : value.Substring(0, maxLength);
|
||||
}
|
||||
|
||||
public static string PersianToEnglish(this string persianStr)
|
||||
{
|
||||
return persianStr.Replace("۰", "0")
|
||||
.Replace("۱", "1")
|
||||
.Replace("۲", "2")
|
||||
.Replace("۳", "3")
|
||||
.Replace("۴", "4")
|
||||
.Replace("۵", "5")
|
||||
.Replace("۶", "6")
|
||||
.Replace("۷", "7")
|
||||
.Replace("۸", "8")
|
||||
.Replace("۹", "9");
|
||||
}
|
||||
|
||||
public static string GetDisplayName(this System.Enum enumValue)
|
||||
{
|
||||
return enumValue.GetType()
|
||||
.GetMember(enumValue.ToString())
|
||||
.First()
|
||||
.GetCustomAttribute<DisplayAttribute>()
|
||||
.GetName();
|
||||
}
|
||||
|
||||
public static async Task<string> ConvertIBrowserFileToBase64(this IBrowserFile? file)
|
||||
{
|
||||
if (file == null)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
const long maxAllowedSize = 1024 * 1024 * 200;
|
||||
var imageBuffers = new byte[file.Size];
|
||||
using (var stream = file.OpenReadStream(maxAllowedSize))
|
||||
{
|
||||
await stream.ReadAsync(imageBuffers);
|
||||
}
|
||||
return $"data:{file.ContentType};base64," + Convert.ToBase64String(imageBuffers);
|
||||
}
|
||||
|
||||
public static string GetNumberToPersianString(this string txt)
|
||||
{
|
||||
string RET = " ", STRVA = " ";
|
||||
string[] MainStr = STR_To_Int(txt);
|
||||
int Q = 0;
|
||||
for (int i = MainStr.Length - 1; i >= 0; i--)
|
||||
{
|
||||
STRVA = " ";
|
||||
if (RET != " " && RET != null)
|
||||
STRVA = " و ";
|
||||
if (string.IsNullOrWhiteSpace(Convert_STR(GETCountStr(MainStr[i]), Q)))
|
||||
RET = Convert_STR(GETCountStr(MainStr[i]), Q) + RET;
|
||||
else
|
||||
RET = Convert_STR(GETCountStr(MainStr[i]), Q) + STRVA + RET;
|
||||
|
||||
Q++;
|
||||
}
|
||||
|
||||
if (RET == " " || RET == null || RET == " ")
|
||||
RET = "صفر";
|
||||
return RET;
|
||||
}
|
||||
private static string[] STR_To_Int(string STR)
|
||||
{
|
||||
STR = GETCountStr(STR);
|
||||
string[] RET = new string[STR.Length / 3];
|
||||
int Q = 0;
|
||||
for (int I = 0; I < STR.Length; I += 3)
|
||||
{
|
||||
RET[Q] = STR.Substring(I, 3);
|
||||
Q++;
|
||||
}
|
||||
|
||||
return RET;
|
||||
}
|
||||
|
||||
private static string GETCountStr(string STR)
|
||||
{
|
||||
string RET = STR;
|
||||
int LEN = (STR.Length / 3 + 1) * 3 - STR.Length;
|
||||
if (LEN < 3)
|
||||
{
|
||||
for (int i = 0; i < LEN; i++)
|
||||
{
|
||||
RET = "0" + RET;
|
||||
}
|
||||
}
|
||||
|
||||
if (RET == "")
|
||||
return "000";
|
||||
return RET;
|
||||
}
|
||||
|
||||
private static string Convert_STR(string INT, int Count)
|
||||
{
|
||||
string RET = "";
|
||||
//یک صد
|
||||
if (Count == 0)
|
||||
{
|
||||
if (INT.Substring(1, 1) == "1" && INT.Substring(2, 1) != "0")
|
||||
{
|
||||
RET = GET_Number(3, Convert.ToInt32(INT.Substring(0, 1)), " ") + GET_Number(1, Convert.ToInt32(INT.Substring(2, 1)), "");
|
||||
}
|
||||
else
|
||||
{
|
||||
string STR = GET_Number(0, Convert.ToInt32(INT.Substring(2, 1)), "");
|
||||
RET = GET_Number(3, Convert.ToInt32(INT.Substring(0, 1)), GET_Number(2, Convert.ToInt32(INT.Substring(1, 1)), "") + STR) + GET_Number(2, Convert.ToInt32(INT.Substring(1, 1)), STR) + GET_Number(0, Convert.ToInt32(INT.Substring(2, 1)), "");
|
||||
}
|
||||
}
|
||||
//هزار
|
||||
else if (Count == 1)
|
||||
{
|
||||
RET = Convert_STR(INT, 0);
|
||||
if (string.IsNullOrWhiteSpace(RET))
|
||||
return string.Empty;
|
||||
RET += " هزار";
|
||||
}
|
||||
//میلیون
|
||||
else if (Count == 2)
|
||||
{
|
||||
RET = Convert_STR(INT, 0);
|
||||
if (string.IsNullOrWhiteSpace(RET))
|
||||
return string.Empty;
|
||||
RET += " میلیون";
|
||||
}
|
||||
//میلیارد
|
||||
else if (Count == 3)
|
||||
{
|
||||
RET = Convert_STR(INT, 0);
|
||||
if (string.IsNullOrWhiteSpace(RET))
|
||||
return string.Empty;
|
||||
RET += " میلیارد";
|
||||
}
|
||||
//میلیارد
|
||||
else if (Count == 4)
|
||||
{
|
||||
RET = Convert_STR(INT, 0);
|
||||
if (string.IsNullOrWhiteSpace(RET))
|
||||
return string.Empty;
|
||||
RET += " تیلیارد";
|
||||
}
|
||||
//میلیارد
|
||||
else if (Count == 5)
|
||||
{
|
||||
RET = Convert_STR(INT, 0);
|
||||
if (string.IsNullOrWhiteSpace(RET))
|
||||
return string.Empty;
|
||||
RET += " بیلیارد";
|
||||
}
|
||||
else
|
||||
{
|
||||
RET = Convert_STR(INT, 0);
|
||||
if (string.IsNullOrWhiteSpace(RET))
|
||||
return string.Empty;
|
||||
RET += Count.ToString();
|
||||
}
|
||||
|
||||
return RET;
|
||||
}
|
||||
|
||||
private static string GET_Number(int Count, int Number, string VA)
|
||||
{
|
||||
string RET = "";
|
||||
|
||||
if (VA != "" && VA != null)
|
||||
{
|
||||
VA = " و ";
|
||||
}
|
||||
|
||||
if (Count == 0 || Count == 1)
|
||||
{
|
||||
bool IsDah = Convert.ToBoolean(Count);
|
||||
string[] MySTR = new string[10];
|
||||
MySTR[1] = IsDah ? "یازده" : "یک" + VA;
|
||||
MySTR[2] = IsDah ? "دوازده" : "دو" + VA;
|
||||
MySTR[3] = IsDah ? "سیزده" : "سه" + VA;
|
||||
MySTR[4] = IsDah ? "چهارده" : "چهار" + VA;
|
||||
MySTR[5] = IsDah ? "پانزده" : "پنج" + VA;
|
||||
MySTR[6] = IsDah ? "شانزده" : "شش" + VA;
|
||||
MySTR[7] = IsDah ? "هفده" : "هفت" + VA;
|
||||
MySTR[8] = IsDah ? "هجده" : "هشت" + VA;
|
||||
MySTR[9] = IsDah ? "نوزده" : "نه" + VA;
|
||||
return MySTR[Number];
|
||||
}
|
||||
else if (Count == 2)
|
||||
{
|
||||
string[] MySTR = new string[10];
|
||||
MySTR[1] = "ده";
|
||||
MySTR[2] = "بیست" + VA;
|
||||
MySTR[3] = "سی" + VA;
|
||||
MySTR[4] = "چهل" + VA;
|
||||
MySTR[5] = "پنجاه" + VA;
|
||||
MySTR[6] = "شصت" + VA;
|
||||
MySTR[7] = "هفتاد" + VA;
|
||||
MySTR[8] = "هشتاد" + VA;
|
||||
MySTR[9] = "نود" + VA;
|
||||
return MySTR[Number];
|
||||
}
|
||||
else if (Count == 3)
|
||||
{
|
||||
string[] MySTR = new string[10];
|
||||
MySTR[1] = "یکصد" + VA;
|
||||
MySTR[2] = "دویست" + VA;
|
||||
MySTR[3] = "سیصد" + VA;
|
||||
MySTR[4] = "چهارصد" + VA;
|
||||
MySTR[5] = "پانصد" + VA;
|
||||
MySTR[6] = "ششصد" + VA;
|
||||
MySTR[7] = "هفتصد" + VA;
|
||||
MySTR[8] = "هشتصد" + VA;
|
||||
MySTR[9] = "نهصد" + VA;
|
||||
return MySTR[Number];
|
||||
}
|
||||
|
||||
return RET;
|
||||
}
|
||||
}
|
||||
9
src/FrontOffice.Main/Utilities/GlobalConstants.cs
Normal file
9
src/FrontOffice.Main/Utilities/GlobalConstants.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
namespace FrontOffice.Main.Utilities;
|
||||
|
||||
public static class GlobalConstants
|
||||
{
|
||||
public const string DateFormat = "MMM dd, yyyy";
|
||||
public const string DateTimeFormat = "MMM dd, yyyy - HH:mm";
|
||||
public const string SuccessMsg = "با موفقیت انجام شد";
|
||||
|
||||
}
|
||||
9
src/FrontOffice.Main/Utilities/RouteConstants.cs
Normal file
9
src/FrontOffice.Main/Utilities/RouteConstants.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
namespace FrontOffice.Main.Utilities;
|
||||
|
||||
public static class RouteConstants
|
||||
{
|
||||
public static class Main
|
||||
{
|
||||
public const string MainPage = "/";
|
||||
}
|
||||
}
|
||||
6
src/FrontOffice.Main/Utilities/UrlUtility.cs
Normal file
6
src/FrontOffice.Main/Utilities/UrlUtility.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace FrontOffice.Main.Utilities;
|
||||
|
||||
public static class UrlUtility
|
||||
{
|
||||
public static string DownloadUrl { get; set; }
|
||||
}
|
||||
18
src/FrontOffice.Main/_Imports.razor
Normal file
18
src/FrontOffice.Main/_Imports.razor
Normal file
@@ -0,0 +1,18 @@
|
||||
@using System.Net.Http
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@using Microsoft.AspNetCore.Components.Authorization
|
||||
@using Microsoft.AspNetCore.Components.Forms
|
||||
@using Microsoft.AspNetCore.Components.Routing
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||
@using Microsoft.JSInterop
|
||||
@using FrontOffice.Main
|
||||
@using FrontOffice.Main.Shared
|
||||
@using MudBlazor
|
||||
@using FrontOffice.Main.Utilities
|
||||
|
||||
|
||||
@inject NavigationManager Navigation
|
||||
@inject IDialogService DialogService
|
||||
@inject IJSRuntime JSRuntime
|
||||
@inject ISnackbar Snackbar
|
||||
9
src/FrontOffice.Main/appsettings.Development.json
Normal file
9
src/FrontOffice.Main/appsettings.Development.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"DetailedErrors": true,
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
12
src/FrontOffice.Main/appsettings.json
Normal file
12
src/FrontOffice.Main/appsettings.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
//"GwUrl": "https://afrinogw.afrino.co",
|
||||
"GwUrl": "https://localhost:34781",
|
||||
"DownloadUrl": "https://dl.afrino.co",
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
42
src/FrontOffice.Main/wwwroot/css/site.css
Normal file
42
src/FrontOffice.Main/wwwroot/css/site.css
Normal file
@@ -0,0 +1,42 @@
|
||||
/*#region Fonts*/
|
||||
|
||||
@font-face {
|
||||
font-family: 'Vazir';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url(../fonts/Vazir-Light.ttf) format('woff2');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Vazir';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url(../fonts/Vazir-Regular.ttf) format('woff2');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Vazir';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url(../fonts/Vazir-Medium.ttf) format('woff2');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Vazir';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url(../fonts/Vazir-Bold.ttf) format('woff2');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Vazir';
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url(../fonts/Vazir-Bold.ttf) format('woff2');
|
||||
}
|
||||
/*#endregion*/
|
||||
BIN
src/FrontOffice.Main/wwwroot/favicon.png
Normal file
BIN
src/FrontOffice.Main/wwwroot/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/FrontOffice.Main/wwwroot/fonts/Vazir-Bold.ttf
Normal file
BIN
src/FrontOffice.Main/wwwroot/fonts/Vazir-Bold.ttf
Normal file
Binary file not shown.
BIN
src/FrontOffice.Main/wwwroot/fonts/Vazir-Light.ttf
Normal file
BIN
src/FrontOffice.Main/wwwroot/fonts/Vazir-Light.ttf
Normal file
Binary file not shown.
BIN
src/FrontOffice.Main/wwwroot/fonts/Vazir-Medium.ttf
Normal file
BIN
src/FrontOffice.Main/wwwroot/fonts/Vazir-Medium.ttf
Normal file
Binary file not shown.
BIN
src/FrontOffice.Main/wwwroot/fonts/Vazir-Regular.ttf
Normal file
BIN
src/FrontOffice.Main/wwwroot/fonts/Vazir-Regular.ttf
Normal file
Binary file not shown.
BIN
src/FrontOffice.Main/wwwroot/fonts/Vazir-Thin.ttf
Normal file
BIN
src/FrontOffice.Main/wwwroot/fonts/Vazir-Thin.ttf
Normal file
Binary file not shown.
22
src/FrontOffice.sln
Normal file
22
src/FrontOffice.sln
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.0.31903.59
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FrontOffice.Main", "FrontOffice.Main\FrontOffice.Main.csproj", "{D9407E46-027D-4D44-B9FB-1F8DECB14270}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D9407E46-027D-4D44-B9FB-1F8DECB14270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D9407E46-027D-4D44-B9FB-1F8DECB14270}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D9407E46-027D-4D44-B9FB-1F8DECB14270}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D9407E46-027D-4D44-B9FB-1F8DECB14270}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
Reference in New Issue
Block a user