[HomeWallet] Zarządzanie

Po majówkowej przerwie od projektu, zapraszam na kolejne podsumowanie tygodnia prac nad Home Wallet.

 


Zarządzanie

 

Konntynuując wątek zarządzania sklepami, produktami oraz kategoriami dodałem nowe menu przez które możemy dostać się do nowych funkcjonalności. Na razie utrzymuje wszystko w w miarę podobnej stylistyce, jednak w przyszłości prawdopodobnie zostanie ono zmienione na coś dostępnego z każdego miejsca.

 

 

Jak widać możemy dostać się stąd również do ustawień aplikacji oraz konta. Na razie kafelki te nie działają, jednak chciałbym zrobić globalne ustawienia, gdzie można byłoby zmienić np. motyw czy też używaną walutę. W ustawieniach konta znajdą się standardowo takie rzeczy jak zmiana hasła czy e-maila.

 

Standardowe nazwy sklepów na produkcji 😉

 

Przechodząc do zarządzania np. sklepami, tutaj również znajdziemy kafelki. Na stronie pokazują się maksymalnie 12, reszta jest przerzucana na kolejne strony. Możliwe jest również wyszukiwanie. Logika pod sortowanie jest napisana, muszę jedynie dodać odpowiedni selektor.

 

public async Task<IActionResult> Index(string sortOrder, string currentFilter, string searchString, int? page)
{
    ViewData["CurrentSort"] = sortOrder;
    ViewData["NameSortParm"] = string.IsNullOrEmpty(sortOrder) ? "name_desc" : "";

    if (searchString != null)
    {
        page = 1;
    }
    else
    {
        searchString = currentFilter;
    }

    ViewData["CurrentFilter"] = searchString;
    var shops = _context.Shops.Where(s => s.UserID == _userManager.GetUserId(HttpContext.User));

    if (!string.IsNullOrEmpty(searchString))
    {
        shops = shops.Where(s => s.Name.ToLower().Contains(searchString.ToLower()));
    }

    switch (sortOrder)
    {
        case "name_desc":
             shops = shops.OrderByDescending(s => s.Name);
             break;
        default:
             shops = shops.OrderBy(s => s.Name);
             break;
    }

    var pageSize = 12;
    return View(await PaginatedList<Shop>.CreateAsync(shops, page ?? 1, pageSize));
        
}

 

Gdy wybierzemy konkretny obiekt, zobaczymy jego konkretne dane. Dla sklepu będzie to jego nazwa oraz produkty które w nim kupiliśmy. Dla produktu są to kategorie, a dla kategorii również produkty. Wszystkie te listy posiadają odnośniki, możemy więc w prosty sposób przechodzić pomiędzy obiektami. Dodatkowo po prawej stronie znajdują się przyciski do edycji, usuwania oraz powrotu do listy.

 

 

Same szczegóły podzieliłem na dwie zakładki. W drugiej z nich docelowo znajdą się statystyki związane z np. danym sklepem. Przechodzenie pomiędzy zakładkami zrealizowane jest prostym jQuery. Ze względu na użycie tego samego kodu w minimum trzech miejscach wylądował on w oddzielnym pliku .js.

 

$('#statisticstab').click(function () {
    $(this).parent().addClass('active');
    $('#detailstab').parent().removeClass('active');
    $('#detailsdiv').hide();
    $('#statisticsdiv').show();
});
$('#detailstab').click(function () {
    $(this).parent().addClass('active');
    $('#statisticstab').parent().removeClass('active');
    $('#detailsdiv').show();
    $('#statisticsdiv').hide();
});

 

Edycja, usuwanie oraz przeglądanie cudzych danych zostało zablokowane poprzez specjalne metody sprawdzające czy ID użytkownika zgadza się z tym aktualnie zalogowanym.

 

public static bool CheckById(int categoryId, string userId, ApplicationDbContext context)
{
     var category = context.Categories.FirstOrDefault(c => c.ID == categoryId);
     return category.UserID == userId;
}

 

 


Rejestracja

 

Drugą rzeczą jaką zacząłem realizować jest podanie naszej głównej waluty podczas rejestracji.

 

 

Dzięki temu waluta jaka będzie wyświetlana na ekranie będzie odpowiadała faktycznej walucie w jakiej dokonaliśmy zakupu oraz będzie to łatwe do zmiany w ustawieniach.

 

Nie znalazłem niestety żadnego gotowego zestawu światowych walut, przez co byłem zmuszony do stworzenia własnej listy. Na razie jest ona bardzo uboga, jednak któregoś dnia usiądę i uzupełnię ją o wszystkie główne waluty.

 

public static ICollection<CurrencyViewModel> GetList()
{
    var list = new List<CurrencyViewModel>
    {
        new CurrencyViewModel()
        {
            Name = "Polish złoty",
            Value = "zł"
        },
        new CurrencyViewModel()
        {
            Name = "America (United States) Dollars – USD",
            Value = "$"
        },
        new CurrencyViewModel()
        {
            Name = "Euro",
            Value = "€"
        }
    };
    return list;
}

 


Taiga

 

Aby stworzyć rozsądny backlog oraz usprawnić prace nad projektem postanowiłem ponownie wykorzystać aplikację Taiga. Za jej pomocą możemy korzystać z zalet Scrum’a bądź Tangan’a. Bardzo polubiłem pracować w taki sposób podczas pisania innej aplikacji. Jest to miejsce w którym zawsze możemy zapisać pomysły na kolejne funkcjonalności, rozsądnie podzielić sobie etapy tworzenia oraz widzieć jakie robimy postępy i ile prac nam zostało.

 

 


Podsumowanie

 

I to by było na tyle. Zdaję sobie sprawę, że prace nie idą zbyt szybko, jednak ze względu na ciągłą naukę Unity niestety jestem zmuszony nieco mniej czasu poświęcać na Home Wallet. Mimo wszystko dzięki Waszym wiadomościom wciąż jestem zmotywowany do dalszego pisania. Dzięki wielkie!

W przyszłym tygodniu prawdopodobnie zajmę się statystykami dla poszczególnych danych, np. sklepów czy kategorii. Największym wyzwaniem będzie tu prawdopodobnie wymyślenie jakie tak naprawdę są potrzebne oraz ich sensowne przedstawienie.

Na dzisiaj to tyle. Dzięki za uwagę.

Do zobaczenia, cześć!

Dodaj komentarz