diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3729ff0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..45d4fca --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,43 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch and Debug Standalone Blazor WebAssembly App", + "type": "blazorwasm", + "request": "launch", + "cwd": "${workspaceFolder}", + "url": "http://localhost:5254;http://192.168.190.123:5254" // Tell launch where to find site + }, + { + "name": "Watch", + "type": "coreclr", + "request": "launch", + "cwd": "${workspaceFolder}/DocuMed.PWA", + "program": "dotnet", + "args": [ + "watch", + "--project", + ".", + "--verbose" // Let's us confirm browser connects with hot reload capabilities + ], + "preLaunchTask": "build" // Ensure we don't watch an unbuilt site + }, + { + "name": "Attach", + "type": "blazorwasm", + "request": "attach", + "cwd": "${workspaceFolder}", + "url": "http://localhost:5254;http://192.168.190.123:5254", // Tell launch where to find site + "timeout": 120000, // Allows time for the site to launch + } + ], + "compounds": [ + { + "name": "Debug with Hot Reload", + "configurations": [ "Watch", "Attach" ] + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..1e37ba5 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/DocuMed.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/DocuMed.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/DocuMed.sln" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/DocuMed.Api/Controllers/WeatherForecastController.cs b/DocuMed.Api/Controllers/WeatherForecastController.cs new file mode 100644 index 0000000..2d039df --- /dev/null +++ b/DocuMed.Api/Controllers/WeatherForecastController.cs @@ -0,0 +1,33 @@ +using Microsoft.AspNetCore.Mvc; + +namespace DocuMed.Api.Controllers +{ + [ApiController] + [Route("[controller]")] + public class WeatherForecastController : ControllerBase + { + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet(Name = "GetWeatherForecast")] + public IEnumerable Get() + { + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }) + .ToArray(); + } + } +} \ No newline at end of file diff --git a/DocuMed.Api/Dockerfile b/DocuMed.Api/Dockerfile new file mode 100644 index 0000000..e3b4132 --- /dev/null +++ b/DocuMed.Api/Dockerfile @@ -0,0 +1,21 @@ +#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base +WORKDIR /app +EXPOSE 80 + +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +WORKDIR /src +COPY ["DocuMed.Api/DocuMed.Api.csproj", "DocuMed.Api/"] +RUN dotnet restore "DocuMed.Api/DocuMed.Api.csproj" +COPY . . +WORKDIR "/src/DocuMed.Api" +RUN dotnet build "DocuMed.Api.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "DocuMed.Api.csproj" -c Release -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "DocuMed.Api.dll"] \ No newline at end of file diff --git a/DocuMed.Api/DocuMed.Api.csproj b/DocuMed.Api/DocuMed.Api.csproj new file mode 100644 index 0000000..3102210 --- /dev/null +++ b/DocuMed.Api/DocuMed.Api.csproj @@ -0,0 +1,56 @@ + + + + net7.0 + enable + enable + Linux + ..\docker-compose.dcproj + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.Api/Program.cs b/DocuMed.Api/Program.cs new file mode 100644 index 0000000..df2434c --- /dev/null +++ b/DocuMed.Api/Program.cs @@ -0,0 +1,23 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +builder.Services.AddControllers(); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); diff --git a/DocuMed.Api/Properties/launchSettings.json b/DocuMed.Api/Properties/launchSettings.json new file mode 100644 index 0000000..be7d3b9 --- /dev/null +++ b/DocuMed.Api/Properties/launchSettings.json @@ -0,0 +1,40 @@ +{ + "profiles": { + "http": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:5288" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Docker": { + "commandName": "Docker", + "launchBrowser": true, + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", + "environmentVariables": { + "ASPNETCORE_URLS": "http://+:80" + }, + "publishAllPorts": true + } + }, + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:29584", + "sslPort": 0 + } + } +} \ No newline at end of file diff --git a/DocuMed.Api/WeatherForecast.cs b/DocuMed.Api/WeatherForecast.cs new file mode 100644 index 0000000..836e493 --- /dev/null +++ b/DocuMed.Api/WeatherForecast.cs @@ -0,0 +1,13 @@ +namespace DocuMed.Api +{ + public class WeatherForecast + { + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } + } +} \ No newline at end of file diff --git a/DocuMed.Api/appsettings.Development.json b/DocuMed.Api/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/DocuMed.Api/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/DocuMed.Api/appsettings.json b/DocuMed.Api/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/DocuMed.Api/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/DocuMed.Common/CommonConfig.cs b/DocuMed.Common/CommonConfig.cs new file mode 100644 index 0000000..64faf90 --- /dev/null +++ b/DocuMed.Common/CommonConfig.cs @@ -0,0 +1,7 @@ +namespace DocuMed.Common +{ + public class CommonConfig + { + + } +} \ No newline at end of file diff --git a/DocuMed.Common/DocuMed.Common.csproj b/DocuMed.Common/DocuMed.Common.csproj new file mode 100644 index 0000000..2bea165 --- /dev/null +++ b/DocuMed.Common/DocuMed.Common.csproj @@ -0,0 +1,23 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + + + + + + + diff --git a/DocuMed.Common/Extensions/AssertExtensions.cs b/DocuMed.Common/Extensions/AssertExtensions.cs new file mode 100644 index 0000000..b05c9d0 --- /dev/null +++ b/DocuMed.Common/Extensions/AssertExtensions.cs @@ -0,0 +1,30 @@ +using System.Collections; + +namespace DocuMed.Common.Extensions +{ + public static class AssertExtensions + { + public static void NotNull(T obj, string name, string message = null) + where T : class + { + if (obj is null) + throw new ArgumentNullException($"{name} : {typeof(T)}", message); + } + + public static void NotNull(T? obj, string name, string message = null) + where T : struct + { + if (!obj.HasValue) + throw new ArgumentNullException($"{name} : {typeof(T)}", message); + } + + public static void NotEmpty(T obj, string name, string message = null, T defaultValue = null) + where T : class + { + if (obj == defaultValue + || obj is string str && string.IsNullOrWhiteSpace(str) + || obj is IEnumerable list && !list.Cast().Any()) + throw new ArgumentException("Argument is empty : " + message, $"{name} : {typeof(T)}"); + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Extensions/ClassDisplayExtensions.cs b/DocuMed.Common/Extensions/ClassDisplayExtensions.cs new file mode 100644 index 0000000..5cf0cee --- /dev/null +++ b/DocuMed.Common/Extensions/ClassDisplayExtensions.cs @@ -0,0 +1,39 @@ +using DocuMed.Common.Models.Entity; + +namespace DocuMed.Common.Extensions +{ + public static class ClassDisplayExtensions + { + public static string GetDisplayAttributeName() + { + var attrs = + Attribute.GetCustomAttributes(typeof(T)); + + foreach (var attr in attrs) + { + var displayAttribute = attr as ClassDisplay; + if (displayAttribute == null) + continue; + return displayAttribute.GetName(); + } + + return null; + } + + public static string GetDisplayAttributeDescription() + { + var attrs = + Attribute.GetCustomAttributes(typeof(T)); + + foreach (var attr in attrs) + { + var displayAttribute = attr as ClassDisplay; + if (displayAttribute == null) + continue; + return displayAttribute.GetDescription(); + } + + return null; + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Extensions/DateTimeExtensions.cs b/DocuMed.Common/Extensions/DateTimeExtensions.cs new file mode 100644 index 0000000..a01522a --- /dev/null +++ b/DocuMed.Common/Extensions/DateTimeExtensions.cs @@ -0,0 +1,59 @@ +namespace DocuMed.Common.Extensions +{ + public static class DateTimeExtensions + { + public static string GetPersianDayOfWeek(this DayOfWeek dayOfWeek) + { + switch (dayOfWeek) + { + case DayOfWeek.Friday: + return "جمعه"; + case DayOfWeek.Monday: + return "دوشنبه"; + case DayOfWeek.Saturday: + return "شنبه"; + case DayOfWeek.Sunday: + return "یکشنبه"; + case DayOfWeek.Thursday: + return "پنج شنبه"; + case DayOfWeek.Tuesday: + return "سه شنبه"; + case DayOfWeek.Wednesday: + return "چهارشنبه"; + } + + return ""; + } + + public static DateTime UnixTimeStampToDateTime(double unixTimeStamp) + { + // Unix timestamp is seconds past epoch + var dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + dtDateTime = dtDateTime.AddMilliseconds(unixTimeStamp).ToLocalTime(); + return dtDateTime; + } + + public static long DateTimeToUnixTimeStamp(DateTime dateTime) + { + return ((DateTimeOffset)dateTime).ToUnixTimeMilliseconds(); + } + + public static int DifferenceByDay(DateTime originDateTime, DateTime destDateTime) + { + return (int)(destDateTime - originDateTime).TotalDays; + } + + public static int DifferenceByHoure(DateTime originDateTime, DateTime destDateTime) + { + return (int)(destDateTime - originDateTime).TotalHours; + } + + public static TimeSpan Difference(DateTime originDateTime, DateTime destDateTime) + { + var durateion = (destDateTime - originDateTime).Duration(); + return durateion; + } + public static PersianDateTime ToPersianDateTime(this DateTime dateTime) + => new PersianDateTime(dateTime); + } +} \ No newline at end of file diff --git a/DocuMed.Common/Extensions/EnumExtensions.cs b/DocuMed.Common/Extensions/EnumExtensions.cs new file mode 100644 index 0000000..a1179e2 --- /dev/null +++ b/DocuMed.Common/Extensions/EnumExtensions.cs @@ -0,0 +1,54 @@ +using System.Reflection; + +namespace DocuMed.Common.Extensions +{ + public enum DisplayProperty + { + Description, + GroupName, + Name, + Prompt, + ShortName, + Order + } + + public static class EnumExtensions + { + public static IEnumerable GetEnumValues(this T input) where T : struct + { + if (!typeof(T).IsEnum) + throw new NotSupportedException(); + + return Enum.GetValues(input.GetType()).Cast(); + } + + public static IEnumerable GetEnumFlags(this T input) where T : struct + { + if (!typeof(T).IsEnum) + throw new NotSupportedException(); + + foreach (var value in Enum.GetValues(input.GetType())) + if ((input as Enum).HasFlag(value as Enum)) + yield return (T)value; + } + + public static string ToDisplay(this Enum value, DisplayProperty property = DisplayProperty.Name) + { + AssertExtensions.NotNull(value, nameof(value)); + + var attribute = value.GetType().GetField(value.ToString()) + .GetCustomAttributes(false).FirstOrDefault(); + + if (attribute == null) + return value.ToString(); + + var propValue = attribute.GetType().GetProperty(property.ToString()).GetValue(attribute, null); + return propValue.ToString(); + } + + public static Dictionary ToDictionary(this Enum value) + { + return Enum.GetValues(value.GetType()).Cast().ToDictionary(p => Convert.ToInt32(p), q => ToDisplay(q)); + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Extensions/NewtonJsonExtensions.cs b/DocuMed.Common/Extensions/NewtonJsonExtensions.cs new file mode 100644 index 0000000..78f64f4 --- /dev/null +++ b/DocuMed.Common/Extensions/NewtonJsonExtensions.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace DocuMed.Common.Extensions +{ + public static class NewtonJsonExtensions + { + public static JsonSerializerSettings CamelCaseSerialize => + new() + { + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy() + }, + Formatting = Formatting.Indented + }; + } +} \ No newline at end of file diff --git a/DocuMed.Common/Extensions/PhoneNumberExtensions.cs b/DocuMed.Common/Extensions/PhoneNumberExtensions.cs new file mode 100644 index 0000000..dba26e3 --- /dev/null +++ b/DocuMed.Common/Extensions/PhoneNumberExtensions.cs @@ -0,0 +1,41 @@ +using System.Text.RegularExpressions; + +namespace DocuMed.Common.Extensions; +public static class PhoneNumberExtensions +{ + public static bool CheckPhoneNumber(string phoneNumber) + { + var regex = new Regex(@"(^(989|0989|\+989|09|9)[0-9]{9}$)"); + return regex.IsMatch(phoneNumber); + } + public static string GetVerifyFromPhoneNumber(string phoneNumber) + { + var dateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute / 5, 0); + var timeStamp = ((DateTimeOffset)dateTime).ToUnixTimeMilliseconds() / 10000; + + int FTD = int.Parse(string.Format("{0}{1}{2}", + GetSumDigit(int.Parse(string.Format("{0}{1}{2}", phoneNumber[5], phoneNumber[7], phoneNumber[9]))) % 10, + GetSumDigit(int.Parse(string.Format("{0}{1}{2}", phoneNumber[4], phoneNumber[6], phoneNumber[8]))) % 10, + GetSumDigit(int.Parse(string.Format("{0}{1}{2}", phoneNumber[10], phoneNumber[9], phoneNumber[8]))) % 10)); + int ATD = GetSumDigit(((int)timeStamp % 1000) + FTD); + timeStamp = (int)timeStamp / 1000; + int BTD = GetSumDigit(((int)timeStamp % 1000) + ATD); + timeStamp = (int)timeStamp / 1000; + int CTD = GetSumDigit(((int)timeStamp % 1000) + ATD); + FTD = GetSumDigit(FTD); + if (ATD % 2 == 0) + return string.Format("{0}{1}{2}{3}", GetSumDigit(ATD) % 10, GetSumDigit(BTD) % 10, GetSumDigit(CTD) % 10, GetSumDigit(FTD) % 10); + else + return string.Format("{0}{1}{2}{3}", ATD % 10, BTD % 10, CTD % 10, FTD % 10); + } + private static int GetSumDigit(int number) + { + string sNumber = number.ToString(); + int total = 0; + foreach (var s in sNumber) + total += int.Parse(s.ToString()); + return total; + } + + +} \ No newline at end of file diff --git a/DocuMed.Common/Extensions/PropertyExtensions.cs b/DocuMed.Common/Extensions/PropertyExtensions.cs new file mode 100644 index 0000000..87852a4 --- /dev/null +++ b/DocuMed.Common/Extensions/PropertyExtensions.cs @@ -0,0 +1,16 @@ +using System.Reflection; + +namespace DocuMed.Common.Extensions +{ + public static class PropertyExtensions + { + public static string GetPropertyDisplayName(this MemberInfo propertyExpression) + { + var memberInfo = propertyExpression; + var attr = memberInfo.GetCustomAttributes().FirstOrDefault(); + if (attr == null) return memberInfo.Name; + + return attr.Name; + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Extensions/RandomExtensions.cs b/DocuMed.Common/Extensions/RandomExtensions.cs new file mode 100644 index 0000000..edd70e2 --- /dev/null +++ b/DocuMed.Common/Extensions/RandomExtensions.cs @@ -0,0 +1,12 @@ +namespace DocuMed.Common.Extensions +{ + public static class RandomExtensions + { + public static T RandomItem(List originList) + { + var random = new Random(DateTime.Now.Millisecond); + var rand = random.Next(0, originList.Count - 1); + return originList[rand]; + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Extensions/StringExtensions.cs b/DocuMed.Common/Extensions/StringExtensions.cs new file mode 100644 index 0000000..d935650 --- /dev/null +++ b/DocuMed.Common/Extensions/StringExtensions.cs @@ -0,0 +1,165 @@ +namespace DocuMed.Common.Extensions +{ + public static class StringExtensions + { + public static string ToPriceWhitPriceType(this long price, string priceType) + { + return price.ToString("N0") + " " + priceType; + } + + public static string ToPriceWhitPriceType(this decimal price, string priceType) + { + return price.ToString("N0") + " " + priceType; + } + + public static string ToPriceWhitPriceType(this double price, string priceType) + { + return price.ToString("N0") + " " + priceType; + } + + public static bool HasValue(this string value, bool ignoreWhiteSpace = true) + { + return ignoreWhiteSpace ? !string.IsNullOrWhiteSpace(value) : !string.IsNullOrEmpty(value); + } + + public static int ToInt(this string value) + { + return Convert.ToInt32(value); + } + + public static decimal ToDecimal(this string value) + { + return Convert.ToDecimal(value); + } + + public static string ToNumeric(this int value) + { + return value.ToString("N0"); //"123,456" + } + + public static string ToNumeric(this decimal value) + { + return value.ToString("N0"); + } + + public static string ToCurrency(this int value) + { + //fa-IR => current culture currency symbol => ریال + //123456 => "123,123ریال" + return value.ToString("C0"); + } + + public static string ToCurrency(this decimal value) + { + return value.ToString("C0"); + } + + public static string En2Fa(this string str) + { + return str.Replace("0", "۰") + .Replace("1", "۱") + .Replace("2", "۲") + .Replace("3", "۳") + .Replace("4", "۴") + .Replace("5", "۵") + .Replace("6", "۶") + .Replace("7", "۷") + .Replace("8", "۸") + .Replace("9", "۹"); + } + + public static string Fa2En(this string str) + { + return str.Replace("۰", "0") + .Replace("۱", "1") + .Replace("۲", "2") + .Replace("۳", "3") + .Replace("۴", "4") + .Replace("۵", "5") + .Replace("۶", "6") + .Replace("۷", "7") + .Replace("۸", "8") + .Replace("۹", "9") + //iphone numeric + .Replace("٠", "0") + .Replace("١", "1") + .Replace("٢", "2") + .Replace("٣", "3") + .Replace("٤", "4") + .Replace("٥", "5") + .Replace("٦", "6") + .Replace("٧", "7") + .Replace("٨", "8") + .Replace("٩", "9"); + } + + public static string FixPersianChars(this string str) + { + return str.Replace("ﮎ", "ک") + .Replace("ﮏ", "ک") + .Replace("ﮐ", "ک") + .Replace("ﮑ", "ک") + .Replace("ك", "ک") + .Replace("ي", "ی") + .Replace(" ", " ") + .Replace("‌", " ") + .Replace("ھ", "ه"); //.Replace("ئ", "ی"); + } + + public static string CleanString(this string str) + { + return str.Trim().FixPersianChars().Fa2En().NullIfEmpty(); + } + + public static string NullIfEmpty(this string str) + { + return str?.Length == 0 ? null : str; + } + + public static string GetId(int length = 8) + { + return Guid.NewGuid().ToString("N").Substring(0, length); + } + + public static string ConvertTo3Digit(this string str) + { + str = string.Concat(str.Split(',')); + var array = str.ToCharArray(); + Array.Reverse(array); + str = new string(array); + + var newStr = ""; + for (var i = 0; i < str.Length; i++) + { + newStr += str[i]; + if ((i + 1) % 3 == 0) + newStr += ","; + } + + var newarray = newStr.ToCharArray(); + Array.Reverse(newarray); + newStr = new string(newarray); + if (newStr.Length > 0 && newStr[0] == ',') + newStr = newStr.Substring(1); + + return newStr; + } + + public static string ConvertToOrginal(this string str) + { + return string.Concat(str.Split(',')); + } + + public static string CheckPhoneNumber(string phoneNumber) + { + if (phoneNumber.Substring(0, 3).Contains("+98")) + phoneNumber = phoneNumber.Replace("+98", "0"); + else if (phoneNumber.Substring(0, 2).Contains("98")) + phoneNumber = string.Concat("0", phoneNumber.Substring(2)); + else if (phoneNumber[0] != '0') + phoneNumber = string.Concat("0", phoneNumber); + + return phoneNumber; + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Extensions/ValidationExtensions.cs b/DocuMed.Common/Extensions/ValidationExtensions.cs new file mode 100644 index 0000000..7065e53 --- /dev/null +++ b/DocuMed.Common/Extensions/ValidationExtensions.cs @@ -0,0 +1,21 @@ +namespace DocuMed.Common.Extensions +{ + public static class ValidationExtensions + { + public static bool CheckDateIs(this DateTime dateTime, DateTime From, DateTime To) + { + if (dateTime.Date > To.Date && dateTime.Date < From.Date) + return true; + return false; + } + + public static bool CheckDateFromToNow(this DateTime dateTime, int fromDays = 5) + { + var From = DateTime.Now.AddDays(-fromDays); + var To = DateTime.Now; + if (dateTime.Date > To.Date && dateTime.Date < From.Date) + return true; + return false; + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Api/AccessToken.cs b/DocuMed.Common/Models/Api/AccessToken.cs new file mode 100644 index 0000000..854c03f --- /dev/null +++ b/DocuMed.Common/Models/Api/AccessToken.cs @@ -0,0 +1,51 @@ +using System.IdentityModel.Tokens.Jwt; + +namespace DocuMed.Common.Models.Api +{ + public class AccessToken + { + public AccessToken() + { + } + + public AccessToken(JwtSecurityToken securityToken) + { + access_token = new JwtSecurityTokenHandler().WriteToken(securityToken); + token_type = "Bearer"; + expire_in_datetime = securityToken.ValidTo; + expires_in = (int)(securityToken.ValidTo - DateTime.UtcNow).TotalSeconds; + } + + public string access_token { get; set; } = string.Empty; + public string refresh_token { get; set; } = string.Empty; + public string token_type { get; set; } = string.Empty; + public int expires_in { get; set; } + public string token_id { get; set; } = string.Empty; + public DateTime expire_in_datetime { get; set; } + public string BearerToken => $"Bearer {access_token}"; + } + + public class AccessToken + { + public AccessToken() + { + } + + public AccessToken(JwtSecurityToken securityToken) + { + access_token = new JwtSecurityTokenHandler().WriteToken(securityToken); + token_type = "Bearer"; + expires_in = (int)(securityToken.ValidTo - DateTime.UtcNow).TotalSeconds; + } + + public string access_token { get; set; } = string.Empty; + public string ig_access_token { get; set; } = string.Empty; + public string refresh_token { get; set; } = string.Empty; + public string token_type { get; set; } = string.Empty; + public int expires_in { get; set; } + public TUser User { get; set; } + + public string BearerToken => $"Bearer {access_token}"; + public List Permissions { get; set; } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Api/ApiResultStatusCode.cs b/DocuMed.Common/Models/Api/ApiResultStatusCode.cs new file mode 100644 index 0000000..91a2132 --- /dev/null +++ b/DocuMed.Common/Models/Api/ApiResultStatusCode.cs @@ -0,0 +1,41 @@ +using System.Net; + +namespace DocuMed.Common.Models.Api +{ + public enum ApiResultStatusCode + { + [Display(Name = "عملیات با موفقیت انجام شد")] + Success = HttpStatusCode.OK, + + [Display(Name = "خطایی در سرور رخ داده است")] + ServerError = HttpStatusCode.InternalServerError, + + [Display(Name = "پارامتر های ارسالی معتبر نیستند")] + BadRequest = HttpStatusCode.BadRequest, + + [Display(Name = "یافت نشد")] + NotFound = HttpStatusCode.NotFound, + + [Display(Name = "لیست خالی است")] + ListEmpty = 4, + + [Display(Name = "خطایی در پردازش رخ داد")] + LogicError = 5, + + [Display(Name = "موجودی کیف پول کافی نمی باشد")] + WalletBalanceNoEnough = 6, + + [Display(Name = "خطای احراز هویت")] + UnAuthorized = HttpStatusCode.Unauthorized, + + [Display(Name = "سرور خاموش شده است لطفا منتظر بمانید")] + ServerDown = HttpStatusCode.ServiceUnavailable, + + [Display(Name = "در ارسال پیامک مورد نظر مشکلی رخ داده است")] + SendSmsError = 7, + + + [Display(Name = "در ارسال درخواست به سرورهای دیگر مشکلی رخ داده است")] + RefitError = 8 + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Api/AppSettings.cs b/DocuMed.Common/Models/Api/AppSettings.cs new file mode 100644 index 0000000..a3c7d21 --- /dev/null +++ b/DocuMed.Common/Models/Api/AppSettings.cs @@ -0,0 +1,7 @@ +namespace DocuMed.Common.Models.Api +{ + public class AppSettings + { + public bool Seeded { get; set; } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Api/FileUploadRequest.cs b/DocuMed.Common/Models/Api/FileUploadRequest.cs new file mode 100644 index 0000000..221d957 --- /dev/null +++ b/DocuMed.Common/Models/Api/FileUploadRequest.cs @@ -0,0 +1,15 @@ +namespace DocuMed.Common.Models.Api +{ + public enum FileUploadType + { + Handout, + Video, + Image + } + public class FileUploadRequest + { + public string StringBaseFile { get; set; } + public string FileName { get; set; } + public FileUploadType FileUploadType { get; set; } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Api/HealthCheck.cs b/DocuMed.Common/Models/Api/HealthCheck.cs new file mode 100644 index 0000000..409410d --- /dev/null +++ b/DocuMed.Common/Models/Api/HealthCheck.cs @@ -0,0 +1,9 @@ +namespace DocuMed.Common.Models.Api +{ + public class HealthCheck + { + public bool Health { get; set; } + public string Version { get; set; } + public string TotalMemory { get; set; } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Api/ResponseFile.cs b/DocuMed.Common/Models/Api/ResponseFile.cs new file mode 100644 index 0000000..41cc59c --- /dev/null +++ b/DocuMed.Common/Models/Api/ResponseFile.cs @@ -0,0 +1,9 @@ +namespace DocuMed.Common.Models.Api +{ + public class ResponseFile + { + public string Url { get; set; } + public string Location { get; set; } + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Api/TokenRequest.cs b/DocuMed.Common/Models/Api/TokenRequest.cs new file mode 100644 index 0000000..e0ebade --- /dev/null +++ b/DocuMed.Common/Models/Api/TokenRequest.cs @@ -0,0 +1,18 @@ +namespace DocuMed.Common.Models.Api +{ + public class TokenRequest + { + public string grant_type { get; set; } + public string username { get; set; } + public string password { get; set; } + public string refresh_token { get; set; } + public string scope { get; set; } + + public string client_id { get; set; } + public string client_secret { get; set; } + + public string login_hash { get; set; } + public string device_id { get; set; } + public string license_id { get; set; } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Claims/ApplicationClaims.cs b/DocuMed.Common/Models/Claims/ApplicationClaims.cs new file mode 100644 index 0000000..d004c7b --- /dev/null +++ b/DocuMed.Common/Models/Claims/ApplicationClaims.cs @@ -0,0 +1,90 @@ +using System.Security.Claims; + +namespace DocuMed.Common.Models.Claims; +public static class ApplicationClaims +{ + public static ClaimDto ManageComplexes { get; } = new ClaimDto + { + Type = CustomClaimType.Permission, + Value = ApplicationPermission.ManageComplexes, + Title = "دسترسی کامل به مجموعه ها", + Detail = "دسترسی به افزودن و مدیریت مجموعه های سیستم" + }; + public static ClaimDto ViewComplexes { get; } = new ClaimDto + { + Type = CustomClaimType.Permission, + Value = ApplicationPermission.ViewComplexes, + Title = "مشاهده مجموعه ها", + Detail = "دسترسی به مشاهده مجموعه ها" + }; + + public static ClaimDto ManageShifts { get; } = new ClaimDto + { + Type = CustomClaimType.Permission, + Value = ApplicationPermission.ManageShifts, + Title = "دسترسی کامل به شیفت ها", + Detail = "دسترسی به افزودن و مدیریت شیفت ها فروشگاه شما" + }; + public static ClaimDto ViewShifts { get; } = new ClaimDto + { + Type = CustomClaimType.Permission, + Value = ApplicationPermission.ViewShifts, + Title = "دسترسی مشاهده به شیفت ها", + Detail = "قابلیت مشاهده شیفت های مجموعه" + }; + public static ClaimDto ManageShiftPlans { get; } = new ClaimDto + { + Type = CustomClaimType.Permission, + Value = ApplicationPermission.ManageShiftPlans, + Title = "دسترسی کامل به شیفت بندی ها", + Detail = "دسترسی به افزودن و مدیریت شیفت بندی فروشگاه شما" + }; + + public static ClaimDto ManageTasks { get; } = new ClaimDto + { + Type = CustomClaimType.Permission, + Value = ApplicationPermission.ManageTasks, + Title = "دسترسی کامل به وظایف", + Detail = "دسترسی به افزودن و مدیریت وظایف فروشگاه شما" + }; + public static ClaimDto ViewTasks { get; } = new ClaimDto + { + Type = CustomClaimType.Permission, + Value = ApplicationPermission.ViewTasks, + Title = "دسترسی مشاهده وظایف", + Detail = "دسترسی مشاهده وظایف مجموعه شما" + }; + public static ClaimDto ManageActivities { get; } = new ClaimDto + { + Type = CustomClaimType.Permission, + Value = ApplicationPermission.ManageActivities, + Title = "دسترسی کامل به فعالیت ها", + Detail = "دسترسی به افزودن و مدیریت فعالیت ها فروشگاه شما" + }; + + + public static List AllClaims = new List + { + ManageActivities.GetClaim, + ViewTasks.GetClaim, + ManageTasks.GetClaim, + + ManageShiftPlans.GetClaim, + ViewShifts.GetClaim, + ManageShifts.GetClaim, + + ViewComplexes.GetClaim, + ManageComplexes.GetClaim, + }; + + public static List ManagerClaims = new List + { + ManageActivities.GetClaim, + ViewTasks.GetClaim, + ManageTasks.GetClaim, + + ManageShiftPlans.GetClaim, + ViewShifts.GetClaim, + ManageShifts.GetClaim, + }; +} diff --git a/DocuMed.Common/Models/Claims/ApplicationPermission.cs b/DocuMed.Common/Models/Claims/ApplicationPermission.cs new file mode 100644 index 0000000..106a378 --- /dev/null +++ b/DocuMed.Common/Models/Claims/ApplicationPermission.cs @@ -0,0 +1,14 @@ +namespace DocuMed.Common.Models.Claims; +public static class ApplicationPermission +{ + public const string ManageComplexes = nameof(ManageComplexes); + public const string ViewComplexes = nameof(ViewComplexes); + + public const string ManageShifts = nameof(ManageShifts); + public const string ViewShifts = nameof(ViewShifts); + public const string ManageShiftPlans = nameof(ManageShiftPlans); + + public const string ManageTasks = nameof(ManageTasks); + public const string ViewTasks = nameof(ViewTasks); + public const string ManageActivities = nameof(ManageActivities); +} diff --git a/DocuMed.Common/Models/Claims/ClaimDto.cs b/DocuMed.Common/Models/Claims/ClaimDto.cs new file mode 100644 index 0000000..a4614e9 --- /dev/null +++ b/DocuMed.Common/Models/Claims/ClaimDto.cs @@ -0,0 +1,20 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Security.Claims; + +namespace DocuMed.Common.Models.Claims; +public class ClaimDto : INotifyPropertyChanged +{ + public string Value { get; set; } = string.Empty; + public string Type { get; set; } = string.Empty; + public string Title { get; set; } = string.Empty; + public string Detail { get; set; } = string.Empty; + public bool IsSelected { get; set; } = false; + + public event PropertyChangedEventHandler PropertyChanged; + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + public Claim GetClaim => new Claim(Type, Value); +} diff --git a/DocuMed.Common/Models/Claims/CustomClaimType.cs b/DocuMed.Common/Models/Claims/CustomClaimType.cs new file mode 100644 index 0000000..e010303 --- /dev/null +++ b/DocuMed.Common/Models/Claims/CustomClaimType.cs @@ -0,0 +1,7 @@ +namespace DocuMed.Common.Models.Claims +{ + public static class CustomClaimType + { + public static string Permission { get; } = "Permission"; + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Entity/ApiEntity.cs b/DocuMed.Common/Models/Entity/ApiEntity.cs new file mode 100644 index 0000000..787d6e8 --- /dev/null +++ b/DocuMed.Common/Models/Entity/ApiEntity.cs @@ -0,0 +1,48 @@ +namespace DocuMed.Common.Models.Entity; +public abstract class ApiEntity : IApiEntity , IEquatable +{ + [Key] + public Guid Id { get; set; } + + [Display(Name = "تاریخ حذف")] + public DateTime RemovedAt { get; set; } + + [Display(Name = "تاریخ ساخت")] + public DateTime CreatedAt { get; set; } + + [Display(Name = "ساخته شده توسط")] + public string CreatedBy { get; set; } = string.Empty; + + [Display(Name = "حذف شده")] + public bool IsRemoved { get; set; } + [Display(Name = "حذف شده توسط")] + public string RemovedBy { get; set; } = string.Empty; + [Display(Name = "اخرین تغییر در")] + public DateTime ModifiedAt { get; set; } + + [Display(Name = "اخرین تغییر توسط")] + public string ModifiedBy { get; set; } = string.Empty; + + + + public bool Equals(ApiEntity? other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Id.Equals(other.Id); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((ApiEntity)obj); + } + + public override int GetHashCode() + { + return Id.GetHashCode(); + } + +} diff --git a/DocuMed.Common/Models/Entity/ClassDisplay.cs b/DocuMed.Common/Models/Entity/ClassDisplay.cs new file mode 100644 index 0000000..db0db8d --- /dev/null +++ b/DocuMed.Common/Models/Entity/ClassDisplay.cs @@ -0,0 +1,25 @@ +namespace DocuMed.Common.Models.Entity +{ + [AttributeUsage(AttributeTargets.Class)] + public class ClassDisplay : Attribute + { + private readonly string _description; + private readonly string _name; + + public ClassDisplay(string name, string description) + { + _name = name; + _description = description; + } + + public string GetName() + { + return _name; + } + + public string GetDescription() + { + return _description; + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Entity/IApiEntity.cs b/DocuMed.Common/Models/Entity/IApiEntity.cs new file mode 100644 index 0000000..2f55eb5 --- /dev/null +++ b/DocuMed.Common/Models/Entity/IApiEntity.cs @@ -0,0 +1,13 @@ +namespace DocuMed.Common.Models.Entity +{ + public interface IApiEntity + { + string CreatedBy { get; } + string ModifiedBy { get; } + string RemovedBy { get; } + bool IsRemoved { get; } + DateTime CreatedAt { get; } + DateTime RemovedAt { get; } + DateTime ModifiedAt { get; } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Exception/AppException.cs b/DocuMed.Common/Models/Exception/AppException.cs new file mode 100644 index 0000000..917e2d7 --- /dev/null +++ b/DocuMed.Common/Models/Exception/AppException.cs @@ -0,0 +1,26 @@ +using System.Runtime.Serialization; +using DocuMed.Common.Models.Api; + +namespace DocuMed.Common.Models.Exception +{ + [Serializable()] + public class AppException : System.Exception + { + protected AppException(SerializationInfo info, StreamingContext context) : base(info, context) { } + + public ApiResultStatusCode StatusCode { get; set; } + public AppException() + { + StatusCode = ApiResultStatusCode.ServerError; + } + public AppException(string message) : base(message) + { + StatusCode = ApiResultStatusCode.ServerError; + } + + public AppException(string message, ApiResultStatusCode statusCode) : base(message) + { + StatusCode = statusCode; + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Exception/BaseApiException.cs b/DocuMed.Common/Models/Exception/BaseApiException.cs new file mode 100644 index 0000000..18336a0 --- /dev/null +++ b/DocuMed.Common/Models/Exception/BaseApiException.cs @@ -0,0 +1,91 @@ +using System.Net; +using System.Runtime.Serialization; +using DocuMed.Common.Models.Api; + +namespace DocuMed.Common.Models.Exception +{ + [Serializable()] + public class BaseApiException : System.Exception + { + protected BaseApiException(SerializationInfo info, StreamingContext context) : base(info, context) { } + public BaseApiException() + : this(ApiResultStatusCode.ServerError) + { + } + + public BaseApiException(ApiResultStatusCode statusCode) + : this(statusCode, null) + { + } + + public BaseApiException(string message) + : this(ApiResultStatusCode.ServerError, message) + { + } + + public BaseApiException(ApiResultStatusCode statusCode, string message) + : this(statusCode, message, HttpStatusCode.InternalServerError) + { + } + + public BaseApiException(string message, object additionalData) : this(ApiResultStatusCode.ServerError, message, additionalData) + { + } + + public BaseApiException(ApiResultStatusCode statusCode, object additionalData) : this(statusCode, null, additionalData) + { + } + + public BaseApiException(ApiResultStatusCode statusCode, string message, object additionalData) + : this(statusCode, message, HttpStatusCode.InternalServerError, additionalData) + { + } + + public BaseApiException(ApiResultStatusCode statusCode, string message, HttpStatusCode httpStatusCode) + : this(statusCode, message, httpStatusCode, null) + { + } + + public BaseApiException(ApiResultStatusCode statusCode, string message, HttpStatusCode httpStatusCode, object additionalData) + : this(statusCode, message, httpStatusCode, null, additionalData) + { + } + + public BaseApiException(string message, System.Exception exception) + : this(ApiResultStatusCode.ServerError, message, exception) + { + } + + public BaseApiException(string message, System.Exception exception, object additionalData) + : this(ApiResultStatusCode.ServerError, message, exception, additionalData) + { + } + + public BaseApiException(ApiResultStatusCode statusCode, string message, System.Exception exception) + : this(statusCode, message, HttpStatusCode.InternalServerError, exception) + { + } + + public BaseApiException(ApiResultStatusCode statusCode, string message, System.Exception exception, object additionalData) + : this(statusCode, message, HttpStatusCode.InternalServerError, exception, additionalData) + { + } + + public BaseApiException(ApiResultStatusCode statusCode, string message, HttpStatusCode httpStatusCode, System.Exception exception) + : this(statusCode, message, httpStatusCode, exception, null) + { + } + + public BaseApiException(ApiResultStatusCode statusCode, string message, HttpStatusCode httpStatusCode, System.Exception exception, object additionalData) + : base(message, exception) + { + ApiStatusCode = statusCode; + HttpStatusCode = httpStatusCode; + AdditionalData = additionalData; + } + + public HttpStatusCode HttpStatusCode { get; set; } + public ApiResultStatusCode ApiStatusCode { get; set; } + public object AdditionalData { get; set; } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/IScopedDependency.cs b/DocuMed.Common/Models/IScopedDependency.cs new file mode 100644 index 0000000..43dcb9e --- /dev/null +++ b/DocuMed.Common/Models/IScopedDependency.cs @@ -0,0 +1,6 @@ +namespace DocuMed.Common.Models +{ + public interface IScopedDependency + { + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Mapper/BaseDto.cs b/DocuMed.Common/Models/Mapper/BaseDto.cs new file mode 100644 index 0000000..9c43d29 --- /dev/null +++ b/DocuMed.Common/Models/Mapper/BaseDto.cs @@ -0,0 +1,97 @@ +using System.ComponentModel; +using System.Linq.Expressions; +using System.Runtime.CompilerServices; +using DocuMed.Common.Models.Exception; + +namespace DocuMed.Common.Models.Mapper +{ + /// + /// Base Dto Class initial map config between entity and dto + /// + /// Type of Dto Class + /// Type of Entity Class + public abstract class BaseDto : INotifyPropertyChanged, IBaseDto where TEntity : class where TDto : class + { + public Guid Id { get; set; } + public static Expression> ProjectToDto + { + get => GetProjectToDto(); + } + private static Expression> GetProjectToDto() + { + var assembly = typeof(TEntity).Assembly; + var mapperName = $"{typeof(TEntity).Name}Mapper"; + var mapperType = assembly.GetTypes()?.FirstOrDefault(t => t.Name.Contains(mapperName)); + if (mapperType == null) + throw new AppException($"{typeof(TEntity).Name}Mapper Not Found!"); + if (typeof(TDto).Name.Contains("SDto")) + { + var projectProperty = mapperType.GetProperty("ProjectToSDto"); + if (projectProperty == null) + throw new AppException($"{typeof(TEntity).Name}Mapper Dont Have ProjectTo"); + return projectProperty.GetValue(null, null) as Expression>; + } + else if (typeof(TDto).Name.Contains("LDto")) + { + var projectProperty = mapperType.GetProperty("ProjectToLDto"); + if (projectProperty == null) + throw new AppException($"{typeof(TEntity).Name}Mapper Dont Have ProjectTo"); + return projectProperty.GetValue(null, null) as Expression>; + } + else + throw new AppException($"{typeof(TDto).Name} Projection Not Implemented"); + } + public virtual bool Compare(object obj) + { + if(obj is BaseDto objDto) + return objDto.Id == this.Id; + return Equals(obj); + } + + public TDto Clone() + { + return (TDto)MemberwiseClone(); + } + + public TEntity ToEntity() + { + var assembly = typeof(TEntity).Assembly; + var mapperName = $"{typeof(TEntity).Name}Mapper"; + var mapperType = assembly.GetTypes()?.FirstOrDefault(t => t.Name.Contains(mapperName)); + var toEntityMethodInfo = mapperType.GetMethod($"AdaptTo{typeof(TEntity).Name}"); + var parms = new[] { this }; + var entity = toEntityMethodInfo.Invoke(null, parms); + if (entity is TEntity o) + return o; + return null; + } + + public static TDto FromEntity(TEntity model) + { + var assembly = typeof(TEntity).Assembly; + var mapperName = $"{typeof(TEntity).Name}Mapper"; + var mapperType = assembly.GetTypes()?.FirstOrDefault(t => t.Name.Contains(mapperName)); + var toDtoMethodInfo = mapperType.GetMethod("AdaptToDto"); + var parms = new[] { model }; + var dto = toDtoMethodInfo.Invoke(null, parms); + if (dto is TDto o) + return o; + return null; + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + protected bool SetField(ref T field, T value, [CallerMemberName] string propertyName = null) + { + if (EqualityComparer.Default.Equals(field, value)) return false; + field = value; + OnPropertyChanged(propertyName); + return true; + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Mapper/IBaseDto.cs b/DocuMed.Common/Models/Mapper/IBaseDto.cs new file mode 100644 index 0000000..449a2c7 --- /dev/null +++ b/DocuMed.Common/Models/Mapper/IBaseDto.cs @@ -0,0 +1,11 @@ +using System.Linq.Expressions; + +namespace DocuMed.Common.Models.Mapper +{ + public interface IBaseDto + { + Guid Id { get; set; } + bool Compare(object obj); + static Expression> ProjectToDto; + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Report/ChartUnit.cs b/DocuMed.Common/Models/Report/ChartUnit.cs new file mode 100644 index 0000000..f614422 --- /dev/null +++ b/DocuMed.Common/Models/Report/ChartUnit.cs @@ -0,0 +1,38 @@ +namespace DocuMed.Common.Models.Report +{ + public class ChartUnit + { + public List Values { get; set; } = new(); + + public List ValuesStr + { + get { return Values.Select(v => v.ToString()).ToList(); } + } + + public List Labels { get; set; } = new(); + } + + public class ChartUnitIQuery + { + public IQueryable Values { get; set; } + + public List ValuesStr + { + get { return Values.Select(v => v.ToString()).ToList(); } + } + + public IQueryable Labels { get; set; } + } + + public class ChartUnit + { + public List Values { get; set; } = new(); + + public List ValuesStr + { + get { return Values.Select(v => v.ToString()).ToList(); } + } + + public List Labels { get; set; } = new(); + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Report/ReportRequest.cs b/DocuMed.Common/Models/Report/ReportRequest.cs new file mode 100644 index 0000000..ca18b7f --- /dev/null +++ b/DocuMed.Common/Models/Report/ReportRequest.cs @@ -0,0 +1,24 @@ +namespace DocuMed.Common.Models.Report +{ + public enum ReportType + { + ByDate, + ByValue, + BySelected + } + + public class ReportRequestProp + { + public string PropertyName { get; set; } + public string PropertyValue { get; set; } + } + + public class ReportRequest + { + public string TableType { get; set; } + public ReportType ReportType { get; set; } + public DateTime FromDateTime { get; set; } + public DateTime ToDateTime { get; set; } + public List ReportRequestProps { get; set; } = new(); + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Report/ReportResult.cs b/DocuMed.Common/Models/Report/ReportResult.cs new file mode 100644 index 0000000..613424d --- /dev/null +++ b/DocuMed.Common/Models/Report/ReportResult.cs @@ -0,0 +1,34 @@ +namespace DocuMed.Common.Models.Report +{ + public class ReportResult + { + private List _rows; + + public List Rows + { + get + { + if (_rows == null) + _rows = new List(); + return _rows; + } + set => _rows = value; + } + } + + public class ReportRow + { + private List _cells; + + public List Cells + { + get + { + if (_cells == null) + _cells = new List(); + return _cells; + } + set => _cells = value; + } + } +} \ No newline at end of file diff --git a/DocuMed.Common/Models/Report/ReportableItem.cs b/DocuMed.Common/Models/Report/ReportableItem.cs new file mode 100644 index 0000000..b6c354e --- /dev/null +++ b/DocuMed.Common/Models/Report/ReportableItem.cs @@ -0,0 +1,89 @@ +using System.Collections; +using System.Reflection; + +namespace DocuMed.Common.Models.Report +{ + public interface IReportableItem + { + string Name { get; set; } + string PropertyName { get; set; } + object DefaultValue { get; set; } + object SelectedValue { get; set; } + string ItemType { get; } + object Element { get; set; } + } + + public class BoolReportable : IReportableItem + { + public BoolReportable() + { + ItemType = GetType().Name; + } + + public string Name { get; set; } + public string PropertyName { get; set; } + public object DefaultValue { get; set; } + public object SelectedValue { get; set; } + public string ItemType { get; } + public object Element { get; set; } + } + + public class ListReportable : IReportableItem + { + public ListReportable() + { + ItemType = GetType().Name; + } + + public IList List { get; set; } + public IList ConvertedList { get; set; } + public string DisplayMemberPath { get; set; } + public string SelectedMemberPath { get; set; } + public string ListItemType { get; set; } + public string Name { get; set; } + public string PropertyName { get; set; } + public object DefaultValue { get; set; } + public object SelectedValue { get; set; } + public string ItemType { get; } + public object Element { get; set; } + } + + public class EnumReportable : IReportableItem + { + public EnumReportable() + { + ItemType = GetType().Name; + } + + public string EnumTypeName { get; set; } + + public string Name { get; set; } + public string PropertyName { get; set; } + public object DefaultValue { get; set; } + public object SelectedValue { get; set; } + public string ItemType { get; } + public object Element { get; set; } + + public Type EnumType(Assembly domainAssembly) + { + var types = domainAssembly.GetTypes(); + var type = types.FirstOrDefault(t => t.Name == EnumTypeName); + return type; + } + } + + public class NumericReportable : IReportableItem + { + public NumericReportable() + { + ItemType = GetType().Name; + } + + public string Name { get; set; } + public string PropertyName { get; set; } + public object DefaultValue { get; set; } + public object SelectedValue { get; set; } + public string ItemType { get; } + public object Element { get; set; } + } +} \ No newline at end of file diff --git a/DocuMed.Core/Class1.cs b/DocuMed.Core/Class1.cs new file mode 100644 index 0000000..5e31edd --- /dev/null +++ b/DocuMed.Core/Class1.cs @@ -0,0 +1,7 @@ +namespace DocuMed.Core +{ + public class Class1 + { + + } +} \ No newline at end of file diff --git a/DocuMed.Core/DocuMed.Core.csproj b/DocuMed.Core/DocuMed.Core.csproj new file mode 100644 index 0000000..6fc9784 --- /dev/null +++ b/DocuMed.Core/DocuMed.Core.csproj @@ -0,0 +1,22 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + + + + + + diff --git a/DocuMed.Domain/DocuMed.Domain.csproj b/DocuMed.Domain/DocuMed.Domain.csproj new file mode 100644 index 0000000..781f76e --- /dev/null +++ b/DocuMed.Domain/DocuMed.Domain.csproj @@ -0,0 +1,56 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.Domain/DomainConfig.cs b/DocuMed.Domain/DomainConfig.cs new file mode 100644 index 0000000..54c326e --- /dev/null +++ b/DocuMed.Domain/DomainConfig.cs @@ -0,0 +1,5 @@ +namespace DocuMed.Domain; +public class DomainConfig +{ + +} \ No newline at end of file diff --git a/DocuMed.Domain/Entities/User/ApplicationRole.cs b/DocuMed.Domain/Entities/User/ApplicationRole.cs new file mode 100644 index 0000000..4ae057e --- /dev/null +++ b/DocuMed.Domain/Entities/User/ApplicationRole.cs @@ -0,0 +1,7 @@ +namespace DocuMed.Domain.Entities.User; +public class ApplicationRole : IdentityRole +{ + public string Description { get; set; } = string.Empty; + public string EnglishName { get; set; } = string.Empty; + public string PersianName { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/DocuMed.Domain/Entities/User/ApplicationUser.cs b/DocuMed.Domain/Entities/User/ApplicationUser.cs new file mode 100644 index 0000000..9b71a2b --- /dev/null +++ b/DocuMed.Domain/Entities/User/ApplicationUser.cs @@ -0,0 +1,13 @@ +namespace DocuMed.Domain.Entities.User; + +[AdaptTwoWays("[name]SDto", IgnoreAttributes = new[] { typeof(AdaptIgnoreAttribute) }, MapType = MapType.Map | MapType.MapToTarget | MapType.Projection)] +[GenerateMapper] +public class ApplicationUser : IdentityUser +{ + public string FirstName { get; set; } = string.Empty; + public string LastName { get; set; } = string.Empty; + public string InternationalId { get; set; } = string.Empty; + public DateTime BirthDate { get; set; } + public Gender Gender { get; set; } + public SignUpStatus SignUpStatus { get; set; } +} diff --git a/DocuMed.Domain/Enums/Gender.cs b/DocuMed.Domain/Enums/Gender.cs new file mode 100644 index 0000000..23bcf7c --- /dev/null +++ b/DocuMed.Domain/Enums/Gender.cs @@ -0,0 +1,9 @@ +namespace DocuMed.Domain.Enums; + +public enum Gender +{ + [Display(Name = "مرد")] + Male, + [Display(Name = "زن")] + Female +} \ No newline at end of file diff --git a/DocuMed.Domain/Enums/SignUpStatus.cs b/DocuMed.Domain/Enums/SignUpStatus.cs new file mode 100644 index 0000000..5240f2a --- /dev/null +++ b/DocuMed.Domain/Enums/SignUpStatus.cs @@ -0,0 +1,11 @@ +namespace DocuMed.Domain.Enums; + +public enum SignUpStatus +{ + [Display(Name = "شروع ثبت نام")] + StartSignUp = 0, + [Display(Name = "شماره تلفن تایید شد")] + PhoneNumberVerified = 1, + [Display(Name = "ثبت نام تکمیل شد")] + SignUpCompleted = 5, +} \ No newline at end of file diff --git a/DocuMed.Domain/FodyWeavers.xml b/DocuMed.Domain/FodyWeavers.xml new file mode 100644 index 0000000..d5abfed --- /dev/null +++ b/DocuMed.Domain/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/DocuMed.Domain/Models/Settings/SiteSettings.cs b/DocuMed.Domain/Models/Settings/SiteSettings.cs new file mode 100644 index 0000000..8bea981 --- /dev/null +++ b/DocuMed.Domain/Models/Settings/SiteSettings.cs @@ -0,0 +1,37 @@ +namespace DocuMed.Domain.Models.Settings; + +public class SiteSettings +{ + public JwtSettings JwtSettings { get; set; } = new JwtSettings(); + public string BaseUrl { get; set; } = string.Empty; + public RedisSettings MasterRedisConfiguration { get; set; } = new RedisSettings(); + public UserSetting UserSetting { get; set; } = new UserSetting(); + public string KaveNegarApiKey { get; set; } = string.Empty; +} +public class RedisSettings +{ + public string Password { get; set; } = string.Empty; + public string ServiceName { get; set; } = string.Empty; + public string Host { get; set; } = string.Empty; + public int Port { get; set; } +} + + +public class JwtSettings +{ + public string SecretKey { get; set; } = string.Empty; + public string Issuer { get; set; } = string.Empty; + public string Audience { get; set; } = string.Empty; + public int ExpireAddDay { get; set; } +} + +public class UserSetting +{ + public string Username { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string RoleName { get; set; } = string.Empty; + public string FirstName { get; set; } = string.Empty; + public string LastName { get; set; } = string.Empty; + public string Phone { get; set; } = string.Empty; +} diff --git a/DocuMed.Infrastructure/Class1.cs b/DocuMed.Infrastructure/Class1.cs new file mode 100644 index 0000000..9fcbf72 --- /dev/null +++ b/DocuMed.Infrastructure/Class1.cs @@ -0,0 +1,7 @@ +namespace DocuMed.Infrastructure +{ + public class Class1 + { + + } +} \ No newline at end of file diff --git a/DocuMed.Infrastructure/DocuMed.Infrastructure.csproj b/DocuMed.Infrastructure/DocuMed.Infrastructure.csproj new file mode 100644 index 0000000..3419028 --- /dev/null +++ b/DocuMed.Infrastructure/DocuMed.Infrastructure.csproj @@ -0,0 +1,17 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + diff --git a/DocuMed.PWA/App.razor b/DocuMed.PWA/App.razor new file mode 100644 index 0000000..37968bc --- /dev/null +++ b/DocuMed.PWA/App.razor @@ -0,0 +1,13 @@ + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+ +
diff --git a/DocuMed.PWA/DocuMed.PWA.csproj b/DocuMed.PWA/DocuMed.PWA.csproj new file mode 100644 index 0000000..1cbba4b --- /dev/null +++ b/DocuMed.PWA/DocuMed.PWA.csproj @@ -0,0 +1,41 @@ + + + + + + net7.0 + enable + enable + service-worker-assets.js + 1.0.0.2 + 1.0.0.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.PWA/DocuMed.PWA.sln b/DocuMed.PWA/DocuMed.PWA.sln new file mode 100644 index 0000000..b4c4aa4 --- /dev/null +++ b/DocuMed.PWA/DocuMed.PWA.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DocuMed.PWA", "DocuMed.PWA.csproj", "{520F6D6A-2EFD-499F-972F-EF9E1EBD2452}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {520F6D6A-2EFD-499F-972F-EF9E1EBD2452}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {520F6D6A-2EFD-499F-972F-EF9E1EBD2452}.Debug|Any CPU.Build.0 = Debug|Any CPU + {520F6D6A-2EFD-499F-972F-EF9E1EBD2452}.Release|Any CPU.ActiveCfg = Release|Any CPU + {520F6D6A-2EFD-499F-972F-EF9E1EBD2452}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6B860D71-D558-47DE-ACCC-6C25282D547D} + EndGlobalSection +EndGlobal diff --git a/DocuMed.PWA/Models/Entities/MedicalHistory.cs b/DocuMed.PWA/Models/Entities/MedicalHistory.cs new file mode 100644 index 0000000..5a3ba9e --- /dev/null +++ b/DocuMed.PWA/Models/Entities/MedicalHistory.cs @@ -0,0 +1,11 @@ +namespace DocuMed.PWA.Models.Entities; + +public class MedicalHistory +{ + public string Name { get; set; } = string.Empty; + public string Section { get; set; } = string.Empty; + public int Aag { get; set; } + public string CC { get; set; } = string.Empty; + public Gender Gender { get; set; } + +} \ No newline at end of file diff --git a/DocuMed.PWA/Models/Entities/MedicalHistoryQuestion.cs b/DocuMed.PWA/Models/Entities/MedicalHistoryQuestion.cs new file mode 100644 index 0000000..a43227a --- /dev/null +++ b/DocuMed.PWA/Models/Entities/MedicalHistoryQuestion.cs @@ -0,0 +1,7 @@ +namespace DocuMed.PWA.Models.Entities; + +public class MedicalHistoryQuestion +{ + public string Title { get; set; } = string.Empty; + public MedicalHistoryQuestionType Type { get; set; } +} \ No newline at end of file diff --git a/DocuMed.PWA/Models/Entities/MedicalHistorySystemReview.cs b/DocuMed.PWA/Models/Entities/MedicalHistorySystemReview.cs new file mode 100644 index 0000000..d2a9e9a --- /dev/null +++ b/DocuMed.PWA/Models/Entities/MedicalHistorySystemReview.cs @@ -0,0 +1,10 @@ +namespace DocuMed.PWA.Models.Entities +{ + public class MedicalHistorySystemReview + { + public string Title { get; set; } = string.Empty; + public string System { get; set; } = string.Empty; + public bool IsSign { get; set; } + public bool IsSymptom { get; set; } + } +} diff --git a/DocuMed.PWA/Models/Entities/MedicalHistoryTemplate.cs b/DocuMed.PWA/Models/Entities/MedicalHistoryTemplate.cs new file mode 100644 index 0000000..949d81c --- /dev/null +++ b/DocuMed.PWA/Models/Entities/MedicalHistoryTemplate.cs @@ -0,0 +1,7 @@ +namespace DocuMed.PWA.Models.Entities; + +public class MedicalHistoryTemplate +{ + public string CC { get; set; } = string.Empty; + public string Section { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/DocuMed.PWA/Models/Enums/Gender.cs b/DocuMed.PWA/Models/Enums/Gender.cs new file mode 100644 index 0000000..8d15ea8 --- /dev/null +++ b/DocuMed.PWA/Models/Enums/Gender.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace DocuMed.PWA.Models.Enums; + +public enum Gender +{ + [Display(Name = "مرد")] + Male, + [Display(Name = "زن")] + Female +} \ No newline at end of file diff --git a/DocuMed.PWA/Models/Enums/MedicalHistoryQuestionType.cs b/DocuMed.PWA/Models/Enums/MedicalHistoryQuestionType.cs new file mode 100644 index 0000000..7c04457 --- /dev/null +++ b/DocuMed.PWA/Models/Enums/MedicalHistoryQuestionType.cs @@ -0,0 +1,8 @@ +namespace DocuMed.PWA.Models.Enums; + +public enum MedicalHistoryQuestionType +{ + Hourly, + Interrogatively, + YesOrNo +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/HomePage.razor b/DocuMed.PWA/Pages/HomePage.razor new file mode 100644 index 0000000..c0c0929 --- /dev/null +++ b/DocuMed.PWA/Pages/HomePage.razor @@ -0,0 +1,138 @@ +@page "/HomePage" +@inject NavigationManager NavigationManager + + + +
+ + + + + + +

امیرحسین خادمی

+

09214802813

+
+
+ اطفال +
+
+ +
+
+

شرح حال های امروز شما

+

لیست شرح حال های انجام شده در امروز

+
+ + افزودن +
+ +
+ @foreach(var item in _medicalHistories) + { + + } +
+ +
+ + +
+ + + + + + + + + +
+
+
+
+ +@code { + public void ProfileClicked() => NavigationManager.NavigateTo("ProfilePage"); + + public void CreateMedicalHistoryClicked() => NavigationManager.NavigateTo("MedicalHistoryActionPage"); + + public void MedicalHistoryTemplatesClicked() => NavigationManager.NavigateTo("MedicalHistoryTemplatesPage"); + public void MedicalOrdersClicked() => NavigationManager.NavigateTo("MedicalOrdersPage"); + + private List _medicalHistories = new List(); + protected override void OnInitialized() + { + _medicalHistories.Add(new MedicalHistory + { + Name = "امیرحسین معتمدی", + Aag = 35, + CC = "سردرد", + Section = "داخلی", + Gender = Gender.Male + }); + _medicalHistories.Add(new MedicalHistory + { + Name = "محمد امینی", + Aag = 40, + CC = "معده درد", + Section = "داخلی", + Gender = Gender.Male + }); + _medicalHistories.Add(new MedicalHistory + { + Name = "زیبا بروفه", + Aag = 20, + CC = "سوختگی", + Section = "سوختگی", + Gender = Gender.Female + }); + _medicalHistories.Add(new MedicalHistory + { + Name = "روشنک فدایی", + Aag = 18, + CC = "دردسینه", + Section = "داخلی", + Gender = Gender.Female + }); + _medicalHistories.Add(new MedicalHistory + { + Name = "سطلان محمدی", + Aag = 28, + CC = "روانی", + Section = "روان", + Gender = Gender.Male + }); + _medicalHistories.Add(new MedicalHistory + { + Name = "سعید سعیدی", + Aag = 60, + CC = "بی هوشی", + Section = "داخلی", + Gender = Gender.Male + }); + base.OnInitialized(); + } + +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/Index.razor b/DocuMed.PWA/Pages/Index.razor new file mode 100644 index 0000000..0dccb32 --- /dev/null +++ b/DocuMed.PWA/Pages/Index.razor @@ -0,0 +1,182 @@ +@page "/" +@inject NavigationManager NavigationManager + +
+
+ + + +
+
+
+ +
+

شرح حال نویسی بیمار راحت تر + از + همیشه

+

نرم افزار داکیومد با امکانات بسیار زیاد + خود + مثل شرح حال نویسی همراه و همیار همیشگی پزشکان محترم

+
+
+
+ +
+
+
+ +
+

اوردر های شما همه در یک + اپلیکیشن

+

نرم افزار داکیومد با امکانات بسیار زیاد + خود + مثل شرح حال نویسی همیار همیشگی پزشکان محترم

+
+
+
+ +
+
+
+ +
+

نرم افزار جامع داکیـــــومد +

+

نرم افزار داکیومد با امکانات بسیار زیاد + خود + مثل تهیه پیشنویس شرح حال همراه همیشگی پزشکان محترم

+
+
+
+
+
+ + + +
+ +

ورود | ثبت نام

+

+ برای ورود یا ثبت نام به اپلیکیشن داکیومد باید شماره تلفن همراه خود را + وارد کنید +

+ + + + + + +

+ با تایید شماره تلفن همراه با همه شرایط + حریم + خصوصی + اپلیکیشن داکیومد موافقت می کنم +

+
+
+
+ +
+ + +

ورود | ثبت نام

+

+ برای ورود یا ثبت نام به اپلیکیشن داکیومد باید شماره تلفن همراه خود را + وارد کنید +

+ + + + + + +
+ +

02:00

+ ارسال مجدد پیامک +
+ + بازگشت + + +
+
+
+
+ +
+ +

ثبت نام

+

برای ثبت نام به اپلیکیشن داکیومد باید اطلاعات کامل خود را وارد + کنید +

+ + + + + + + + + +
+
+
+
+
+
+ +@code +{ + private MudCarousel? _carousel; + private int _currentSignOnStep = 0; + MudForm? confirmPhoneNumberForm; + + private string phoneNumber = string.Empty; + + private void ConfirmPhoneNumber() + { + confirmPhoneNumberForm?.Validate(); + if (confirmPhoneNumberForm != null && confirmPhoneNumberForm.IsValid) + _carousel?.MoveTo(++_currentSignOnStep); + } + private void ConfirmVerifyCode() + { + _carousel?.MoveTo(++_currentSignOnStep); + } + private void PhoneNumberRollBack() + { + _carousel?.MoveTo(--_currentSignOnStep); + } + private void ConfirmSignUp() + { + NavigationManager.NavigateTo("HomePage"); + } + +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryActionPage.razor b/DocuMed.PWA/Pages/MedicalHistoryActionPage.razor new file mode 100644 index 0000000..1ad5eb3 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryActionPage.razor @@ -0,0 +1,86 @@ +@page "/MedicalHistoryActionPage" +@inject NavigationManager NavigationManager + + +
+ + + + +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+ + @if(!medicalHistorySubmited){ + + + @if (_currentStep == 4) + { + تکمیل + } + else + { + مرحله بعد + + } + +

@_stepCounter

+ مرحله قبل +
+ } +
+
+ +@code { + private MudCarousel? _carousel; + private int _currentStep = 0; + private string _stepCounter = "1 / 5"; + private bool medicalHistorySubmited = false; + private void CompleteStepClicked() + { + _carousel?.MoveTo(++_currentStep); + _stepCounter = string.Format("{0} / 5", _currentStep + 1); + if (_currentStep == 5) + medicalHistorySubmited = true; + } + private void RollBackStepClicked() + { + _carousel?.MoveTo(--_currentStep); + _stepCounter = string.Format("{0} / 5", _currentStep + 1); + } + + private void CompleteCreateMedicalHistory() + { + NavigationManager.NavigateTo("HomePage"); + } +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep1.razor b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep1.razor new file mode 100644 index 0000000..304efc9 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep1.razor @@ -0,0 +1,13 @@ + +

افزودن شرح حال جدید

+

لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از + طراحان گرافیک است چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی + مورد ده

+ + + +
+ +@code { + +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep2.razor b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep2.razor new file mode 100644 index 0000000..875c346 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep2.razor @@ -0,0 +1,17 @@ + + + + + + +
+ + + + + +
+ + +@code { +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep3.razor b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep3.razor new file mode 100644 index 0000000..8ff0264 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep3.razor @@ -0,0 +1,22 @@ + + + + + + +
+ + + + + + + + + + +
+ +@code { + +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep4.razor b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep4.razor new file mode 100644 index 0000000..adc8526 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep4.razor @@ -0,0 +1,36 @@ + + + + + + + +
+ @for (int i = 0; i < 5; i++) + { + + +

ادالت کولد 500

+
+
+ } +
+ + +
+ @for (int i = 0; i < 4; i++) + { + + +

ادالت کولد 500

+
+
+ } +
+ + + +
+@code { + +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep5.razor b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep5.razor new file mode 100644 index 0000000..1352430 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep5.razor @@ -0,0 +1,42 @@ + + + + +
+ + +

بیمار هوشیار است

+
+
+ + +

بیمار ILL است

+
+
+ +
+ + + +
+

فشــــار خون

+ + + + +
+
+ + + + + + +
+ + + +
+@code { + +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep6.razor b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep6.razor new file mode 100644 index 0000000..745827c --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryActionParts/MedicalHistoryActionStep6.razor @@ -0,0 +1,14 @@ + +

شرح حال تکمیل شد

+

+ لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از + طراحان گرافیک است چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی + مورد ده +

+ +
+ +@code { + [Parameter] + public EventCallback SubmittedOnClick { get; set; } +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryTemplateActionPage.razor b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionPage.razor new file mode 100644 index 0000000..21fc452 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionPage.razor @@ -0,0 +1,88 @@ +@page "/MedicalHistoryTemplateActionPage" +@inject NavigationManager NavigationManager + + + +
+ + + + +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+ + @if(!medicalHistorySubmited){ + + + @if (_currentStep == 4) + { + تـــکمیل + } + else + { + + مرحله بعد + + } + +

@_stepCounter

+ مرحله قبل +
+ } +
+
+ +@code { + private MudCarousel? _carousel; + private int _currentStep = 0; + private string _stepCounter = "1 / 5"; + private bool medicalHistorySubmited = false; + private void CompleteStepClicked() + { + _carousel?.MoveTo(++_currentStep); + _stepCounter = string.Format("{0} / 5", _currentStep + 1); + if (_currentStep == 5) + medicalHistorySubmited = true; + } + private void RollBackStepClicked() + { + _carousel?.MoveTo(--_currentStep); + _stepCounter = string.Format("{0} / 5", _currentStep + 1); + } + + private void CompleteCreateMedicalHistory() + { + NavigationManager.NavigateTo("HomePage"); + } +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep1.razor b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep1.razor new file mode 100644 index 0000000..c0ed2e0 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep1.razor @@ -0,0 +1,13 @@ + +

افزودن پیش نویس شرح حال جدید

+

لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از + طراحان گرافیک است چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی + مورد ده

+ + + +
+ +@code { + +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep2.razor b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep2.razor new file mode 100644 index 0000000..892856b --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep2.razor @@ -0,0 +1,50 @@ + + + + شما میتوانید سوال های هر بخش ها را به صورت کامل تنظیم نمایید + + @foreach (var item in Questions) + { + + } + + + + + + + + + + + + + افزودن + + + + + +@code +{ + private MedicalHistoryQuestionType _questionType; + private string EnumConvertFunc() => string.Empty; + private string _questionTitle = string.Empty; + + + public List Questions { get; set; } = new(); + + private void RemoveQuestion(MedicalHistoryQuestion question) + { + Questions.Remove(question); + } + private void AddQuestion() + { + Questions.Add(new MedicalHistoryQuestion + { + Title = _questionTitle, + Type = _questionType + }); + } +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep3.razor b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep3.razor new file mode 100644 index 0000000..149b223 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep3.razor @@ -0,0 +1,89 @@ + + + + + @foreach (var item in PIQuestions) + { + + } + + + + + + + + + + + + افزودن + + + + + @foreach (var item in PIQuestions) + { + + } + + + + + + + + + + + + افزودن + + + + + +@code +{ + private string _piQuestionTitle = string.Empty; + private MedicalHistoryQuestionType _piQuestionType; + private string _pshQuestionTitle = string.Empty; + private MedicalHistoryQuestionType _pshQuestionType; + public List PIQuestions { get; set; } = new(); + public List PSHQuestions { get; set; } = new(); + + private void RemovePIQuestion(MedicalHistoryQuestion question) + { + PIQuestions.Remove(question); + } + private void AddPIQuestion() + { + PIQuestions.Add(new MedicalHistoryQuestion + { + Title = _piQuestionTitle, + Type = _piQuestionType + }); + } + + private void RemovePSHQuestion(MedicalHistoryQuestion question) + { + PSHQuestions.Remove(question); + } + private void AddPSHQuestion() + { + PSHQuestions.Add(new MedicalHistoryQuestion + { + Title = _pshQuestionTitle, + Type = _pshQuestionType + }); + } + +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep4.razor b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep4.razor new file mode 100644 index 0000000..114b05c --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep4.razor @@ -0,0 +1,113 @@ + + + + @foreach (var item in FamilyHistories) + { + + } + + + + + + + + + + + + افزودن + + + + + +
+ @foreach (var item in DrugHistories) + { + + +

@item

+
+
+ } +
+ +
+ + + + + + +
+ + + +
+ @foreach (var item in HHMedicines) + { + + +

@item

+
+
+ } +
+ +
+ + + + + + +
+ + + +
+@code { + private string _familyHistoryQuestionTitle = string.Empty; + private MedicalHistoryQuestionType _familyHistoryQuestionType; + + public List FamilyHistories { get; set; } = new(); + + private void RemoveFamilyHistory(MedicalHistoryQuestion question) + { + FamilyHistories.Remove(question); + } + private void AddFamilyHistory() + { + FamilyHistories.Add(new MedicalHistoryQuestion + { + Title = _familyHistoryQuestionTitle, + Type = _familyHistoryQuestionType + }); + } + + + private string _drugHistoryName = string.Empty; + public List DrugHistories { get; set; } = new(); + private void RemoveDrugHistory(string medicine) + { + DrugHistories.Remove(medicine); + } + private void AddDrugHistory() + { + DrugHistories.Add(_drugHistoryName); + _drugHistoryName = string.Empty; + } + + + private string _hhName = string.Empty; + public List HHMedicines { get; set; } = new(); + private void RemoveHHMedicine(string medicine) + { + HHMedicines.Remove(medicine); + } + private void AddHHMedicine() + { + HHMedicines.Add(_hhName); + _hhName = string.Empty; + } +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep5.razor b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep5.razor new file mode 100644 index 0000000..a8a13ca --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep5.razor @@ -0,0 +1,106 @@ + + +
+ @foreach (var item in GeneralAppearances) + { + + +

@item

+
+
+ } +
+ +
+ + + + + + +
+ + + + @foreach (var item in ReviewOfSystems) + { + + +
+
+

@item.Title

+
+ + @item.System + + @if(@item.IsSign) + { + + Sign + + } + @if (@item.IsSymptom) + { + + Symptom + + } +
+
+ +
+
+ } + + + +
+ + + + + + + + + +
+ + +
+@code { + + private string _generalAppearance = string.Empty; + public List GeneralAppearances { get; set; } = new(); + private void RemoveGeneralAppearance(string medicine) + { + GeneralAppearances.Remove(medicine); + } + private void AddGeneralAppearance() + { + GeneralAppearances.Add(_generalAppearance); + _generalAppearance = string.Empty; + } + + private string _reviewOfSystemTitle = string.Empty; + private string _reviewOfSystemSystem = string.Empty; + private bool _reviewOfSystemIsSign; + private bool _reviewOfSystemIsSymptom; + public List ReviewOfSystems { get; set; } = new(); + private void RemoveReviewOfSystems(MedicalHistorySystemReview review) + { + ReviewOfSystems.Remove(review); + } + private void AddReviewOfSystems() + { + ReviewOfSystems.Add(new MedicalHistorySystemReview + { + Title = _reviewOfSystemTitle, + IsSign = _reviewOfSystemIsSign, + IsSymptom = _reviewOfSystemIsSymptom, + System = _reviewOfSystemSystem + }); + _reviewOfSystemTitle = string.Empty; + } +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep6.razor b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep6.razor new file mode 100644 index 0000000..ee861e5 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryTemplateActionParts/MedicalHistoryTemplateActionStep6.razor @@ -0,0 +1,19 @@ + + +
+ +
+

تبریک تمپلیت شما تکمیل شد

+

+ لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از + طراحان گرافیک است چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی + مورد ده +

+ +
+ +@code { + [Parameter] + public EventCallback SubmittedOnClick { get; set; } +} \ No newline at end of file diff --git a/DocuMed.PWA/Pages/MedicalHistoryTemplatesPage.razor b/DocuMed.PWA/Pages/MedicalHistoryTemplatesPage.razor new file mode 100644 index 0000000..158d855 --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalHistoryTemplatesPage.razor @@ -0,0 +1,63 @@ +@page "/MedicalHistoryTemplatesPage" +@inject NavigationManager NavigationManager + + + +
+
+

تمامی پیش نویس های شما

+

شما میتوانید پیش نویس جدید اضافه کنید

+
+ + افزودن +
+ +
+ + @foreach(var item in _medicalHistoryTemplates) + { + + } + +
+
+
+@code +{ + private void CreateMedicalHistoryTemplateClicked() => NavigationManager.NavigateTo("MedicalHistoryTemplateActionPage"); + private void MedicalHistoryTemplateClicked() => NavigationManager.NavigateTo("MedicalHistoryTemplateActionPage"); + private List _medicalHistoryTemplates = new(); + protected override void OnInitialized() + { + _medicalHistoryTemplates.Add(new MedicalHistoryTemplate + { + CC = "سردرد", + Section = "داخلی" + }); + _medicalHistoryTemplates.Add(new MedicalHistoryTemplate + { + CC = "بدن درد", + Section = "فیزیو" + }); + _medicalHistoryTemplates.Add(new MedicalHistoryTemplate + { + CC = "بی خوابی", + Section = "داخلی" + }); + _medicalHistoryTemplates.Add(new MedicalHistoryTemplate + { + CC = "دردپهلو", + Section = "داخلی" + }); + _medicalHistoryTemplates.Add(new MedicalHistoryTemplate + { + CC = "سوختگی", + Section = "سوختگی" + }); + _medicalHistoryTemplates.Add(new MedicalHistoryTemplate + { + CC = "شکستگی", + Section = "فیزیو" + }); + base.OnInitialized(); + } +} diff --git a/DocuMed.PWA/Pages/MedicalOrdersPage.razor b/DocuMed.PWA/Pages/MedicalOrdersPage.razor new file mode 100644 index 0000000..fab110c --- /dev/null +++ b/DocuMed.PWA/Pages/MedicalOrdersPage.razor @@ -0,0 +1,28 @@ +@page "/MedicalOrdersPage" +@inject NavigationManager NavigationManager +@inject IJSRuntime JSRuntime + + + + + +
+ +
+

بخش اوردرها به زودی اضافه میشود

+

+ بخش اوردرها در حال توسعه و پیاده سازی می باشد و به زودی در اختیار شما کاربران عزیز قرار میگیرد +

+ +
+ +
+ +@code { + + private async Task BackClicked() + { + await JSRuntime.InvokeVoidAsync("history.back"); + } +} diff --git a/DocuMed.PWA/Pages/ProfilePage.razor b/DocuMed.PWA/Pages/ProfilePage.razor new file mode 100644 index 0000000..2a732bf --- /dev/null +++ b/DocuMed.PWA/Pages/ProfilePage.razor @@ -0,0 +1,30 @@ +@page "/ProfilePage" +@using System.Reflection + + + + + + + + + + + + + + + + + +
+

نسخه برنامه

+

@_version

+
+
+ +@code { + private readonly string _version = Assembly.GetAssembly(typeof(Program))?.GetName()?.Version?.ToString() ?? string.Empty; + + +} \ No newline at end of file diff --git a/DocuMed.PWA/Program.cs b/DocuMed.PWA/Program.cs new file mode 100644 index 0000000..a1fdd71 --- /dev/null +++ b/DocuMed.PWA/Program.cs @@ -0,0 +1,14 @@ +using DocuMed.PWA; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using MudBlazor.Services; +using Toolbelt.Blazor.Extensions.DependencyInjection; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); +builder.Services.AddMudServices(); + +builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); +builder.Services.AddPWAUpdater(); +await builder.Build().RunAsync(); diff --git a/DocuMed.PWA/Properties/launchSettings.json b/DocuMed.PWA/Properties/launchSettings.json new file mode 100644 index 0000000..4c748b1 --- /dev/null +++ b/DocuMed.PWA/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "profiles": { + "http": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5254" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}" + } + }, + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://192.168.222.123:56464", + "sslPort": 0 + } + } +} \ No newline at end of file diff --git a/DocuMed.PWA/Shared/ItemTemplates/MedicalHistoryItemTemplate.razor b/DocuMed.PWA/Shared/ItemTemplates/MedicalHistoryItemTemplate.razor new file mode 100644 index 0000000..e4caf52 --- /dev/null +++ b/DocuMed.PWA/Shared/ItemTemplates/MedicalHistoryItemTemplate.razor @@ -0,0 +1,43 @@ + +
+
+ +
+

@MedicalHistory.Name

+ + +

@MedicalHistory.CC در بخش @MedicalHistory.Section

+
+
+ + + + + @MedicalHistory.Aag ساله + + + + + @MedicalHistory.Gender.ToString() + + + + + @MedicalHistory.Section + + + +
+
+
+ + + + +@code { + + [Parameter] + public MedicalHistory MedicalHistory { get; set; } = new(); + +} \ No newline at end of file diff --git a/DocuMed.PWA/Shared/ItemTemplates/MedicalHistoryQuestionTemplateItemTemplate.razor b/DocuMed.PWA/Shared/ItemTemplates/MedicalHistoryQuestionTemplateItemTemplate.razor new file mode 100644 index 0000000..fd9c6f0 --- /dev/null +++ b/DocuMed.PWA/Shared/ItemTemplates/MedicalHistoryQuestionTemplateItemTemplate.razor @@ -0,0 +1,23 @@ + + +
+
+

@Question.Title

+ + @Question.Type.ToString(); + +
+ +
+
+ +@code { + + [Parameter] + public MedicalHistoryQuestion Question { get; set; } = new MedicalHistoryQuestion(); + + [Parameter] + public EventCallback QuestionRemoved { get; set; } + +} diff --git a/DocuMed.PWA/Shared/ItemTemplates/MedicalHistoryTemplateItemTemplate.razor b/DocuMed.PWA/Shared/ItemTemplates/MedicalHistoryTemplateItemTemplate.razor new file mode 100644 index 0000000..bcb13b2 --- /dev/null +++ b/DocuMed.PWA/Shared/ItemTemplates/MedicalHistoryTemplateItemTemplate.razor @@ -0,0 +1,19 @@ + + +

@MedicalHistoryTemplate.CC

+ + +

بخش @MedicalHistoryTemplate.Section

+
+
+
+ +@code { + + [Parameter] + public MedicalHistoryTemplate MedicalHistoryTemplate { get; set; } = new(); + + [Parameter] + public EventCallback Clicked { get; set; } +} diff --git a/DocuMed.PWA/Shared/MainLayout.razor b/DocuMed.PWA/Shared/MainLayout.razor new file mode 100644 index 0000000..be3e55d --- /dev/null +++ b/DocuMed.PWA/Shared/MainLayout.razor @@ -0,0 +1,35 @@ +@inherits LayoutComponentBase + + + + + + + +
+ @Body + +
+
+
+@code +{ + MudTheme MyCustomTheme = new MudTheme() + { + Palette = new PaletteLight() + { + Primary = "#356859", + Secondary = "#FD5523", + }, + PaletteDark = new PaletteDark() + { + Primary = "#356859", + Secondary = "#FD5523", + } + }; + protected override void OnInitialized() + { + + base.OnInitialized(); + } +} diff --git a/DocuMed.PWA/Shared/MainLayout.razor.css b/DocuMed.PWA/Shared/MainLayout.razor.css new file mode 100644 index 0000000..c865427 --- /dev/null +++ b/DocuMed.PWA/Shared/MainLayout.razor.css @@ -0,0 +1,81 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row:not(.auth) { + display: none; + } + + .top-row.auth { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/DocuMed.PWA/Shared/MedicalTemplates/HourQuestionTemplate.razor b/DocuMed.PWA/Shared/MedicalTemplates/HourQuestionTemplate.razor new file mode 100644 index 0000000..4f6d752 --- /dev/null +++ b/DocuMed.PWA/Shared/MedicalTemplates/HourQuestionTemplate.razor @@ -0,0 +1,18 @@ +
+

علائم از چند ساعت پیش شروع شده است ؟

+
+ +

@HourCounter

+

ساعت

+ +
+
+ + +@code { + public int HourCounter { get; set; } + private void IncreaseHour() => HourCounter++; + private void DecreaseHour() => HourCounter--; +} \ No newline at end of file diff --git a/DocuMed.PWA/Shared/Originals/BaseButtonUi.razor b/DocuMed.PWA/Shared/Originals/BaseButtonUi.razor new file mode 100644 index 0000000..2a05b7e --- /dev/null +++ b/DocuMed.PWA/Shared/Originals/BaseButtonUi.razor @@ -0,0 +1,41 @@ + +
+ @if (Variant == Variant.Filled) + { +
+ +
+ } + else + { +
+ +
+ } +

@Content

+
+
+@code +{ + [Parameter] + public Variant Variant { get; set; } + [Parameter] + public Color Color { get; set; } + + [Parameter] + public string Content { get; set; } = string.Empty; + + [Parameter] + public string Icon { get; set; } = string.Empty; + + [Parameter] + public EventCallback OnClickCallback { get; set; } + + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary CapturedAttributes { get; set; } = new(); +} diff --git a/DocuMed.PWA/Shared/Originals/BasePageUi.razor b/DocuMed.PWA/Shared/Originals/BasePageUi.razor new file mode 100644 index 0000000..9856381 --- /dev/null +++ b/DocuMed.PWA/Shared/Originals/BasePageUi.razor @@ -0,0 +1,49 @@ +@inject IJSRuntime JSRuntime + + + +
+ @if (Header != null) + { + @Header + } + else + { + + +

@Title

+

@Description

+
+
+ + } +
+
+ @ChildContent +
+
+ +@code +{ + [Parameter] + public RenderFragment? ChildContent { get; set; } + + [Parameter] + public RenderFragment? Header { get; set; } + + [Parameter] + public string Title { get; set; } = string.Empty; + + [Parameter] + public string Description { get; set; } = string.Empty; + + + private async Task BackClicked() + { + await JSRuntime.InvokeVoidAsync("history.back"); + } +} diff --git a/DocuMed.PWA/Shared/Originals/BasePartDivider.razor b/DocuMed.PWA/Shared/Originals/BasePartDivider.razor new file mode 100644 index 0000000..87a2f64 --- /dev/null +++ b/DocuMed.PWA/Shared/Originals/BasePartDivider.razor @@ -0,0 +1,19 @@ +
+
+
@Index
+

@Title

+
+
+
+ + +@code { + [Parameter] + public string Title {get;set;} = string.Empty; + [Parameter] + public int Index {get;set;} + + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary CapturedAttributes { get; set; } = new(); + +} \ No newline at end of file diff --git a/DocuMed.PWA/_Imports.razor b/DocuMed.PWA/_Imports.razor new file mode 100644 index 0000000..1465511 --- /dev/null +++ b/DocuMed.PWA/_Imports.razor @@ -0,0 +1,18 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.JSInterop +@using DocuMed.PWA +@using DocuMed.PWA.Shared +@using MudBlazor +@using DocuMed.PWA.Shared.Originals +@using DocuMed.PWA.Shared.ItemTemplates +@using Microsoft.AspNetCore.Authorization +@using Blazorise.LottieAnimation +@using DocuMed.PWA.Shared.MedicalTemplates +@using DocuMed.PWA.Pages.MedicalHistoryTemplateActionParts +@using DocuMed.PWA.Pages.MedicalHistoryActionParts \ No newline at end of file diff --git a/DocuMed.PWA/package-lock.json b/DocuMed.PWA/package-lock.json new file mode 100644 index 0000000..ad3c29c --- /dev/null +++ b/DocuMed.PWA/package-lock.json @@ -0,0 +1,1395 @@ +{ + "name": "documed.pwa", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "documed.pwa", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "autoprefixer": "^10.4.16", + "postcss": "^8.4.30", + "postcss-cli": "^10.1.0", + "tailwindcss": "^3.3.3" + }, + "devDependencies": {} + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.526", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.526.tgz", + "integrity": "sha512-tjjTMjmZAx1g6COrintLTa2/jcafYKxKoiEkdQOrVdbLaHh2wCt2nsAF8ZHweezkrP+dl/VG9T5nabcYoo0U5Q==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-cli": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.1.0.tgz", + "integrity": "sha512-Zu7PLORkE9YwNdvOeOVKPmWghprOtjFQU3srMUGbdz3pHJiFh7yZ4geiZFMkjMfB0mtTFR3h8RemR62rPkbOPA==", + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^11.0.0", + "get-stdin": "^9.0.0", + "globby": "^13.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^4.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-reporter": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", + "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.12.tgz", + "integrity": "sha512-tE1smlR58jxbFMtrMpFNRmsrOXlpNXss965T1CrpwuZUzUAg/TBQc94SpyhDLSzrqrJS9xTRBthnZAGcE1oaxg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/DocuMed.PWA/package.json b/DocuMed.PWA/package.json new file mode 100644 index 0000000..9794cfc --- /dev/null +++ b/DocuMed.PWA/package.json @@ -0,0 +1,17 @@ +{ + "dependencies": { + "autoprefixer": "^10.4.16", + "postcss": "^8.4.30", + "postcss-cli": "^10.1.0", + "tailwindcss": "^3.3.3" + }, + "name": "documed.pwa", + "version": "1.0.0", + "main": "tailwind.config.js", + "scripts": { + "buildcss": "postcss wwwroot/css/app.css -o wwwroot/css/app.min.css" + }, + "author": "", + "license": "ISC", + "description": "" +} diff --git a/DocuMed.PWA/postcss.config.js b/DocuMed.PWA/postcss.config.js new file mode 100644 index 0000000..b8bdbd9 --- /dev/null +++ b/DocuMed.PWA/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } + } \ No newline at end of file diff --git a/DocuMed.PWA/tailwind.config.js b/DocuMed.PWA/tailwind.config.js new file mode 100644 index 0000000..ba45062 --- /dev/null +++ b/DocuMed.PWA/tailwind.config.js @@ -0,0 +1,54 @@ +const colors = require('tailwindcss/colors'); +const { colors: defaultColors } = require('tailwindcss/defaultTheme') + +module.exports = { + + darkMode: false, + content: ["./**/*.{razor,html,cshtml}"], + theme: { + fontSize: { + xs: '.75rem', + sm: '.875rem', + tiny: '.875rem', + base: '1rem', + lg: '1.125rem', + xl: '1.25rem', + '2xl': '1.5rem', + '3xl': '1.875rem', + '4xl': '2.25rem', + '5xl': '3rem', + '6xl': '4rem', + '7xl': '5rem' + }, + fontFamily: { + "iranyekan": ["'iranyekan'"], + }, + extend: { + colors: { + secondary: { + 100: "#0a202b", + 200: "#0f222b", + 300: "#162830", + 400: "#192930", + 500: "#1c2b31", + 600: "#1e2b30", + 700: "#1d272b", + 800: "#21292c", + 900: "#212729", + }, + visa2: { + 100: "#F0BC5E", + 200: "#eca521", + }, + }, + } + } +} + +//purge: { +// enabled: true, +// content: [ +// './**/*.html', +// './**/*.razor' +// ], +// }, \ No newline at end of file diff --git a/DocuMed.PWA/wwwroot/assets/fonts/Shabnam-Bold.ttf b/DocuMed.PWA/wwwroot/assets/fonts/Shabnam-Bold.ttf new file mode 100644 index 0000000..dbae563 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/Shabnam-Bold.ttf differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/Shabnam.ttf b/DocuMed.PWA/wwwroot/assets/fonts/Shabnam.ttf new file mode 100644 index 0000000..7861e3f Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/Shabnam.ttf differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebblackfanum.eot b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebblackfanum.eot new file mode 100644 index 0000000..c3ee485 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebblackfanum.eot differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebboldfanum.eot b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebboldfanum.eot new file mode 100644 index 0000000..e50057b Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebboldfanum.eot differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebextrablackfanum.eot b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebextrablackfanum.eot new file mode 100644 index 0000000..e393149 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebextrablackfanum.eot differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebextraboldfanum.eot b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebextraboldfanum.eot new file mode 100644 index 0000000..bf5a180 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebextraboldfanum.eot differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanweblightfanum.eot b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanweblightfanum.eot new file mode 100644 index 0000000..05181ba Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanweblightfanum.eot differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebmediumfanum.eot b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebmediumfanum.eot new file mode 100644 index 0000000..f162420 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebmediumfanum.eot differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebregularfanum.eot b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebregularfanum.eot new file mode 100644 index 0000000..9c0463b Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebregularfanum.eot differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebthinfanum.eot b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebthinfanum.eot new file mode 100644 index 0000000..302b1df Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/eot/iranyekanwebthinfanum.eot differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebblackfanum.svg b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebblackfanum.svg new file mode 100644 index 0000000..c791c06 --- /dev/null +++ b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebblackfanum.svg @@ -0,0 +1,1475 @@ + + + + +Created by FontForge 20161003 at Mon Dec 17 00:05:28 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebboldfanum.svg b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebboldfanum.svg new file mode 100644 index 0000000..fe47d8d --- /dev/null +++ b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebboldfanum.svg @@ -0,0 +1,1578 @@ + + + + +Created by FontForge 20161003 at Mon Dec 17 00:05:43 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebextrablackfanum.svg b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebextrablackfanum.svg new file mode 100644 index 0000000..cab035f --- /dev/null +++ b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebextrablackfanum.svg @@ -0,0 +1,1489 @@ + + + + +Created by FontForge 20161003 at Mon Dec 17 00:05:52 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebextraboldfanum.svg b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebextraboldfanum.svg new file mode 100644 index 0000000..62749a2 --- /dev/null +++ b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebextraboldfanum.svg @@ -0,0 +1,1478 @@ + + + + +Created by FontForge 20161003 at Mon Dec 17 00:06:01 2018 + By www-data +Copyright (c) 2018 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanweblightfanum.svg b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanweblightfanum.svg new file mode 100644 index 0000000..2034329 --- /dev/null +++ b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanweblightfanum.svg @@ -0,0 +1,1628 @@ + + + + +Created by FontForge 20161003 at Mon Dec 17 00:06:12 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebmediumfanum.svg b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebmediumfanum.svg new file mode 100644 index 0000000..58a320f --- /dev/null +++ b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebmediumfanum.svg @@ -0,0 +1,1584 @@ + + + + +Created by FontForge 20161003 at Mon Dec 17 00:06:27 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebregularfanum.svg b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebregularfanum.svg new file mode 100644 index 0000000..39b11b5 --- /dev/null +++ b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebregularfanum.svg @@ -0,0 +1,1560 @@ + + + + +Created by FontForge 20161003 at Mon Dec 17 00:06:43 2018 + By www-data +Copyright (c) 2019 by www.fontiran.com (Moslem Ebrahimi). All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebthinfanum.svg b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebthinfanum.svg new file mode 100644 index 0000000..8ad9b7d --- /dev/null +++ b/DocuMed.PWA/wwwroot/assets/fonts/svg/iranyekanwebthinfanum.svg @@ -0,0 +1,1651 @@ + + + + +Created by FontForge 20161003 at Mon Dec 17 00:06:54 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebblackfanum.ttf b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebblackfanum.ttf new file mode 100644 index 0000000..39ece30 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebblackfanum.ttf differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebboldfanum.ttf b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebboldfanum.ttf new file mode 100644 index 0000000..a68e403 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebboldfanum.ttf differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebextrablackfanum.ttf b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebextrablackfanum.ttf new file mode 100644 index 0000000..6218901 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebextrablackfanum.ttf differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebextraboldfanum.ttf b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebextraboldfanum.ttf new file mode 100644 index 0000000..ec35796 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebextraboldfanum.ttf differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanweblightfanum.ttf b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanweblightfanum.ttf new file mode 100644 index 0000000..7a89cfa Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanweblightfanum.ttf differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebmediumfanum.ttf b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebmediumfanum.ttf new file mode 100644 index 0000000..551a67f Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebmediumfanum.ttf differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebregularfanum.ttf b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebregularfanum.ttf new file mode 100644 index 0000000..72d5808 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebregularfanum.ttf differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebthinfanum.ttf b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebthinfanum.ttf new file mode 100644 index 0000000..ab55482 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/ttf/iranyekanwebthinfanum.ttf differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebblackfanum.woff b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebblackfanum.woff new file mode 100644 index 0000000..760df99 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebblackfanum.woff differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebboldfanum.woff b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebboldfanum.woff new file mode 100644 index 0000000..07f9756 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebboldfanum.woff differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebextrablackfanum.woff b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebextrablackfanum.woff new file mode 100644 index 0000000..6b4943d Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebextrablackfanum.woff differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebextraboldfanum.woff b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebextraboldfanum.woff new file mode 100644 index 0000000..c04651a Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebextraboldfanum.woff differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanweblightfanum.woff b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanweblightfanum.woff new file mode 100644 index 0000000..9e6d42c Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanweblightfanum.woff differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebmediumfanum.woff b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebmediumfanum.woff new file mode 100644 index 0000000..8fe8e40 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebmediumfanum.woff differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebregularfanum.woff b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebregularfanum.woff new file mode 100644 index 0000000..3a07dcc Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebregularfanum.woff differ diff --git a/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebthinfanum.woff b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebthinfanum.woff new file mode 100644 index 0000000..2c3b845 Binary files /dev/null and b/DocuMed.PWA/wwwroot/assets/fonts/woff/iranyekanwebthinfanum.woff differ diff --git a/DocuMed.PWA/wwwroot/css/app.css b/DocuMed.PWA/wwwroot/css/app.css new file mode 100644 index 0000000..679ab34 --- /dev/null +++ b/DocuMed.PWA/wwwroot/css/app.css @@ -0,0 +1,191 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: bold; + src: url('../assets/fonts/eot/iranyekanwebboldfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebboldfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebboldfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebboldfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 100; + src: url('../assets/fonts/eot/iranyekanwebthinfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebthinfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebthinfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebthinfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 300; + src: url('../assets/fonts/eot/iranyekanweblightfanum.eot'); + src: url('../assets/fonts/eot/iranyekanweblightfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanweblightfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanweblightfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: normal; + src: url('../assets/fonts/eot/iranyekanwebregularfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebregularfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebregularfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebregularfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 500; + src: url('../assets/fonts/eot/iranyekanwebmediumfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebmediumfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebmediumfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebmediumfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 800; + src: url('../assets/fonts/eot/iranyekanwebextraboldfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebextraboldfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebextraboldfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebextraboldfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 900; + src: url('../assets/fonts/eot/iranyekanwebblackfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebblackfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebblackfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebblackfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 950; + src: url('../assets/fonts/eot/iranyekanwebextrablackfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebextrablackfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebextrablackfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebextrablackfanum.ttf') format('truetype'); +} + +@layer base { + * { + font-family: iranyekan; + } + + :root { + --color-primary: rgba(53, 104, 89, 1); + --color-secondary: rgba(253, 85, 35, 1); + --color-medicalhistory: rgba(253, 216, 53, 1); + --color-medicalhistory-template: rgba(41, 187, 189, 1); + } +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } \ No newline at end of file diff --git a/DocuMed.PWA/wwwroot/css/app.min.css b/DocuMed.PWA/wwwroot/css/app.min.css new file mode 100644 index 0000000..1ab255a --- /dev/null +++ b/DocuMed.PWA/wwwroot/css/app.min.css @@ -0,0 +1,1223 @@ +/* +! tailwindcss v3.3.3 | MIT License | https://tailwindcss.com +*//* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: #e5e7eb; /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +*/ + +html { + line-height: 1.5; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -moz-tab-size: 4; /* 3 */ + -o-tab-size: 4; + tab-size: 4; /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ + font-feature-settings: normal; /* 5 */ + font-variation-settings: normal; /* 6 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; /* 1 */ + line-height: inherit; /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-feature-settings: inherit; /* 1 */ + font-variation-settings: inherit; /* 1 */ + font-size: 100%; /* 1 */ + font-weight: inherit; /* 1 */ + line-height: inherit; /* 1 */ + color: inherit; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; /* 1 */ + background-color: transparent; /* 2 */ + background-image: none; /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; /* 1 */ + color: #9ca3af; /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; /* 1 */ + color: #9ca3af; /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ +[hidden] { + display: none; +} + * { + font-family: iranyekan; + } + + :root { + --color-primary: rgba(53, 104, 89, 1); + --color-secondary: rgba(253, 85, 35, 1); + --color-medicalhistory: rgba(253, 216, 53, 1); + --color-medicalhistory-template: rgba(41, 187, 189, 1); + } + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} +.fixed { + position: fixed; +} +.bottom-0 { + bottom: 0px; +} +.left-0 { + left: 0px; +} +.z-50 { + z-index: 50; +} +.m-auto { + margin: auto; +} +.mx-1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} +.mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} +.mx-3 { + margin-left: 0.75rem; + margin-right: 0.75rem; +} +.mx-3\.5 { + margin-left: 0.875rem; + margin-right: 0.875rem; +} +.mx-5 { + margin-left: 1.25rem; + margin-right: 1.25rem; +} +.mx-7 { + margin-left: 1.75rem; + margin-right: 1.75rem; +} +.mx-auto { + margin-left: auto; + margin-right: auto; +} +.my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} +.my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} +.my-auto { + margin-top: auto; + margin-bottom: auto; +} +.-mb-10 { + margin-bottom: -2.5rem; +} +.-mb-3 { + margin-bottom: -0.75rem; +} +.-mb-8 { + margin-bottom: -2rem; +} +.-ml-6 { + margin-left: -1.5rem; +} +.-mr-2 { + margin-right: -0.5rem; +} +.-mt-1 { + margin-top: -0.25rem; +} +.-mt-2 { + margin-top: -0.5rem; +} +.-mt-3 { + margin-top: -0.75rem; +} +.-mt-5 { + margin-top: -1.25rem; +} +.-mt-8 { + margin-top: -2rem; +} +.mb-0 { + margin-bottom: 0px; +} +.mb-0\.5 { + margin-bottom: 0.125rem; +} +.mb-1 { + margin-bottom: 0.25rem; +} +.mb-2 { + margin-bottom: 0.5rem; +} +.mb-3 { + margin-bottom: 0.75rem; +} +.mb-8 { + margin-bottom: 2rem; +} +.ml-1 { + margin-left: 0.25rem; +} +.ml-2 { + margin-left: 0.5rem; +} +.ml-3 { + margin-left: 0.75rem; +} +.ml-4 { + margin-left: 1rem; +} +.ml-5 { + margin-left: 1.25rem; +} +.mr-1 { + margin-right: 0.25rem; +} +.mr-2 { + margin-right: 0.5rem; +} +.mr-5 { + margin-right: 1.25rem; +} +.mr-auto { + margin-right: auto; +} +.mt-1 { + margin-top: 0.25rem; +} +.mt-1\.5 { + margin-top: 0.375rem; +} +.mt-2 { + margin-top: 0.5rem; +} +.mt-2\.5 { + margin-top: 0.625rem; +} +.mt-3 { + margin-top: 0.75rem; +} +.mt-4 { + margin-top: 1rem; +} +.mt-5 { + margin-top: 1.25rem; +} +.mt-9 { + margin-top: 2.25rem; +} +.mt-auto { + margin-top: auto; +} +.flex { + display: flex; +} +.inline-flex { + display: inline-flex; +} +.grid { + display: grid; +} +.h-10 { + height: 2.5rem; +} +.h-12 { + height: 3rem; +} +.h-5 { + height: 1.25rem; +} +.h-60 { + height: 15rem; +} +.h-7 { + height: 1.75rem; +} +.h-72 { + height: 18rem; +} +.h-8 { + height: 2rem; +} +.h-\[1px\] { + height: 1px; +} +.h-\[23rem\] { + height: 23rem; +} +.h-full { + height: 100%; +} +.h-screen { + height: 100vh; +} +.w-10 { + width: 2.5rem; +} +.w-12 { + width: 3rem; +} +.w-2 { + width: 0.5rem; +} +.w-5 { + width: 1.25rem; +} +.w-60 { + width: 15rem; +} +.w-7 { + width: 1.75rem; +} +.w-72 { + width: 18rem; +} +.w-8 { + width: 2rem; +} +.w-\[23rem\] { + width: 23rem; +} +.w-fit { + width: -moz-fit-content; + width: fit-content; +} +.w-full { + width: 100%; +} +.w-screen { + width: 100vw; +} +.max-w-lg { + max-width: 32rem; +} +.flex-none { + flex: none; +} +.grow { + flex-grow: 1; +} +.basis-1\/12 { + flex-basis: 8.333333%; +} +.basis-2\/4 { + flex-basis: 50%; +} +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} +.grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} +.grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} +.grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} +.flex-row { + flex-direction: row; +} +.flex-col { + flex-direction: column; +} +.items-center { + align-items: center; +} +.justify-center { + justify-content: center; +} +.justify-stretch { + justify-content: stretch; +} +.gap-1 { + gap: 0.25rem; +} +.gap-2 { + gap: 0.5rem; +} +.gap-3 { + gap: 0.75rem; +} +.overflow-hidden { + overflow: hidden; +} +.overflow-x-hidden { + overflow-x: hidden; +} +.overflow-y-scroll { + overflow-y: scroll; +} +.rounded-full { + border-radius: 9999px; +} +.rounded-lg { + border-radius: 0.5rem; +} +.rounded-md { + border-radius: 0.375rem; +} +.rounded-r-lg { + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; +} +.rounded-t-2xl { + border-top-left-radius: 1rem; + border-top-right-radius: 1rem; +} +.rounded-t-xl { + border-top-left-radius: 0.75rem; + border-top-right-radius: 0.75rem; +} +.border-\[--color-medicalhistory\] { + border-color: var(--color-medicalhistory); +} +.bg-\[\#000000\] { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} +.bg-\[\#356859\] { + --tw-bg-opacity: 1; + background-color: rgb(53 104 89 / var(--tw-bg-opacity)); +} +.bg-\[\#EEEEEE\] { + --tw-bg-opacity: 1; + background-color: rgb(238 238 238 / var(--tw-bg-opacity)); +} +.bg-\[\#FFDACF\] { + --tw-bg-opacity: 1; + background-color: rgb(255 218 207 / var(--tw-bg-opacity)); +} +.bg-\[\#FFFBE6\] { + --tw-bg-opacity: 1; + background-color: rgb(255 251 230 / var(--tw-bg-opacity)); +} +.bg-\[--color-medicalhistory\] { + background-color: var(--color-medicalhistory); +} +.bg-\[--color-primary\] { + background-color: var(--color-primary); +} +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} +.bg-gray-300 { + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity)); +} +.bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity)); +} +.bg-gray-700 { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); +} +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} +.bg-opacity-20 { + --tw-bg-opacity: 0.2; +} +.bg-opacity-70 { + --tw-bg-opacity: 0.7; +} +.p-5 { + padding: 1.25rem; +} +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} +.py-0 { + padding-top: 0px; + padding-bottom: 0px; +} +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} +.pb-10 { + padding-bottom: 2.5rem; +} +.pb-20 { + padding-bottom: 5rem; +} +.pb-3 { + padding-bottom: 0.75rem; +} +.pt-1 { + padding-top: 0.25rem; +} +.pt-2 { + padding-top: 0.5rem; +} +.pt-4 { + padding-top: 1rem; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.font-iranyekan { + font-family: 'iranyekan'; +} +.text-4xl { + font-size: 2.25rem; +} +.text-base { + font-size: 1rem; +} +.text-lg { + font-size: 1.125rem; +} +.text-sm { + font-size: .875rem; +} +.text-xl { + font-size: 1.25rem; +} +.text-xs { + font-size: .75rem; +} +.font-bold { + font-weight: 700; +} +.font-extrabold { + font-weight: 800; +} +.font-light { + font-weight: 300; +} +.font-medium { + font-weight: 500; +} +.text-\[\#356859\] { + --tw-text-opacity: 1; + color: rgb(53 104 89 / var(--tw-text-opacity)); +} +.text-\[\#37966F\] { + --tw-text-opacity: 1; + color: rgb(55 150 111 / var(--tw-text-opacity)); +} +.text-\[\#D03405\] { + --tw-text-opacity: 1; + color: rgb(208 52 5 / var(--tw-text-opacity)); +} +.text-\[--color-medicalhistory\] { + color: var(--color-medicalhistory); +} +.text-\[--color-primary\] { + color: var(--color-primary); +} +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity)); +} +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} +.text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} +.drop-shadow-md { + --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06)); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: bold; + src: url('../assets/fonts/eot/iranyekanwebboldfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebboldfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebboldfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebboldfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 100; + src: url('../assets/fonts/eot/iranyekanwebthinfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebthinfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebthinfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebthinfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 300; + src: url('../assets/fonts/eot/iranyekanweblightfanum.eot'); + src: url('../assets/fonts/eot/iranyekanweblightfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanweblightfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanweblightfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: normal; + src: url('../assets/fonts/eot/iranyekanwebregularfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebregularfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebregularfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebregularfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 500; + src: url('../assets/fonts/eot/iranyekanwebmediumfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebmediumfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebmediumfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebmediumfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 800; + src: url('../assets/fonts/eot/iranyekanwebextraboldfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebextraboldfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebextraboldfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebextraboldfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 900; + src: url('../assets/fonts/eot/iranyekanwebblackfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebblackfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebblackfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebblackfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 950; + src: url('../assets/fonts/eot/iranyekanwebextrablackfanum.eot'); + src: url('../assets/fonts/eot/iranyekanwebextrablackfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebextrablackfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebextrablackfanum.ttf') format('truetype'); +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } + + .group:hover .group-hover\:text-\[--color-primary\] { + color: var(--color-primary); +} + + @media (min-width: 640px) { + + .sm\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .sm\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + + @media (min-width: 768px) { + + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} + + @media (min-width: 1280px) { + + .xl\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} \ No newline at end of file diff --git a/DocuMed.PWA/wwwroot/css/app.output.css b/DocuMed.PWA/wwwroot/css/app.output.css new file mode 100644 index 0000000..101b707 --- /dev/null +++ b/DocuMed.PWA/wwwroot/css/app.output.css @@ -0,0 +1,1460 @@ +/* +! tailwindcss v3.3.3 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +* { + font-family: iranyekan; +} + +:root { + --color-primary: rgba(53, 104, 89, 1); + --color-secondary: rgba(253, 85, 35, 1); + --color-medicalhistory: rgba(253, 216, 53, 1); + --color-medicalhistory-template: rgba(41, 187, 189, 1); +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.fixed { + position: fixed; +} + +.bottom-0 { + bottom: 0px; +} + +.left-0 { + left: 0px; +} + +.z-50 { + z-index: 50; +} + +.m-auto { + margin: auto; +} + +.mx-1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} + +.mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} + +.mx-3 { + margin-left: 0.75rem; + margin-right: 0.75rem; +} + +.mx-3\.5 { + margin-left: 0.875rem; + margin-right: 0.875rem; +} + +.mx-5 { + margin-left: 1.25rem; + margin-right: 1.25rem; +} + +.mx-7 { + margin-left: 1.75rem; + margin-right: 1.75rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} + +.my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.my-auto { + margin-top: auto; + margin-bottom: auto; +} + +.-mb-10 { + margin-bottom: -2.5rem; +} + +.-mb-3 { + margin-bottom: -0.75rem; +} + +.-mb-8 { + margin-bottom: -2rem; +} + +.-ml-6 { + margin-left: -1.5rem; +} + +.-mr-2 { + margin-right: -0.5rem; +} + +.-mt-1 { + margin-top: -0.25rem; +} + +.-mt-2 { + margin-top: -0.5rem; +} + +.-mt-3 { + margin-top: -0.75rem; +} + +.-mt-5 { + margin-top: -1.25rem; +} + +.-mt-8 { + margin-top: -2rem; +} + +.mb-0 { + margin-bottom: 0px; +} + +.mb-0\.5 { + margin-bottom: 0.125rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.ml-1 { + margin-left: 0.25rem; +} + +.ml-2 { + margin-left: 0.5rem; +} + +.ml-3 { + margin-left: 0.75rem; +} + +.ml-4 { + margin-left: 1rem; +} + +.ml-5 { + margin-left: 1.25rem; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.mr-5 { + margin-right: 1.25rem; +} + +.mr-auto { + margin-right: auto; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-1\.5 { + margin-top: 0.375rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-2\.5 { + margin-top: 0.625rem; +} + +.mt-3 { + margin-top: 0.75rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-5 { + margin-top: 1.25rem; +} + +.mt-9 { + margin-top: 2.25rem; +} + +.mt-auto { + margin-top: auto; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.grid { + display: grid; +} + +.h-10 { + height: 2.5rem; +} + +.h-12 { + height: 3rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-60 { + height: 15rem; +} + +.h-7 { + height: 1.75rem; +} + +.h-72 { + height: 18rem; +} + +.h-8 { + height: 2rem; +} + +.h-\[1px\] { + height: 1px; +} + +.h-\[23rem\] { + height: 23rem; +} + +.h-full { + height: 100%; +} + +.h-screen { + height: 100vh; +} + +.w-10 { + width: 2.5rem; +} + +.w-12 { + width: 3rem; +} + +.w-2 { + width: 0.5rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-60 { + width: 15rem; +} + +.w-7 { + width: 1.75rem; +} + +.w-72 { + width: 18rem; +} + +.w-8 { + width: 2rem; +} + +.w-\[23rem\] { + width: 23rem; +} + +.w-fit { + width: -moz-fit-content; + width: fit-content; +} + +.w-full { + width: 100%; +} + +.w-screen { + width: 100vw; +} + +.max-w-lg { + max-width: 32rem; +} + +.flex-none { + flex: none; +} + +.grow { + flex-grow: 1; +} + +.basis-1\/12 { + flex-basis: 8.333333%; +} + +.basis-2\/4 { + flex-basis: 50%; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.flex-row { + flex-direction: row; +} + +.flex-col { + flex-direction: column; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.justify-stretch { + justify-content: stretch; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-hidden { + overflow-x: hidden; +} + +.overflow-y-scroll { + overflow-y: scroll; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-r-lg { + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; +} + +.rounded-t-2xl { + border-top-left-radius: 1rem; + border-top-right-radius: 1rem; +} + +.rounded-t-xl { + border-top-left-radius: 0.75rem; + border-top-right-radius: 0.75rem; +} + +.border-\[--color-medicalhistory\] { + border-color: var(--color-medicalhistory); +} + +.bg-\[\#000000\] { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.bg-\[\#356859\] { + --tw-bg-opacity: 1; + background-color: rgb(53 104 89 / var(--tw-bg-opacity)); +} + +.bg-\[\#EEEEEE\] { + --tw-bg-opacity: 1; + background-color: rgb(238 238 238 / var(--tw-bg-opacity)); +} + +.bg-\[\#FFDACF\] { + --tw-bg-opacity: 1; + background-color: rgb(255 218 207 / var(--tw-bg-opacity)); +} + +.bg-\[\#FFFBE6\] { + --tw-bg-opacity: 1; + background-color: rgb(255 251 230 / var(--tw-bg-opacity)); +} + +.bg-\[--color-medicalhistory\] { + background-color: var(--color-medicalhistory); +} + +.bg-\[--color-primary\] { + background-color: var(--color-primary); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.bg-gray-300 { + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity)); +} + +.bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity)); +} + +.bg-gray-700 { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-opacity-20 { + --tw-bg-opacity: 0.2; +} + +.bg-opacity-70 { + --tw-bg-opacity: 0.7; +} + +.p-5 { + padding: 1.25rem; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-0 { + padding-top: 0px; + padding-bottom: 0px; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.pb-10 { + padding-bottom: 2.5rem; +} + +.pb-20 { + padding-bottom: 5rem; +} + +.pb-3 { + padding-bottom: 0.75rem; +} + +.pt-1 { + padding-top: 0.25rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.text-center { + text-align: center; +} + +.text-justify { + text-align: justify; +} + +.font-iranyekan { + font-family: 'iranyekan'; +} + +.text-4xl { + font-size: 2.25rem; +} + +.text-base { + font-size: 1rem; +} + +.text-lg { + font-size: 1.125rem; +} + +.text-sm { + font-size: .875rem; +} + +.text-xl { + font-size: 1.25rem; +} + +.text-xs { + font-size: .75rem; +} + +.font-bold { + font-weight: 700; +} + +.font-extrabold { + font-weight: 800; +} + +.font-light { + font-weight: 300; +} + +.font-medium { + font-weight: 500; +} + +.text-\[\#356859\] { + --tw-text-opacity: 1; + color: rgb(53 104 89 / var(--tw-text-opacity)); +} + +.text-\[\#37966F\] { + --tw-text-opacity: 1; + color: rgb(55 150 111 / var(--tw-text-opacity)); +} + +.text-\[\#D03405\] { + --tw-text-opacity: 1; + color: rgb(208 52 5 / var(--tw-text-opacity)); +} + +.text-\[--color-medicalhistory\] { + color: var(--color-medicalhistory); +} + +.text-\[--color-primary\] { + color: var(--color-primary); +} + +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity)); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} + +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.drop-shadow-md { + --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06)); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +@font-face { + font-family: iranyekan; + + font-style: normal; + + font-weight: bold; + + src: url('../assets/fonts/eot/iranyekanwebboldfanum.eot'); + + src: url('../assets/fonts/eot/iranyekanwebboldfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebboldfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebboldfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + + font-style: normal; + + font-weight: 100; + + src: url('../assets/fonts/eot/iranyekanwebthinfanum.eot'); + + src: url('../assets/fonts/eot/iranyekanwebthinfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebthinfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebthinfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + + font-style: normal; + + font-weight: 300; + + src: url('../assets/fonts/eot/iranyekanweblightfanum.eot'); + + src: url('../assets/fonts/eot/iranyekanweblightfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanweblightfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanweblightfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + + font-style: normal; + + font-weight: normal; + + src: url('../assets/fonts/eot/iranyekanwebregularfanum.eot'); + + src: url('../assets/fonts/eot/iranyekanwebregularfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebregularfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebregularfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + + font-style: normal; + + font-weight: 500; + + src: url('../assets/fonts/eot/iranyekanwebmediumfanum.eot'); + + src: url('../assets/fonts/eot/iranyekanwebmediumfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebmediumfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebmediumfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + + font-style: normal; + + font-weight: 800; + + src: url('../assets/fonts/eot/iranyekanwebextraboldfanum.eot'); + + src: url('../assets/fonts/eot/iranyekanwebextraboldfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebextraboldfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebextraboldfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + + font-style: normal; + + font-weight: 900; + + src: url('../assets/fonts/eot/iranyekanwebblackfanum.eot'); + + src: url('../assets/fonts/eot/iranyekanwebblackfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebblackfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebblackfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + + font-style: normal; + + font-weight: 950; + + src: url('../assets/fonts/eot/iranyekanwebextrablackfanum.eot'); + + src: url('../assets/fonts/eot/iranyekanwebextrablackfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../assets/fonts/woff/iranyekanwebextrablackfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../assets/fonts/ttf/iranyekanwebextrablackfanum.ttf') format('truetype'); +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + +.blazor-error-boundary::after { + content: "An error has occurred." +} + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + +.loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); +} + +.loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; +} + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + +.loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); +} + +.group:hover .group-hover\:text-\[--color-primary\] { + color: var(--color-primary); +} + +@media (min-width: 640px) { + .sm\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .sm\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +@media (min-width: 768px) { + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} + +@media (min-width: 1280px) { + .xl\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} \ No newline at end of file diff --git a/DocuMed.PWA/wwwroot/css/fontiran.css b/DocuMed.PWA/wwwroot/css/fontiran.css new file mode 100644 index 0000000..82e198f --- /dev/null +++ b/DocuMed.PWA/wwwroot/css/fontiran.css @@ -0,0 +1,97 @@ +/** +* +* Name: IRANYekan Font +* Version: 3.0 +* Author: Moslem Ebrahimi (moslemebrahimi.com) +* Created on: Dec 20, 2018 +* Updated on: Dec 20, 2018 +* Website: http://fontiran.com +* Copyright: Commercial/Proprietary Software +-------------------------------------------------------------------------------------- +فونت ایران یکان یک نرم افزار مالکیتی محسوب می شود. جهت آگاهی از قوانین استفاده از این فونت ها لطفا به وب سایت (فونت ایران دات کام) مراجعه نمایید +-------------------------------------------------------------------------------------- +IRANYekan fonts are considered a proprietary software. To gain information about the laws regarding the use of these fonts, please visit www.fontiran.com +-------------------------------------------------------------------------------------- +This set of fonts are used in this project under the license: (.....) +-------------------------------------------------------------------------------------- +* +**/ +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: bold; + src: url('../fonts/eot/iranyekanwebboldfanum.eot'); + src: url('../fonts/eot/iranyekanwebboldfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff/iranyekanwebboldfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/iranyekanwebboldfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 100; + src: url('../fonts/eot/iranyekanwebthinfanum.eot'); + src: url('../fonts/eot/iranyekanwebthinfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff/iranyekanwebthinfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/iranyekanwebthinfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 300; + src: url('../fonts/eot/iranyekanweblightfanum.eot'); + src: url('../fonts/eot/iranyekanweblightfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff/iranyekanweblightfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/iranyekanweblightfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: normal; + src: url('../fonts/eot/iranyekanwebregularfanum.eot'); + src: url('../fonts/eot/iranyekanwebregularfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff/iranyekanwebregularfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/iranyekanwebregularfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 500; + src: url('../fonts/eot/iranyekanwebmediumfanum.eot'); + src: url('../fonts/eot/iranyekanwebmediumfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff/iranyekanwebmediumfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/iranyekanwebmediumfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 800; + src: url('../fonts/eot/iranyekanwebextraboldfanum.eot'); + src: url('../fonts/eot/iranyekanwebextraboldfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff/iranyekanwebextraboldfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/iranyekanwebextraboldfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 900; + src: url('../fonts/eot/iranyekanwebblackfanum.eot'); + src: url('../fonts/eot/iranyekanwebblackfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff/iranyekanwebblackfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/iranyekanwebblackfanum.ttf') format('truetype'); +} + +@font-face { + font-family: iranyekan; + font-style: normal; + font-weight: 950; + src: url('../fonts/eot/iranyekanwebextrablackfanum.eot'); + src: url('../fonts/eot/iranyekanwebextrablackfanum.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff/iranyekanwebextrablackfanum.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/iranyekanwebextrablackfanum.ttf') format('truetype'); +} \ No newline at end of file diff --git a/DocuMed.PWA/wwwroot/css/open-iconic/FONT-LICENSE b/DocuMed.PWA/wwwroot/css/open-iconic/FONT-LICENSE new file mode 100644 index 0000000..a1dc03f --- /dev/null +++ b/DocuMed.PWA/wwwroot/css/open-iconic/FONT-LICENSE @@ -0,0 +1,86 @@ +SIL OPEN FONT LICENSE Version 1.1 + +Copyright (c) 2014 Waybury + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/DocuMed.PWA/wwwroot/css/open-iconic/ICON-LICENSE b/DocuMed.PWA/wwwroot/css/open-iconic/ICON-LICENSE new file mode 100644 index 0000000..2199f4a --- /dev/null +++ b/DocuMed.PWA/wwwroot/css/open-iconic/ICON-LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Waybury + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/DocuMed.PWA/wwwroot/css/open-iconic/README.md b/DocuMed.PWA/wwwroot/css/open-iconic/README.md new file mode 100644 index 0000000..e34bd86 --- /dev/null +++ b/DocuMed.PWA/wwwroot/css/open-iconic/README.md @@ -0,0 +1,114 @@ +[Open Iconic v1.1.1](https://github.com/iconic/open-iconic) +=========== + +### Open Iconic is the open source sibling of [Iconic](https://github.com/iconic/open-iconic). It is a hyper-legible collection of 223 icons with a tiny footprint—ready to use with Bootstrap and Foundation. [View the collection](https://github.com/iconic/open-iconic) + + + +## What's in Open Iconic? + +* 223 icons designed to be legible down to 8 pixels +* Super-light SVG files - 61.8 for the entire set +* SVG sprite—the modern replacement for icon fonts +* Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats +* Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats +* PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px. + + +## Getting Started + +#### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](https://github.com/iconic/open-iconic) and [Reference](https://github.com/iconic/open-iconic) sections. + +### General Usage + +#### Using Open Iconic's SVGs + +We like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute). + +``` +icon name +``` + +#### Using Open Iconic's SVG Sprite + +Open Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack. + +Adding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `` *tag and a unique class name for each different icon in the* `` *tag.* + +``` + + + +``` + +Sizing icons only needs basic CSS. All the icons are in a square format, so just set the `` tag with equal width and height dimensions. + +``` +.icon { + width: 16px; + height: 16px; +} +``` + +Coloring icons is even easier. All you need to do is set the `fill` rule on the `` tag. + +``` +.icon-account-login { + fill: #f00; +} +``` + +To learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/). + +#### Using Open Iconic's Icon Font... + + +##### …with Bootstrap + +You can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}` + + +``` + +``` + + +``` + +``` + +##### …with Foundation + +You can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}` + +``` + +``` + + +``` + +``` + +##### …on its own + +You can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}` + +``` + +``` + +``` + +``` + + +## License + +### Icons + +All code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT). + +### Fonts + +All fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web). diff --git a/DocuMed.PWA/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css b/DocuMed.PWA/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css new file mode 100644 index 0000000..4664f2e --- /dev/null +++ b/DocuMed.PWA/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css @@ -0,0 +1 @@ +@font-face{font-family:Icons;src:url(../fonts/open-iconic.eot);src:url(../fonts/open-iconic.eot?#iconic-sm) format('embedded-opentype'),url(../fonts/open-iconic.woff) format('woff'),url(../fonts/open-iconic.ttf) format('truetype'),url(../fonts/open-iconic.otf) format('opentype'),url(../fonts/open-iconic.svg#iconic-sm) format('svg');font-weight:400;font-style:normal}.oi{position:relative;top:1px;display:inline-block;speak:none;font-family:Icons;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.oi:empty:before{width:1em;text-align:center;box-sizing:content-box}.oi.oi-align-center:before{text-align:center}.oi.oi-align-left:before{text-align:left}.oi.oi-align-right:before{text-align:right}.oi.oi-flip-horizontal:before{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.oi.oi-flip-vertical:before{-webkit-transform:scale(1,-1);-ms-transform:scale(-1,1);transform:scale(1,-1)}.oi.oi-flip-horizontal-vertical:before{-webkit-transform:scale(-1,-1);-ms-transform:scale(-1,1);transform:scale(-1,-1)}.oi-account-login:before{content:'\e000'}.oi-account-logout:before{content:'\e001'}.oi-action-redo:before{content:'\e002'}.oi-action-undo:before{content:'\e003'}.oi-align-center:before{content:'\e004'}.oi-align-left:before{content:'\e005'}.oi-align-right:before{content:'\e006'}.oi-aperture:before{content:'\e007'}.oi-arrow-bottom:before{content:'\e008'}.oi-arrow-circle-bottom:before{content:'\e009'}.oi-arrow-circle-left:before{content:'\e00a'}.oi-arrow-circle-right:before{content:'\e00b'}.oi-arrow-circle-top:before{content:'\e00c'}.oi-arrow-left:before{content:'\e00d'}.oi-arrow-right:before{content:'\e00e'}.oi-arrow-thick-bottom:before{content:'\e00f'}.oi-arrow-thick-left:before{content:'\e010'}.oi-arrow-thick-right:before{content:'\e011'}.oi-arrow-thick-top:before{content:'\e012'}.oi-arrow-top:before{content:'\e013'}.oi-audio-spectrum:before{content:'\e014'}.oi-audio:before{content:'\e015'}.oi-badge:before{content:'\e016'}.oi-ban:before{content:'\e017'}.oi-bar-chart:before{content:'\e018'}.oi-basket:before{content:'\e019'}.oi-battery-empty:before{content:'\e01a'}.oi-battery-full:before{content:'\e01b'}.oi-beaker:before{content:'\e01c'}.oi-bell:before{content:'\e01d'}.oi-bluetooth:before{content:'\e01e'}.oi-bold:before{content:'\e01f'}.oi-bolt:before{content:'\e020'}.oi-book:before{content:'\e021'}.oi-bookmark:before{content:'\e022'}.oi-box:before{content:'\e023'}.oi-briefcase:before{content:'\e024'}.oi-british-pound:before{content:'\e025'}.oi-browser:before{content:'\e026'}.oi-brush:before{content:'\e027'}.oi-bug:before{content:'\e028'}.oi-bullhorn:before{content:'\e029'}.oi-calculator:before{content:'\e02a'}.oi-calendar:before{content:'\e02b'}.oi-camera-slr:before{content:'\e02c'}.oi-caret-bottom:before{content:'\e02d'}.oi-caret-left:before{content:'\e02e'}.oi-caret-right:before{content:'\e02f'}.oi-caret-top:before{content:'\e030'}.oi-cart:before{content:'\e031'}.oi-chat:before{content:'\e032'}.oi-check:before{content:'\e033'}.oi-chevron-bottom:before{content:'\e034'}.oi-chevron-left:before{content:'\e035'}.oi-chevron-right:before{content:'\e036'}.oi-chevron-top:before{content:'\e037'}.oi-circle-check:before{content:'\e038'}.oi-circle-x:before{content:'\e039'}.oi-clipboard:before{content:'\e03a'}.oi-clock:before{content:'\e03b'}.oi-cloud-download:before{content:'\e03c'}.oi-cloud-upload:before{content:'\e03d'}.oi-cloud:before{content:'\e03e'}.oi-cloudy:before{content:'\e03f'}.oi-code:before{content:'\e040'}.oi-cog:before{content:'\e041'}.oi-collapse-down:before{content:'\e042'}.oi-collapse-left:before{content:'\e043'}.oi-collapse-right:before{content:'\e044'}.oi-collapse-up:before{content:'\e045'}.oi-command:before{content:'\e046'}.oi-comment-square:before{content:'\e047'}.oi-compass:before{content:'\e048'}.oi-contrast:before{content:'\e049'}.oi-copywriting:before{content:'\e04a'}.oi-credit-card:before{content:'\e04b'}.oi-crop:before{content:'\e04c'}.oi-dashboard:before{content:'\e04d'}.oi-data-transfer-download:before{content:'\e04e'}.oi-data-transfer-upload:before{content:'\e04f'}.oi-delete:before{content:'\e050'}.oi-dial:before{content:'\e051'}.oi-document:before{content:'\e052'}.oi-dollar:before{content:'\e053'}.oi-double-quote-sans-left:before{content:'\e054'}.oi-double-quote-sans-right:before{content:'\e055'}.oi-double-quote-serif-left:before{content:'\e056'}.oi-double-quote-serif-right:before{content:'\e057'}.oi-droplet:before{content:'\e058'}.oi-eject:before{content:'\e059'}.oi-elevator:before{content:'\e05a'}.oi-ellipses:before{content:'\e05b'}.oi-envelope-closed:before{content:'\e05c'}.oi-envelope-open:before{content:'\e05d'}.oi-euro:before{content:'\e05e'}.oi-excerpt:before{content:'\e05f'}.oi-expand-down:before{content:'\e060'}.oi-expand-left:before{content:'\e061'}.oi-expand-right:before{content:'\e062'}.oi-expand-up:before{content:'\e063'}.oi-external-link:before{content:'\e064'}.oi-eye:before{content:'\e065'}.oi-eyedropper:before{content:'\e066'}.oi-file:before{content:'\e067'}.oi-fire:before{content:'\e068'}.oi-flag:before{content:'\e069'}.oi-flash:before{content:'\e06a'}.oi-folder:before{content:'\e06b'}.oi-fork:before{content:'\e06c'}.oi-fullscreen-enter:before{content:'\e06d'}.oi-fullscreen-exit:before{content:'\e06e'}.oi-globe:before{content:'\e06f'}.oi-graph:before{content:'\e070'}.oi-grid-four-up:before{content:'\e071'}.oi-grid-three-up:before{content:'\e072'}.oi-grid-two-up:before{content:'\e073'}.oi-hard-drive:before{content:'\e074'}.oi-header:before{content:'\e075'}.oi-headphones:before{content:'\e076'}.oi-heart:before{content:'\e077'}.oi-home:before{content:'\e078'}.oi-image:before{content:'\e079'}.oi-inbox:before{content:'\e07a'}.oi-infinity:before{content:'\e07b'}.oi-info:before{content:'\e07c'}.oi-italic:before{content:'\e07d'}.oi-justify-center:before{content:'\e07e'}.oi-justify-left:before{content:'\e07f'}.oi-justify-right:before{content:'\e080'}.oi-key:before{content:'\e081'}.oi-laptop:before{content:'\e082'}.oi-layers:before{content:'\e083'}.oi-lightbulb:before{content:'\e084'}.oi-link-broken:before{content:'\e085'}.oi-link-intact:before{content:'\e086'}.oi-list-rich:before{content:'\e087'}.oi-list:before{content:'\e088'}.oi-location:before{content:'\e089'}.oi-lock-locked:before{content:'\e08a'}.oi-lock-unlocked:before{content:'\e08b'}.oi-loop-circular:before{content:'\e08c'}.oi-loop-square:before{content:'\e08d'}.oi-loop:before{content:'\e08e'}.oi-magnifying-glass:before{content:'\e08f'}.oi-map-marker:before{content:'\e090'}.oi-map:before{content:'\e091'}.oi-media-pause:before{content:'\e092'}.oi-media-play:before{content:'\e093'}.oi-media-record:before{content:'\e094'}.oi-media-skip-backward:before{content:'\e095'}.oi-media-skip-forward:before{content:'\e096'}.oi-media-step-backward:before{content:'\e097'}.oi-media-step-forward:before{content:'\e098'}.oi-media-stop:before{content:'\e099'}.oi-medical-cross:before{content:'\e09a'}.oi-menu:before{content:'\e09b'}.oi-microphone:before{content:'\e09c'}.oi-minus:before{content:'\e09d'}.oi-monitor:before{content:'\e09e'}.oi-moon:before{content:'\e09f'}.oi-move:before{content:'\e0a0'}.oi-musical-note:before{content:'\e0a1'}.oi-paperclip:before{content:'\e0a2'}.oi-pencil:before{content:'\e0a3'}.oi-people:before{content:'\e0a4'}.oi-person:before{content:'\e0a5'}.oi-phone:before{content:'\e0a6'}.oi-pie-chart:before{content:'\e0a7'}.oi-pin:before{content:'\e0a8'}.oi-play-circle:before{content:'\e0a9'}.oi-plus:before{content:'\e0aa'}.oi-power-standby:before{content:'\e0ab'}.oi-print:before{content:'\e0ac'}.oi-project:before{content:'\e0ad'}.oi-pulse:before{content:'\e0ae'}.oi-puzzle-piece:before{content:'\e0af'}.oi-question-mark:before{content:'\e0b0'}.oi-rain:before{content:'\e0b1'}.oi-random:before{content:'\e0b2'}.oi-reload:before{content:'\e0b3'}.oi-resize-both:before{content:'\e0b4'}.oi-resize-height:before{content:'\e0b5'}.oi-resize-width:before{content:'\e0b6'}.oi-rss-alt:before{content:'\e0b7'}.oi-rss:before{content:'\e0b8'}.oi-script:before{content:'\e0b9'}.oi-share-boxed:before{content:'\e0ba'}.oi-share:before{content:'\e0bb'}.oi-shield:before{content:'\e0bc'}.oi-signal:before{content:'\e0bd'}.oi-signpost:before{content:'\e0be'}.oi-sort-ascending:before{content:'\e0bf'}.oi-sort-descending:before{content:'\e0c0'}.oi-spreadsheet:before{content:'\e0c1'}.oi-star:before{content:'\e0c2'}.oi-sun:before{content:'\e0c3'}.oi-tablet:before{content:'\e0c4'}.oi-tag:before{content:'\e0c5'}.oi-tags:before{content:'\e0c6'}.oi-target:before{content:'\e0c7'}.oi-task:before{content:'\e0c8'}.oi-terminal:before{content:'\e0c9'}.oi-text:before{content:'\e0ca'}.oi-thumb-down:before{content:'\e0cb'}.oi-thumb-up:before{content:'\e0cc'}.oi-timer:before{content:'\e0cd'}.oi-transfer:before{content:'\e0ce'}.oi-trash:before{content:'\e0cf'}.oi-underline:before{content:'\e0d0'}.oi-vertical-align-bottom:before{content:'\e0d1'}.oi-vertical-align-center:before{content:'\e0d2'}.oi-vertical-align-top:before{content:'\e0d3'}.oi-video:before{content:'\e0d4'}.oi-volume-high:before{content:'\e0d5'}.oi-volume-low:before{content:'\e0d6'}.oi-volume-off:before{content:'\e0d7'}.oi-warning:before{content:'\e0d8'}.oi-wifi:before{content:'\e0d9'}.oi-wrench:before{content:'\e0da'}.oi-x:before{content:'\e0db'}.oi-yen:before{content:'\e0dc'}.oi-zoom-in:before{content:'\e0dd'}.oi-zoom-out:before{content:'\e0de'} \ No newline at end of file diff --git a/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.eot b/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.eot new file mode 100644 index 0000000..f98177d Binary files /dev/null and b/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.eot differ diff --git a/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.otf b/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.otf new file mode 100644 index 0000000..f6bd684 Binary files /dev/null and b/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.otf differ diff --git a/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.svg b/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.svg new file mode 100644 index 0000000..32b2c4e --- /dev/null +++ b/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.svg @@ -0,0 +1,543 @@ + + + + + +Created by FontForge 20120731 at Tue Jul 1 20:39:22 2014 + By P.J. Onori +Created by P.J. Onori with FontForge 2.0 (http://fontforge.sf.net) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf b/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf new file mode 100644 index 0000000..fab6048 Binary files /dev/null and b/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf differ diff --git a/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.woff b/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.woff new file mode 100644 index 0000000..f930998 Binary files /dev/null and b/DocuMed.PWA/wwwroot/css/open-iconic/font/fonts/open-iconic.woff differ diff --git a/DocuMed.PWA/wwwroot/favicon.png b/DocuMed.PWA/wwwroot/favicon.png new file mode 100644 index 0000000..8422b59 Binary files /dev/null and b/DocuMed.PWA/wwwroot/favicon.png differ diff --git a/DocuMed.PWA/wwwroot/icon-192.png b/DocuMed.PWA/wwwroot/icon-192.png new file mode 100644 index 0000000..166f56d Binary files /dev/null and b/DocuMed.PWA/wwwroot/icon-192.png differ diff --git a/DocuMed.PWA/wwwroot/icon-512.png b/DocuMed.PWA/wwwroot/icon-512.png new file mode 100644 index 0000000..c2dd484 Binary files /dev/null and b/DocuMed.PWA/wwwroot/icon-512.png differ diff --git a/DocuMed.PWA/wwwroot/index.html b/DocuMed.PWA/wwwroot/index.html new file mode 100644 index 0000000..0af054b --- /dev/null +++ b/DocuMed.PWA/wwwroot/index.html @@ -0,0 +1,49 @@ + + + + + + + DocuMed App + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + + + + + + + diff --git a/DocuMed.PWA/wwwroot/manifest.json b/DocuMed.PWA/wwwroot/manifest.json new file mode 100644 index 0000000..307b192 --- /dev/null +++ b/DocuMed.PWA/wwwroot/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "DocuMed.PWA", + "short_name": "DocuMed.PWA", + "start_url": "./", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#03173d", + "prefer_related_applications": false, + "icons": [ + { + "src": "icon-512.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "icon-192.png", + "type": "image/png", + "sizes": "192x192" + } + ] +} diff --git a/DocuMed.PWA/wwwroot/service-worker.js b/DocuMed.PWA/wwwroot/service-worker.js new file mode 100644 index 0000000..fe614da --- /dev/null +++ b/DocuMed.PWA/wwwroot/service-worker.js @@ -0,0 +1,4 @@ +// In development, always fetch from the network and do not enable offline support. +// This is because caching would make development more difficult (changes would not +// be reflected on the first load after each change). +self.addEventListener('fetch', () => { }); diff --git a/DocuMed.PWA/wwwroot/service-worker.published.js b/DocuMed.PWA/wwwroot/service-worker.published.js new file mode 100644 index 0000000..9b2357e --- /dev/null +++ b/DocuMed.PWA/wwwroot/service-worker.published.js @@ -0,0 +1,50 @@ +// Caution! Be sure you understand the caveats before publishing an application with +// offline support. See https://aka.ms/blazor-offline-considerations + +self.importScripts('./service-worker-assets.js'); +self.addEventListener('install', event => event.waitUntil(onInstall(event))); +self.addEventListener('activate', event => event.waitUntil(onActivate(event))); +self.addEventListener('fetch', event => event.respondWith(onFetch(event))); + +const cacheNamePrefix = 'offline-cache-'; +const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`; +const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/ ]; +const offlineAssetsExclude = [ /^service-worker\.js$/ ]; +self.addEventListener('message', event => { + if (event.data?.type === 'SKIP_WAITING') self.skipWaiting(); +}); +async function onInstall(event) { + console.info('Service worker: Install'); + + // Fetch and cache all matching items from the assets manifest + const assetsRequests = self.assetsManifest.assets + .filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url))) + .filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url))) + .map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' })); + await caches.open(cacheName).then(cache => cache.addAll(assetsRequests)); +} + +async function onActivate(event) { + console.info('Service worker: Activate'); + + // Delete unused caches + const cacheKeys = await caches.keys(); + await Promise.all(cacheKeys + .filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName) + .map(key => caches.delete(key))); +} + +async function onFetch(event) { + let cachedResponse = null; + if (event.request.method === 'GET') { + // For all navigation requests, try to serve index.html from cache + // If you need some URLs to be server-rendered, edit the following check to exclude those URLs + const shouldServeIndexHtml = event.request.mode === 'navigate'; + + const request = shouldServeIndexHtml ? 'index.html' : event.request; + const cache = await caches.open(cacheName); + cachedResponse = await cache.match(request); + } + + return cachedResponse || fetch(event.request); +} diff --git a/DocuMed.Repository/Abstracts/ICurrentUserService.cs b/DocuMed.Repository/Abstracts/ICurrentUserService.cs new file mode 100644 index 0000000..9f3e332 --- /dev/null +++ b/DocuMed.Repository/Abstracts/ICurrentUserService.cs @@ -0,0 +1,9 @@ +namespace DocuMed.Repository.Abstracts; + +public interface ICurrentUserService : IScopedDependency +{ + string? UserId { get; } + string? RoleName { get; } + string? ComplexId { get; } + string? UserName { get; } +} \ No newline at end of file diff --git a/DocuMed.Repository/DocuMed.Repository.csproj b/DocuMed.Repository/DocuMed.Repository.csproj new file mode 100644 index 0000000..f149bd1 --- /dev/null +++ b/DocuMed.Repository/DocuMed.Repository.csproj @@ -0,0 +1,56 @@ + + + + net7.0 + enable + enable + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocuMed.Repository/Extensions/DbContextOptionCustomExtensionsInfo.cs b/DocuMed.Repository/Extensions/DbContextOptionCustomExtensionsInfo.cs new file mode 100644 index 0000000..683d41a --- /dev/null +++ b/DocuMed.Repository/Extensions/DbContextOptionCustomExtensionsInfo.cs @@ -0,0 +1,59 @@ +namespace DocuMed.Repository.Extensions; + +public class DbContextOptionCustomExtensionsInfo : DbContextOptionsExtensionInfo +{ + public DbContextOptionCustomExtensionsInfo(IDbContextOptionsExtension extension) : base(extension) + { + } + + public override bool IsDatabaseProvider { get; } + public override string LogFragment { get; } = string.Empty; + + public override int GetServiceProviderHashCode() + { + return Extension.GetHashCode(); + } + + public override void PopulateDebugInfo(IDictionary debugInfo) + { + } + + public override bool ShouldUseSameServiceProvider(DbContextOptionsExtensionInfo other) + { + return true; + } +} + +public class DbContextOptionCustomExtensions : IDbContextOptionsExtension +{ + public DbContextOptionCustomExtensions() + { + Info = new DbContextOptionCustomExtensionsInfo(this); + } + + public Assembly ProjectAssembly { get; set; } = Assembly.GetExecutingAssembly(); + + public void ApplyServices(IServiceCollection services) + { + } + + public void Validate(IDbContextOptions options) + { + } + + public DbContextOptionsExtensionInfo Info { get; } +} + +public static class ApplicationContextExtensions +{ + public static DbContextOptionsBuilder UseProjectAssembly(this DbContextOptionsBuilder contextOptions, + Assembly projectAssembly) + { + var extension = new DbContextOptionCustomExtensions + { + ProjectAssembly = projectAssembly + }; + ((IDbContextOptionsBuilderInfrastructure)contextOptions).AddOrUpdateExtension(extension); + return contextOptions; + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Extensions/ModelBuilderExtensions.cs b/DocuMed.Repository/Extensions/ModelBuilderExtensions.cs new file mode 100644 index 0000000..05b6a3b --- /dev/null +++ b/DocuMed.Repository/Extensions/ModelBuilderExtensions.cs @@ -0,0 +1,190 @@ +namespace DocuMed.Repository.Extensions; + +public class ModelBuilderQueryFilter +{ + public void AddQueryFilterToModelBuilder(ModelBuilder modelBuilder, Type type) + { + var method = GetType().GetMethod("RegisterQueryFilter").MakeGenericMethod(type); + method.Invoke(this, new object[] { modelBuilder }); + } + + public void RegisterQueryFilter(ModelBuilder modelBuilder) where TQFilter : ApiEntity + { + var tt = typeof(TQFilter); + if (tt.BaseType == typeof(ApiEntity)) + modelBuilder.Entity().HasQueryFilter(e => e.IsRemoved == false); + } +} + +public static class ModelBuilderExtensions +{ + /// + /// Singularizin table name like Posts to Post or People to Person + /// + /// + public static void AddSingularizingTableNameConvention(this ModelBuilder modelBuilder) + { + var pluralizer = new Pluralizer(); + foreach (var entityType in modelBuilder.Model.GetEntityTypes()) + { + var tableName = entityType.GetTableName(); + entityType.SetTableName(pluralizer.Singularize(tableName)); + } + } + + + /// + /// Set NEWSEQUENTIALID() sql function for all columns named "Id" + /// + /// + /// Set to true if you want only "Identity" guid fields that named "Id" + public static void AddSequentialGuidForIdConvention(this ModelBuilder modelBuilder) + { + foreach (var entityType in modelBuilder.Model.GetEntityTypes()) + { + var property = entityType.GetProperties() + .Where(p => p.Name.Contains("Id", StringComparison.OrdinalIgnoreCase)) + .ToArray(); + foreach (var mutableProperty in property) + modelBuilder.AddDefaultValueSqlConvention(mutableProperty?.Name, typeof(Guid), "gen_random_uuid()"); + } + } + + /// + /// Set DefaultValueSql for sepecific property name and type + /// + /// + /// Name of property wants to set DefaultValueSql for + /// Type of property wants to set DefaultValueSql for + /// DefaultValueSql like "NEWSEQUENTIALID()" + public static void AddDefaultValueSqlConvention(this ModelBuilder modelBuilder, string propertyName, + Type propertyType, string defaultValueSql) + { + foreach (var entityType in modelBuilder.Model.GetEntityTypes()) + { + var property = entityType.GetProperties() + .SingleOrDefault(p => p.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase)); + if (property != null && property.ClrType == propertyType) + property.SetDefaultValueSql(defaultValueSql); + } + } + + /// + /// Set DeleteBehavior.Restrict by default for relations + /// + /// + public static void AddRestrictDeleteBehaviorConvention(this ModelBuilder modelBuilder) + { + var cascadeFKs = modelBuilder.Model.GetEntityTypes() + .SelectMany(t => t.GetForeignKeys()) + .Where(fk => !fk.IsOwnership && fk.DeleteBehavior == DeleteBehavior.Cascade); + foreach (var fk in cascadeFKs) + fk.DeleteBehavior = DeleteBehavior.Restrict; + } + + /// + /// Dynamicaly load all IEntityTypeConfiguration with Reflection + /// + /// + /// Assemblies contains Entities + public static void RegisterEntityTypeConfiguration(this ModelBuilder modelBuilder, params Assembly[] assemblies) + { + var applyGenericMethod = typeof(ModelBuilder) + .GetMethods() + .First(m => m.Name == nameof(ModelBuilder.ApplyConfiguration)); + + var types = assemblies.SelectMany(a => a.GetExportedTypes()) + .Where(c => c.IsClass && !c.IsAbstract && c.IsPublic); + + foreach (var type in types) + foreach (var iface in type.GetInterfaces()) + if (iface.IsConstructedGenericType && + iface.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>)) + { + var applyConcreteMethod = applyGenericMethod.MakeGenericMethod(iface.GenericTypeArguments[0]); + applyConcreteMethod.Invoke(modelBuilder, new[] { Activator.CreateInstance(type) }); + } + } + + + /// + /// Pluralizing table name like Post to Posts or Person to People + /// + /// + public static void AddPluralizingTableNameConvention(this ModelBuilder modelBuilder) + { + var pluralizer = new Pluralizer(); + foreach (var entityType in modelBuilder.Model.GetEntityTypes()) + if (entityType.BaseType == null) + { + var tableName = entityType.GetTableName(); + entityType.SetTableName(pluralizer.Pluralize(tableName)); + } + } + + /// + /// Dynamicaly register all Entities that inherit from specific BaseType + /// + /// + /// Base type that Entities inherit from this + /// Assemblies contains Entities + public static void RegisterAllEntities(this ModelBuilder modelBuilder, + ILogger _logger, params Assembly[] assemblies) where BaseType : ApiEntity + { + var types = assemblies.SelectMany(a => a.GetExportedTypes()) + .Where(c => c.IsClass && !c.IsAbstract && c.IsPublic && typeof(BaseType) + .IsAssignableFrom(c)); + var builderQueryFilter = new ModelBuilderQueryFilter(); + foreach (var type in types) + { + var stopwatch = new Stopwatch(); + stopwatch.Start(); + modelBuilder.Entity(type); + builderQueryFilter.AddQueryFilterToModelBuilder(modelBuilder, type); + stopwatch.Stop(); + } + } + + /// + /// Dynamicaly register all Entities that inherit from specific BaseType + /// + /// + /// Base type that Entities inherit from this + /// Assemblies contains Entities + public static void RegisterAllEntitiesV02(this ModelBuilder builder, ILogger _logger, params Assembly[] assemblies) where BaseType : ApiEntity + { + var types = assemblies.SelectMany(a => a.GetExportedTypes()) + .Where(c => c.IsClass && !c.IsAbstract && c.IsPublic && typeof(BaseType) + .IsAssignableFrom(c)); + var builderQueryFilter = new ModelBuilderQueryFilter(); + + foreach (var type in types) + { + var stopwatch = new Stopwatch(); + stopwatch.Start(); + // On Model Creating + var onModelCreatingMethod = + type.GetMethods().FirstOrDefault(x => x.Name == "OnModelCreating"); + + if (onModelCreatingMethod != null) + onModelCreatingMethod.Invoke(type, new object[] { builder }); + else + { + // On Base Model Creating + if (type.BaseType == null || type.BaseType != typeof(BaseType)) continue; + + var baseOnModelCreatingMethod = type.BaseType.GetMethods() + .FirstOrDefault(x => x.Name == "OnModelCreating"); + + if (baseOnModelCreatingMethod == null) + continue; + + baseOnModelCreatingMethod.Invoke(typeof(BaseType), new object[] { builder }); + } + + builderQueryFilter.AddQueryFilterToModelBuilder(builder, type); + stopwatch.Stop(); + _logger.LogInformation($"MODEL BUILDER {type.Name} In : {stopwatch.ElapsedMilliseconds}ms"); + } + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Models/ApplicationContext.cs b/DocuMed.Repository/Models/ApplicationContext.cs new file mode 100644 index 0000000..065bf31 --- /dev/null +++ b/DocuMed.Repository/Models/ApplicationContext.cs @@ -0,0 +1,46 @@ +namespace DocuMed.Repository.Models; + +public class ApplicationContext : IdentityDbContext +{ + private readonly ILogger _logger; + private readonly Assembly _projectAssembly; + + public ApplicationContext( DbContextOptions options, ILogger logger): base(options) + { + _logger = logger; + _projectAssembly = options.GetExtension().ProjectAssembly; + } + + + protected override void OnModelCreating(ModelBuilder builder) + { + var stopwatch = new Stopwatch(); + stopwatch.Start(); + base.OnModelCreating(builder); + var entitiesAssembly = _projectAssembly; + builder.RegisterAllEntities(_logger, entitiesAssembly); + stopwatch.Stop(); + _logger.LogInformation($"!!!!!!! RegisterAllEntities : {stopwatch.ElapsedMilliseconds}ms !!!!!!!"); + + + RenameIdentityTables(builder); + builder.RegisterEntityTypeConfiguration(entitiesAssembly); + builder.AddPluralizingTableNameConvention(); + builder.AddRestrictDeleteBehaviorConvention(); + //builder.AddSequentialGuidForIdConvention(); + } + + protected void RenameIdentityTables(ModelBuilder builder) + { + builder.HasDefaultSchema("public"); + + builder.Entity().ToTable("Users"); + builder.Entity().ToTable("Roles"); + builder.Entity>().ToTable("RoleClaims"); + builder.Entity>().ToTable("UserRoles"); + builder.Entity>().ToTable("Claims"); + builder.Entity>().ToTable("Logins"); + builder.Entity>().ToTable("Tokens"); + + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/Base/BaseRepository.cs b/DocuMed.Repository/Repositories/Base/BaseRepository.cs new file mode 100644 index 0000000..6af587c --- /dev/null +++ b/DocuMed.Repository/Repositories/Base/BaseRepository.cs @@ -0,0 +1,88 @@ +namespace DocuMed.Repository.Repositories.Base +{ + public class BaseRepository : Repository, IBaseRepository where T : class, IApiEntity + { + public BaseRepository(ApplicationContext dbContext) : base(dbContext) + { + + } + + public virtual async ValueTask GetByIdAsync(CancellationToken cancellationToken, params object[] ids) + { + return await Entities.FindAsync(ids, cancellationToken); + } + + #region Sync Methods + + public virtual T GetById(params object[] ids) + { + var ent = Entities.Find(ids); + Detach(ent); + return ent; + } + + public virtual void Add(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + Entities.Add(entity); + } + + public virtual void AddRange(IEnumerable entities) + { + AssertExtensions.NotNull(entities, nameof(entities)); + Entities.AddRange(entities); + } + + public virtual void Update(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + Detach(entity); + Entities.Update(entity); + } + + public virtual void UpdateRange(IEnumerable entities) + { + AssertExtensions.NotNull(entities, nameof(entities)); + Entities.UpdateRange(entities); + } + + public void HardDelete(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + Entities.Remove(entity); + } + + public virtual void Delete(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + Entities.Remove(entity); + } + + public virtual void DeleteRange(IEnumerable entities) + { + AssertExtensions.NotNull(entities, nameof(entities)); + Entities.RemoveRange(entities); + } + + #endregion + + #region Attach & Detach + + public virtual void Detach(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + var entry = DbContext.Entry(entity); + if (entry != null) + entry.State = EntityState.Detached; + } + + public virtual void Attach(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + if (DbContext.Entry(entity).State == EntityState.Detached) + Entities.Attach(entity); + } + + #endregion + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/Base/Contracts/IBaseRepository.cs b/DocuMed.Repository/Repositories/Base/Contracts/IBaseRepository.cs new file mode 100644 index 0000000..b9e8bdb --- /dev/null +++ b/DocuMed.Repository/Repositories/Base/Contracts/IBaseRepository.cs @@ -0,0 +1,6 @@ +namespace DocuMed.Repository.Repositories.Base.Contracts +{ + public interface IBaseRepository : IDisposable, IReadRepository, IWriteRepository where T : class, IApiEntity + { + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/Base/Contracts/IReadRepository.cs b/DocuMed.Repository/Repositories/Base/Contracts/IReadRepository.cs new file mode 100644 index 0000000..3b95e94 --- /dev/null +++ b/DocuMed.Repository/Repositories/Base/Contracts/IReadRepository.cs @@ -0,0 +1,12 @@ +namespace DocuMed.Repository.Repositories.Base.Contracts +{ + public interface IReadRepository where T : class, IApiEntity + { + DbSet Entities { get; } + IQueryable Table { get; } + IQueryable TableNoTracking { get; } + T GetById(params object[] ids); + ValueTask GetByIdAsync(CancellationToken cancellationToken, params object[] ids); + + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/Base/Contracts/IRepository.cs b/DocuMed.Repository/Repositories/Base/Contracts/IRepository.cs new file mode 100644 index 0000000..335a20b --- /dev/null +++ b/DocuMed.Repository/Repositories/Base/Contracts/IRepository.cs @@ -0,0 +1,9 @@ +namespace DocuMed.Repository.Repositories.Base.Contracts +{ + internal interface IRepository where T : class, IApiEntity + { + DbSet Entities { get; } + IQueryable Table { get; } + IQueryable TableNoTracking { get; } + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/Base/Contracts/IRepositoryWrapper.cs b/DocuMed.Repository/Repositories/Base/Contracts/IRepositoryWrapper.cs new file mode 100644 index 0000000..c0a99e1 --- /dev/null +++ b/DocuMed.Repository/Repositories/Base/Contracts/IRepositoryWrapper.cs @@ -0,0 +1,11 @@ +namespace DocuMed.Repository.Repositories.Base.Contracts +{ + public interface IRepositoryWrapper : IDisposable , IScopedDependency + { + IBaseRepository SetRepository() where T : ApiEntity; + Task BeginTransaction(CancellationToken cancellationToken); + Task RollBackAsync(CancellationToken cancellationToken); + Task CommitAsync(CancellationToken cancellationToken); + Task SaveChangesAsync(CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/Base/Contracts/IWriteRepository.cs b/DocuMed.Repository/Repositories/Base/Contracts/IWriteRepository.cs new file mode 100644 index 0000000..1d29251 --- /dev/null +++ b/DocuMed.Repository/Repositories/Base/Contracts/IWriteRepository.cs @@ -0,0 +1,15 @@ +namespace DocuMed.Repository.Repositories.Base.Contracts +{ + public interface IWriteRepository where T : class, IApiEntity + { + void Add(T entity); + void AddRange(IEnumerable entities); + void Delete(T entity); + void HardDelete(T entity); + void DeleteRange(IEnumerable entities); + void Update(T entity); + void UpdateRange(IEnumerable entities); + void Detach(T entity); + void Attach(T entity); + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/Base/ReadRepository.cs b/DocuMed.Repository/Repositories/Base/ReadRepository.cs new file mode 100644 index 0000000..9cec778 --- /dev/null +++ b/DocuMed.Repository/Repositories/Base/ReadRepository.cs @@ -0,0 +1,43 @@ +namespace DocuMed.Repository.Repositories.Base +{ + public class ReadRepository : Repository, IDisposable, IReadRepository where T : class, IApiEntity + { + public ReadRepository( + ApplicationContext dbContext) : base(dbContext) + { + } + + public void Dispose() + { + DbContext?.Dispose(); + } + + + public virtual T GetById(params object[] ids) + { + var ent = Entities.Find(ids); + Detach(ent); + return ent; + } + + public virtual ValueTask GetByIdAsync(CancellationToken cancellationToken, params object[] ids) + { + return Entities.FindAsync(ids, cancellationToken); + } + + public virtual void Detach(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + var entry = DbContext.Entry(entity); + if (entry != null) + entry.State = EntityState.Detached; + } + + public virtual void Attach(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + if (DbContext.Entry(entity).State == EntityState.Detached) + Entities.Attach(entity); + } + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/Base/Repository.cs b/DocuMed.Repository/Repositories/Base/Repository.cs new file mode 100644 index 0000000..bdf840a --- /dev/null +++ b/DocuMed.Repository/Repositories/Base/Repository.cs @@ -0,0 +1,31 @@ +namespace DocuMed.Repository.Repositories.Base +{ + public class Repository : IRepository where T : class, IApiEntity + { + protected readonly ApplicationContext DbContext; + + public Repository(ApplicationContext dbContext) + { + DbContext = dbContext; + Entities = DbContext.Set(); + DbContext.ChangeTracker.Clear(); + } + + public DbSet Entities { get; } + + public virtual IQueryable Table => Entities.Where(e => !e.IsRemoved); + + public virtual IQueryable TableNoTracking => Table.AsNoTracking(); + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + DbContext?.Dispose(); + } + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/Base/RepositoryWrapper.cs b/DocuMed.Repository/Repositories/Base/RepositoryWrapper.cs new file mode 100644 index 0000000..7f0909b --- /dev/null +++ b/DocuMed.Repository/Repositories/Base/RepositoryWrapper.cs @@ -0,0 +1,67 @@ +namespace DocuMed.Repository.Repositories.Base; +public class RepositoryWrapper : IRepositoryWrapper +{ + private readonly ApplicationContext _context; + private IDbContextTransaction? _currentTransaction; + public RepositoryWrapper(ApplicationContext context) + { + _context = context; + } + + public IBaseRepository SetRepository() where T : ApiEntity => new BaseRepository(_context); + + + public async Task RollBackAsync(CancellationToken cancellationToken) + { + if (_currentTransaction == null) + throw new ArgumentNullException(nameof(_currentTransaction)); + await _currentTransaction.RollbackAsync(cancellationToken); + } + public async Task CommitAsync(CancellationToken cancellationToken) + { + if (_currentTransaction == null) + throw new ArgumentNullException(nameof(_currentTransaction)); + await _currentTransaction.CommitAsync(cancellationToken); + } + public async Task BeginTransaction(CancellationToken cancellationToken) + { + _currentTransaction = await _context.Database.BeginTransactionAsync(cancellationToken); + } + public async Task SaveChangesAsync(CancellationToken cancellationToken = default) + { + SetAuditables(); + await _context.SaveChangesAsync(cancellationToken); + } + + private void SetAuditables() + { + IEnumerable> entries = _context.ChangeTracker.Entries(); + foreach (EntityEntry entity in entries) + { + if (entity.State == EntityState.Added) + { + entity.Property(e => e.CreatedAt) + .CurrentValue = DateTime.Now; + } + + if (entity.State == EntityState.Modified) + { + entity.Property(e => e.ModifiedAt) + .CurrentValue = DateTime.Now; + } + + if (entity.State == EntityState.Deleted) + { + entity.Property(e => e.RemovedAt) + .CurrentValue = DateTime.Now; + entity.Property(e => e.IsRemoved) + .CurrentValue = true; + } + } + } + public void Dispose() + { + _currentTransaction?.Dispose(); + _context?.Dispose(); + } +} diff --git a/DocuMed.Repository/Repositories/Base/WriteRepository.cs b/DocuMed.Repository/Repositories/Base/WriteRepository.cs new file mode 100644 index 0000000..534dcd7 --- /dev/null +++ b/DocuMed.Repository/Repositories/Base/WriteRepository.cs @@ -0,0 +1,72 @@ +namespace DocuMed.Repository.Repositories.Base +{ + public class WriteRepository : Repository, IDisposable, IWriteRepository where T : class, IApiEntity + { + public WriteRepository(ApplicationContext dbContext) : base(dbContext) + { + } + + public void Dispose() + { + DbContext?.Dispose(); + } + + public void HardDelete(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + Entities.Remove(entity); + } + + public virtual void Add(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + Entities.Add(entity); + } + + public virtual void AddRange(IEnumerable entities) + { + AssertExtensions.NotNull(entities, nameof(entities)); + Entities.AddRange(entities); + } + + public virtual void Update(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + Detach(entity); + Entities.Update(entity); + } + + public virtual void UpdateRange(IEnumerable entities) + { + AssertExtensions.NotNull(entities, nameof(entities)); + Entities.UpdateRange(entities); + } + + public virtual void Delete(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + Entities.Remove(entity); + } + + public virtual void DeleteRange(IEnumerable entities) + { + AssertExtensions.NotNull(entities, nameof(entities)); + Entities.RemoveRange(entities); + } + + public virtual void Detach(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + var entry = DbContext.Entry(entity); + if (entry != null) + entry.State = EntityState.Detached; + } + + public virtual void Attach(T entity) + { + AssertExtensions.NotNull(entity, nameof(entity)); + if (DbContext.Entry(entity).State == EntityState.Detached) + Entities.Attach(entity); + } + } +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/UnitOfWork/IUnitOfWork.cs b/DocuMed.Repository/Repositories/UnitOfWork/IUnitOfWork.cs new file mode 100644 index 0000000..95bdf27 --- /dev/null +++ b/DocuMed.Repository/Repositories/UnitOfWork/IUnitOfWork.cs @@ -0,0 +1,9 @@ +namespace DocuMed.Repository.Repositories.UnitOfWork; + +public interface IUnitOfWork : IScopedDependency +{ + Task BeginTransaction(); + Task RollBackAsync(); + Task CommitAsync(); + Task SaveChangesAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/DocuMed.Repository/Repositories/UnitOfWork/UnitOfWork.cs b/DocuMed.Repository/Repositories/UnitOfWork/UnitOfWork.cs new file mode 100644 index 0000000..26d4451 --- /dev/null +++ b/DocuMed.Repository/Repositories/UnitOfWork/UnitOfWork.cs @@ -0,0 +1,60 @@ +namespace DocuMed.Repository.Repositories.UnitOfWork; + +public class UnitOfWork : IUnitOfWork +{ + private readonly ApplicationContext _applicationContext; + private IDbContextTransaction? _currentTransaction ; + public UnitOfWork(ApplicationContext applicationContext) + { + _applicationContext = applicationContext; + } + + public async Task RollBackAsync() + { + if (_currentTransaction == null) + throw new ArgumentNullException(nameof(_currentTransaction)); + await _currentTransaction.RollbackAsync(); + } + public async Task CommitAsync() + { + if (_currentTransaction == null) + throw new ArgumentNullException(nameof(_currentTransaction)); + await _currentTransaction.CommitAsync(); + } + public async Task BeginTransaction() + { + _currentTransaction = await _applicationContext.Database.BeginTransactionAsync(); + } + public async Task SaveChangesAsync(CancellationToken cancellationToken = default) + { + SetAuditables(); + await _applicationContext.SaveChangesAsync(cancellationToken); + } + + private void SetAuditables() + { + IEnumerable> entries = _applicationContext.ChangeTracker.Entries(); + foreach (EntityEntry entity in entries) + { + if (entity.State == EntityState.Added) + { + entity.Property(e=>e.CreatedAt) + .CurrentValue = DateTime.Now; + } + + if (entity.State == EntityState.Modified) + { + entity.Property(e => e.ModifiedAt) + .CurrentValue = DateTime.Now; + } + + if (entity.State == EntityState.Deleted) + { + entity.Property(e => e.RemovedAt) + .CurrentValue = DateTime.Now; + entity.Property(e => e.IsRemoved) + .CurrentValue = true; + } + } + } +} \ No newline at end of file diff --git a/DocuMed.Repository/RepositoryConfig.cs b/DocuMed.Repository/RepositoryConfig.cs new file mode 100644 index 0000000..ddd7adc --- /dev/null +++ b/DocuMed.Repository/RepositoryConfig.cs @@ -0,0 +1,5 @@ +namespace DocuMed.Repository; + public class RepositoryConfig + { + + } \ No newline at end of file diff --git a/DocuMed.Repository/Services/Contracts/IDbInitializerService.cs b/DocuMed.Repository/Services/Contracts/IDbInitializerService.cs new file mode 100644 index 0000000..f70ff0c --- /dev/null +++ b/DocuMed.Repository/Services/Contracts/IDbInitializerService.cs @@ -0,0 +1,10 @@ +using Task = System.Threading.Tasks.Task; + +namespace DocuMed.Repository.Services.Contracts; + +public interface IDbInitializerService : IScopedDependency +{ + void Initialize(); + Task SeedDate(bool force = false); + Task SeedRoles(); +} \ No newline at end of file diff --git a/DocuMed.Repository/Services/DbInitializerService.cs b/DocuMed.Repository/Services/DbInitializerService.cs new file mode 100644 index 0000000..3c6cff0 --- /dev/null +++ b/DocuMed.Repository/Services/DbInitializerService.cs @@ -0,0 +1,90 @@ +namespace DocuMed.Repository.Services; + +public class DbInitializerService : IDbInitializerService +{ + private readonly IOptionsSnapshot _adminUserSeedOptions; + private readonly ApplicationContext _context; + private readonly ILogger _logger; + private readonly RoleManager _roleManager; + private readonly UserManager _userManager; + + public DbInitializerService( + ApplicationContext context, + RoleManager roleManager, + UserManager userManager, + IOptionsSnapshot adminUserSeedOptions, + ILogger logger) + { + _context = context; + _roleManager = roleManager; + _userManager = userManager; + _adminUserSeedOptions = adminUserSeedOptions; + _logger = logger; + } + + public void Initialize() + { + try + { + _context.Database.Migrate(); + _logger.LogInformation("Migration SUCCESS !!!!"); + } + catch (Exception e) + { + _logger.LogError(e, e.Message); + } + } + + public async Task SeedDate(bool force = false) + { + try + { + await SeedRoles(); + + var seedAdmin = _adminUserSeedOptions.Value.UserSetting; + var user = await _userManager.FindByNameAsync(seedAdmin.Username); + if (user == null) + { + var adminUser = new ApplicationUser + { + UserName = seedAdmin.Username, + Email = seedAdmin.Email, + EmailConfirmed = true, + LockoutEnabled = true, + FirstName = seedAdmin.FirstName, + LastName = seedAdmin.LastName, + Gender = Gender.Male, + PhoneNumberConfirmed = true, + PhoneNumber = seedAdmin.Phone, + BirthDate = DateTime.Now.AddYears(-23) + }; + var adminUserResult = await _userManager.CreateAsync(adminUser, seedAdmin.Password); + if (adminUserResult.Succeeded) await _userManager.AddToRoleAsync(adminUser, seedAdmin.RoleName); + } + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + } + + public async Task SeedRoles() + { + var seedAdmin = _adminUserSeedOptions.Value.UserSetting; + var managerRole = await _roleManager.FindByNameAsync(seedAdmin.RoleName); + + if (managerRole == null) + { + managerRole = new ApplicationRole + { + Name = seedAdmin.RoleName, + EnglishName = seedAdmin.RoleName, + Description = "root admin role" + }; + var adminRoleResult = await _roleManager.CreateAsync(managerRole); + foreach (var claim in ApplicationClaims.AllClaims) + await _roleManager.AddClaimAsync(managerRole, claim); + } + } +} \ No newline at end of file diff --git a/DocuMed.sln b/DocuMed.sln new file mode 100644 index 0000000..52c8a7b --- /dev/null +++ b/DocuMed.sln @@ -0,0 +1,67 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34024.191 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DocuMed.PWA", "DocuMed.PWA\DocuMed.PWA.csproj", "{062950CA-0B06-4924-8C43-90C72455B306}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocuMed.Api", "DocuMed.Api\DocuMed.Api.csproj", "{BEA3A628-15E5-4733-851D-37E3C8B13169}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocuMed.Common", "DocuMed.Common\DocuMed.Common.csproj", "{4A71B4B9-5D7C-4DE9-ADB9-16D23B6771AA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocuMed.Core", "DocuMed.Core\DocuMed.Core.csproj", "{4FA77EEF-B056-4E65-AE55-FBA540AF6507}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocuMed.Repository", "DocuMed.Repository\DocuMed.Repository.csproj", "{8A4FA109-04B2-46B1-93F6-CFFE65B47DDB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocuMed.Domain", "DocuMed.Domain\DocuMed.Domain.csproj", "{3E36917E-3888-43A4-846C-6C04542FE209}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocuMed.Infrastructure", "DocuMed.Infrastructure\DocuMed.Infrastructure.csproj", "{A29B5D57-EC19-4E56-A92A-CCAAC10F1493}" +EndProject +Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{AE900A14-3A2E-4792-B7EF-641A1E60D345}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {062950CA-0B06-4924-8C43-90C72455B306}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {062950CA-0B06-4924-8C43-90C72455B306}.Debug|Any CPU.Build.0 = Debug|Any CPU + {062950CA-0B06-4924-8C43-90C72455B306}.Release|Any CPU.ActiveCfg = Release|Any CPU + {062950CA-0B06-4924-8C43-90C72455B306}.Release|Any CPU.Build.0 = Release|Any CPU + {BEA3A628-15E5-4733-851D-37E3C8B13169}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEA3A628-15E5-4733-851D-37E3C8B13169}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEA3A628-15E5-4733-851D-37E3C8B13169}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEA3A628-15E5-4733-851D-37E3C8B13169}.Release|Any CPU.Build.0 = Release|Any CPU + {4A71B4B9-5D7C-4DE9-ADB9-16D23B6771AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A71B4B9-5D7C-4DE9-ADB9-16D23B6771AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A71B4B9-5D7C-4DE9-ADB9-16D23B6771AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A71B4B9-5D7C-4DE9-ADB9-16D23B6771AA}.Release|Any CPU.Build.0 = Release|Any CPU + {4FA77EEF-B056-4E65-AE55-FBA540AF6507}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FA77EEF-B056-4E65-AE55-FBA540AF6507}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FA77EEF-B056-4E65-AE55-FBA540AF6507}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FA77EEF-B056-4E65-AE55-FBA540AF6507}.Release|Any CPU.Build.0 = Release|Any CPU + {8A4FA109-04B2-46B1-93F6-CFFE65B47DDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A4FA109-04B2-46B1-93F6-CFFE65B47DDB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A4FA109-04B2-46B1-93F6-CFFE65B47DDB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A4FA109-04B2-46B1-93F6-CFFE65B47DDB}.Release|Any CPU.Build.0 = Release|Any CPU + {3E36917E-3888-43A4-846C-6C04542FE209}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E36917E-3888-43A4-846C-6C04542FE209}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E36917E-3888-43A4-846C-6C04542FE209}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E36917E-3888-43A4-846C-6C04542FE209}.Release|Any CPU.Build.0 = Release|Any CPU + {A29B5D57-EC19-4E56-A92A-CCAAC10F1493}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A29B5D57-EC19-4E56-A92A-CCAAC10F1493}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A29B5D57-EC19-4E56-A92A-CCAAC10F1493}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A29B5D57-EC19-4E56-A92A-CCAAC10F1493}.Release|Any CPU.Build.0 = Release|Any CPU + {AE900A14-3A2E-4792-B7EF-641A1E60D345}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE900A14-3A2E-4792-B7EF-641A1E60D345}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE900A14-3A2E-4792-B7EF-641A1E60D345}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE900A14-3A2E-4792-B7EF-641A1E60D345}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {67233DDF-C77D-4DCB-809D-3A4B2467D55D} + EndGlobalSection +EndGlobal diff --git a/docker-compose.dcproj b/docker-compose.dcproj new file mode 100644 index 0000000..211fffc --- /dev/null +++ b/docker-compose.dcproj @@ -0,0 +1,18 @@ + + + + 2.1 + Linux + ae900a14-3a2e-4792-b7ef-641a1e60d345 + LaunchBrowser + {Scheme}://localhost:{ServicePort}/swagger + documed.api + + + + docker-compose.yml + + + + + \ No newline at end of file diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 0000000..37a65c2 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,8 @@ +version: '3.4' + +services: + documed.api: + environment: + - ASPNETCORE_ENVIRONMENT=Development + ports: + - "80" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..27939af --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,8 @@ +version: '3.4' + +services: + documed.api: + image: ${DOCKER_REGISTRY-}documedapi + build: + context: . + dockerfile: DocuMed.Api/Dockerfile diff --git a/launchSettings.json b/launchSettings.json new file mode 100644 index 0000000..36fd037 --- /dev/null +++ b/launchSettings.json @@ -0,0 +1,11 @@ +{ + "profiles": { + "Docker Compose": { + "commandName": "DockerCompose", + "commandVersion": "1.0", + "serviceActions": { + "documed.api": "StartDebugging" + } + } + } +} \ No newline at end of file