CountryTagHelper–part 2

Finally, I have arrived at functionality. I said that I want something like

<select asp-country="true" asp-country-selected="US" >
   
</select>

 

The functionality is very easy to be added:

The entire class is :

using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Localization;
using System;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;

namespace CTHWeb.Controllers
{
    [HtmlTargetElement("select", Attributes = ASPCountryAttributeName)]
    public class CountryTagHelper:TagHelper
    {
        private const string ASPCountryAttributeName = "asp-country";
        private const string ASPCountrySelectedAttributeName = "asp-country-selected";

        [HtmlAttributeName(ASPCountryAttributeName)]
        public bool ASPCountry { get; set; }

        [HtmlAttributeName(ASPCountrySelectedAttributeName)]
        public string ASPCountrySelected{ get; set; }

        static string[] CountryISO;
        //static PropertyInfo[] properties;
        static CountryTagHelper()
        {
            var t =typeof( ResCTH);
            var properties= t.GetProperties(
                BindingFlags.Public |
                BindingFlags.Static |
                BindingFlags.GetProperty);
            CountryISO = properties
                .Where(it=>it.Name.Length==2)
                .Select(it => it.Name)
                .ToArray();
        }
        public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            if (ASPCountry)
            {
                bool existSelected = !string.IsNullOrWhiteSpace(ASPCountrySelected);
                string option = "<option value='{0}' {2}>{1}</option>";
                foreach (var item in CountryISO)
                {
                    string selected = "";
                    string localizedName = ResCTH.ResourceManager.GetString(item);
                    if (existSelected)
                    {
                        bool currentItem = string.Equals(item, ASPCountrySelected, StringComparison.CurrentCultureIgnoreCase);
                        currentItem = currentItem || string.Equals(localizedName, ASPCountrySelected, StringComparison.CurrentCultureIgnoreCase);
                        if (currentItem)
                            selected = "selected";
                    }
                    output.Content.AppendFormat(option, item, localizedName,selected);
                }
            }
            return base.ProcessAsync(context, output);
        }
    }
}

 

The important thing is that it works with other html attributes, like

<select asp-country="true" asp-country-selected="US" disabled=”disabled”>
   
</select>

 

What it remains to be done:

  1. from IP – recognize the country of the visitor from IP
  2. localized – display messages in other language
  3. first item empty – now it selects Andorra
  4. Add select2 with image flags
  5. NuGet package
  6. readme.md / wiki on github
  7. tests

Country tag helper–part 1

 

What I want to do is to create a Country Tag Helper for asp.net core.

Something like

<select asp-country=”true”

and then list all countries in this select. More, it should be localized ( Germany vs Allemagne). That means 1 or more resource files 

 

First I need initial data: The WorldBank API gives us the names http://api.worldbank.org/countries and I have made a project https://github.com/ignatandrei/WorldBankAPi that inspects that API.

To retrieve data in resource format , it is simple:

 var r = new CountriesRepository();
            var arr = r.GetCountries().Result.
                Select(it =>
                $"<data name = \"{it.iso2Code}\" xml:space=\"preserve\" >" +

                $"<value>{it.name}</value>" +
                "</data>").ToArray();
            var s = string.Join(Environment.NewLine, arr);
            File.WriteAllText(@"D:\c.txt", s);

 

Then we could copy paste into resources:

 <data name = "AW" xml:space="preserve" ><value>Aruba</value></data>
  <data name = "AF" xml:space="preserve" ><value>Afghanistan</value></data>
  <data name = "AO" xml:space="preserve" ><value>Angola</value></data>
 ...

 

Now I want to make a list of those names – so I need this code to translate between C# generated code from resource

public static string AD {
            get {
                return ResourceManager.GetString("AD", resourceCulture);
            }
        }
public static string AE {
            get {
                return ResourceManager.GetString("AE", resourceCulture);
            }
        }
...

 

and a list of names to be put into select.

Reflection to the rescue:

  var t =typeof( ResCTH);
            properties= t.GetProperties(
                BindingFlags.Public |
                BindingFlags.Static |
                BindingFlags.GetProperty);
            CountryISO = properties
                .Where(it=>it.Name.Length==2)
                .Select(it => it.Name)
                .ToArray();

 

The code is on github https://github.com/ignatandrei/CountryTagHelper and I will improve next time.

Friday links 226

  1. Top 15 Underutilized Features of .NET
  2. Top 15 Underutilized Features of .NET Part 2
  3. Louis Davidson : Getting the difference between two sets of like data
  4. App-vNext/Polly: Polly is a .NET 3.5 / 4.0 / 4.5 / PCL library that allows developers to express transient exception handling policies such as Retry, Retry Forever, Wait and Retry or Circuit Breaker in a fluent manner.
  5. dbelmont/ExpressionBuilder
  6. Youtube Downloader in One Easy Class – CodeProject
  7. Career Guide for the New Developer
  8. Harvard psychologist Amy Cuddy says people judge you on 2 criteria – Business Insider
  9. StructureMap – Supported Lifecycles
  10. Jquery Ajax Request and MVC detailed « A Programmer with Microsoft tools
  11. Friendly, Readable Expression Trees
  12. 18F — Software maintenance is an anti-pattern
  13. Getting Started with Bower – Treehouse Blog
  14. NuGet Package of the Week: ASP.NET Web API Caching with CacheCow and CacheOutput – Scott Hanselman
  15. Less Than Dot – Blog – MVVM Validation with KnockoutJS – Don’t put it in the View/HTML
  16. WEIRD – RationalWiki
  17. C# 7 Feature Proposal: Local Functions – Bill Wagner
  18. Dubai is set to unveil spectacular floating apartments with underwater rooms
  19. Software has bugs. This is normal. — Signal v. Noise — Medium
  20.    Visual Studio: How to create a solution template with multiple projects – Jayway
  21. Avoiding the Service Locator Pattern in ASP.NET Core
  22. Service Locator is an Anti-Pattern
  23. Service Locator violates SOLID
  24. Service Locator violates encapsulation
  25. Service Locator: roles vs. mechanics
  26. Suremaker/LightBDD: Lightweight Behavior Driven Development test framework
  27. John L. Miller’s answer to Google: How does Google provide so much online storage for Youtube videos? – Quora
  28. John L. Miller’s answer to What is the best way to read software documentation? – Quora

    Making any call to a function of an object thread safe

     

     

    I was wondering how to modify old code to support threads /task .

    So I was making a small project about making any function of an object thread safe.

    NuGet Package at : https://www.nuget.org/packages/ThreadSafeObject/

    The solution contain tests and 2 console project for .NET Core and .NET Framework 4.5.1

    The usage is pretty easy

    Let’s say you have this

    Calculation c = new Calculation();
    c.Add();
    

    And you want

    c.Add
    

    to be thread safe

    In the Package Manager Console write:

    Install-Package ThreadSafeObject

    Then modify your code to:

    Calculation c = new Calculation();
    dynamic ts = new ThreadSafe(c);
    ts.Add();
    

    It is a toy project- however, it has tests to prove it is correct.

    You can download the code source from https://github.com/ignatandrei/ThreadSafeObject/

    PowerBI custom visualization–part 2

    Series:

    http://msprogrammer.serviciipeweb.ro/2017/06/12/powerbi-visualizations-the-default-ones/

    http://msprogrammer.serviciipeweb.ro/2017/06/19/powerbi-custom-visualizations-part-1/

    http://msprogrammer.serviciipeweb.ro/2017/06/26/powerbi-custom-visualizationpart-2/

    http://msprogrammer.serviciipeweb.ro/2017/07/03/powerbi-custom-visualizationwith-r-part-3/

     

     

    Now I wanted to give a try of each new visualization.  There are 89 visualization on https://store.office.com/search.aspx?productgroup=powerBI .

    I have played with last of them – without R integrations – 24 – and the .pbix file can be downloaded from https://1drv.ms/f/s!Aordxu1LWKDZgopsf3vS3IZx2UHOgQ  – you need just PowerBI Desktop.

    The visualizations are

    TornadoChart

    BrickChart

    CalendarVIsual

    EnlightenDataStory

    TableSorter

    TimeLIneSlicer

    TableHeatmap

    AttributeSlicer

    Sunburst

    HierarchySlicer

    WordCloud

    ChicletSLicer

    BubbleStack

    AsterPlot

    You can see here: