2016-09-29 13 views
4

Jsonのデータを解析してソート可能なテーブルにレンダリングする機能をElmで設計しようとしています。Elmのソート可能なテーブル

もちろん、私はJsonデータをレコードのリストに格納するためにデコーダを使用しています。ビューの中では、グリッド内のデータを繰り返し処理したいので、レコードのリストをDictsのリストに変換します。また、グリッドの列にタイトルを付けるためにstrリスト(列)を使用して、データがグリッド内に表示される順序をカスタマイズできるようにします。

resourceDecoder : Decoder Resource 
resourceDecoder = 
    decode Resource 
     |> required "year" int 
     |> required "total_amount" string 
     |> required "seq_type" string 
     |> required "sent" bool 
     |> required "parents_id" int 
     |> required "month" int 
     |> required "location_id" int 
     |> required "child" childDecoder 
     |> required "id" int 
childDecoder : Decoder Child 
childDecoder = 
    decode Child 
     |> required "firstname" string 
     |> required "lastname" string 
responseDecoder : Decoder (List Resource) 
responseDecoder = 
    Json.Decode.list resourceDecoder 
recordToDict : Resource -> ResourceDict 
     recordToDict record = 
      Dict.fromList 
       [ ("Year", toString record.year) 
       , ("Total Amount", record.total_amount) 
       , ("Sequence Type", record.seq_type) 
       , ("Sent", toString record.sent) 
       , ("Parents", toString record.parents_id) 
       , ("Month", toString record.month) 
       , ("Location", toString record.location_id) 
       , ("Firstname", record.child.firstname) 
       , ("Lastname", record.child.lastname) 
       , ("id", toString record.id) 
       ] 
columnsData : List String 
columnsData = 
    [ "Firstname" 
    , "Lastname" 
    , "Year" 
    , "Total Amount" 
    , "Sequence Type" 
    , "Sent" 
    , "Parents" 
    , "Month" 
    , "Location" 
    ] 

ここで問題です:私の知る限り、それはキーの値によってdictsのリストをソートすることはできませんので、私は、レコードのentiresをソートする必要があり値の場合(たとえば、子供の名前で並べ替える場合は:

List.sortBy (\r -> r.child.lastname) grid.resources 

しかし、列タイトルは文字列であり、必ずしもレコードキーと同じではありません(たとえば、フィールドの場合はr.child.lastname、列タイトルは「姓」です)。とにかく、私の理解はレコードキーです明示的に呼び出さなければならないため、列名をレコード・キーに一致させることはできません。

テーブルの列をクリックしてそのフィールドで並べ替えることができます。例えば:

私は私が書いたことは明らかであると思います。ご協力いただきありがとうございます!

+0

ごめんなさい入力して所望の出力 – halfzebra

+1

を提供するために、あなたの超クールだろう、私は正確にはわかりませんこの文脈では、入力と出力の意味はありますが、イメージが含まれています。 –

+2

https://github.com/evancz/elm-sortable-tableを使ってみたことがありますか?私が知る限り、あなたが望む機能を正確に提供していますか? –

答えて

5

どうすればよいですか? のキーとタイトルのDictとしてcolumnsDataを保持するのはどうですか? 次に、キーを使用してDictのリストをソートしますか?

(私は、リソースのキーであるString明確にするためにKeyを定義した)

type alias Key = String 
columnsData : Dict.Dict String Key 
columnsData = Dict.fromList 
    [ ("Firstname",  "firstName") 
    , ("Lastname",  "lastName") 
    , ("Year",   "year") 
    , ("Total Amount", "totalAmount") 
    , ("Sequence Type", "seqType") 
    , ("Sent",   "sent") 
    , ("Parents",  "parents") 
    , ("Month",   "month") 
    , ("Location",  "location") 
    ] 

sort : Key -> List ResourceDict -> List ResourceDict 
sort key dicts = 
    let 
    getVal dict = Maybe.withDefault "-" <| Dict.get key dict 
    in List.sortBy getVal dicts 
+0

それはトリックでした!実際、リソースはすでに辞書であるため、列を辞書にする必要はなく、文字列のリストのみを作成しました。しかし、あなたが提案する並べ替え機能は、私が探していたものとまったく同じです。 –

関連する問題