Op zondag 20 november 2016 20:17:04 UTC+1 schreef Thomas Shelton:
>
> I'm not sure onInput will work with TD's though.  I'm not seeing any 
> messages logged in the console.  
>

Yeah, you are right. `onInput` does not fire on TDs.
I have changed my example to include your custom `on` handler for the 
innerHTML (see below).

Here I also pass the extra info on row and column to your Msg and update. 
(and log).

There is another problem with contenteditable however:
If you run the example, you will see that everything you enter will be 
displayed in reverse. So "you"  will be displayed as "uoy".

This is because elm/ DOM does not change the cursor position if you change 
the content.
You may need some other tricks to ensure that the cursor will move as well.

I normally use simple (but styled) <input> fields for text editing in Elm.

Updated example:

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (on)
import Json.Decode as JD exposing (Decoder)

main =
  beginnerProgram { model = model, view = view, update = update }

model =
  { table = myTable
  , log = ""
  }

myTable : List (List String)
myTable = 
  [ [ "Name", "Age", "Comment" ]
  , [ "Abe", "45", "" ]
  , [ "Bill", "69", "" ]
  , [ "Claire", "54", "" ]  
  ]

view model =
  div 
    []
    [ table []
      (List.indexedMap viewRow model.table)
    , div [] [ text <| "LOG = " ++ toString model.log ]
    ]

viewRow : Int -> List String -> Html Msg
viewRow rowIndex rowCells =
  tr [] 
     (List.indexedMap (viewCell rowIndex) rowCells)
     
viewCell : Int -> Int -> String -> Html Msg
viewCell rowIndex colIndex content =
  td
    [ attribute "data-x" "1"
    , attribute "data-y" "1"
    , on "input" (JD.map (Input rowIndex colIndex) targetInnerHtml)
    , contenteditable True
    , style [("border","solid black 1px")]
    ]
    [ text content ]
    
type Msg = Input Int Int String

targetInnerHtml : Decoder String
targetInnerHtml =
  JD.at ["target", "innerHTML"] JD.string


update msg model =
  case (Debug.log "msg:" msg) of
    Input rowIndex colIndex str ->
      { model 
      | log = toString msg 
      , table = 
          model.table
          |> updateList rowIndex (updateList colIndex (always str))
      }
      
updateList : Int -> (a -> a) -> List a -> List a
updateList index func list =
  list
  |> List.indexedMap (\i item -> if i == index then func item else item)


-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elm-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to