Globalizacji ciąg dalszy
Kilka dni temu ogłosiłem nadzieję na zakończenie moich zmagań z Bootstrap Datepicker. Jak wiadomo, nadzieja jest matką głupich, i dzisiaj musiałem wrócić do tego tematu przy okazji naprawiania dat w gridzie. Po ostatnich zmianach zauważyłem, że daty w kolumnach wyświetlane są w amerykańskim formacie, zaś wyszukiwanie nie działa.
Wyszukiwanie
Oryginalny jqGrid korzystał z filtrowania dat przy użyciu kontrolki jQuery UI. Po przejściu na Bootstrapa i wprowadzeniu kompatybilnego z nim Datepickera, pojawił się on również w gridzie. Nic dziwnego, wszakże po załączeniu bootstrap-datepicker.js na stronie, funkcja datepicker
konfiguruje teraz kontrolkę Bootstrapa, a nie jQuery.
Początkowo chciałem zaktualizować kod biblioteki MvcJqGrid
, której używam do generowania kodu grida o obsługę innej kontrolki. Niestety kod tej biblioteki nie jest zbyt elastyczny i moim zdaniem wymaga większej refaktoryzacji. Nie chcę się tym teraz zajmować, więc wybrałem prostsze rozwiązanie. Dość toporne, ale za to skuteczne. Utworzyłem klasę JqGridConfigurationUpdater
, której zadaniem jest poprawienie kodu JavaScript wygenerowanego przez MvcJqGrid
poprzez zamianę takiego ciągu znaków:
Na taki:
Przy czym {0}
to kod kultury, a {1}
to id grida. Proste i nie wymagające przesadnego nakładu pracy.
Mały bonus tego rozwiązania
Przy okazji ta klasa zajmuje się teraz naprawianiem pozostałych problemów z gridem, a są to:
- Lokalizacja tekstu “Wyczyść filtry”.
- Brakująca opcja “Wszystkie” w dropdownach służących do filtrowania kolumn zawierających enumy.
- Wymuszenie tematu Bootstrapa zamiast jQuery UI.
Wyświetlanie
Przez jakiś czas debugowałem kod JavaScript, próowałem konfigurować grida za pomocą róznych formatterów, ale nie przyniosło mi to żadnego efektu. Zacząłem się zastanawiać czy czasem nie wysyłam zepsutych dat z serwera. I okazało się to prawdą. Już chciałem winić którąś z niewinnych JavaScriptowych biblioteczek, a wina była w 100% moja. Na dodatek to był piękny WTF.
Ponieważ jqGrid wymaga danych w formacie JSON:
Czego odpowiednikiem w .NET jest JsonResult
utworzony na podstawie anonimowego obiektu o określonej strukturze:
Główny problem jest z generycznym utworzeniem kolekcji items
. Z backendu otrzymuję przecież kolekcję generycznego typu TGridModel
, natomiast do jsonData
muszę wstawić anonimowe obiekty. Konwersją zajmuje się klasa TypeToJqGridObjectMapperGenerator
. Efektem jej działania jest coś takiego:
Jak widać, kluczowa jest tutaj zapewnienie, aby wszystkie wartości zostały skonwertowane do typu string
.
I wewnątrz tej klasy miałem taki piękny kod:
Tak to jest, jak się nie zmienia nazw zmiennych na bieżąco, i nie globalizuje od początku. Poprawiłem to na:
I teraz działa pięknie.
Morał
Nauczyłem się jednej rzeczy - choć brzmi to nieprawdopodobnie, nie zawsze winny jest JavaScript. Ale zazwyczaj tak, więc i tak szukanie jakichkolwiek błędów z wyświetlaniem danych, należy zaczynać od niego.