module Web.HTML.Event.DataTransfer ( DataTransfer , files , items , types , getData , setData , setDragImage , DropEffect(..) , dropEffect , setDropEffect ) where import Prelude import Data.Maybe (Maybe) import Data.MediaType (MediaType(..)) import Data.Nullable (Nullable, toMaybe) import Effect (Effect) import Web.DOM.Element (Element) import Web.File.FileList (FileList) import Web.HTML.Event.DataTransfer.DataTransferItem (DataTransferItemList) foreign import data DataTransfer :: Type -- | Contains a list of all the local files available on the data transfer. -- | Empty if the drag operation doesn't involve dragging files. -- | -- | It's possible that a drag operation may have null files, instead of an -- | empty file list. In these cases Nothing is returned. files :: DataTransfer -> Maybe FileList files = toMaybe <$> _files foreign import _files :: DataTransfer -> Nullable FileList -- | Returns a `DataTransferItemList` object which is a list of all of the drag -- | data. foreign import items :: DataTransfer -> DataTransferItemList -- | Returns an array of data formats used in the drag operation. -- | If the drag operation included no data, then the array is empty. foreign import types :: DataTransfer -> Array String foreign import _getData :: String -> DataTransfer -> Effect String -- | Retrieves the data for a given media type, or an empty string if data for -- | that type does not exist or the data transfer object contains no data. getData :: MediaType -> DataTransfer -> Effect String getData (MediaType format) dt = _getData format dt foreign import _setData :: String -> String -> DataTransfer -> Effect Unit -- | Sets the data transfer object's data for a given media format. setData :: MediaType -> String -> DataTransfer -> Effect Unit setData (MediaType format) dat dt = _setData format dat dt foreign import _setDragImage :: DataTransfer -> Element -> Int -> Int -> Effect Unit -- | Sets the image to be used for dragging if a custom one is desired. -- | The image will typically be an but could be any other *visible* element. -- | The x and y coordinates define where the image appears relative to the mouse. setDragImage :: DataTransfer -> Element -> Int -> Int -> Effect Unit setDragImage = _setDragImage foreign import _dropEffect :: DataTransfer -> Effect String data DropEffect = Copy | Link | Move | None derive instance eqDropEffect :: Eq DropEffect derive instance ordDropEffect :: Ord DropEffect -- | Gets the data transfer object's drop effect. dropEffect :: DataTransfer -> Effect DropEffect dropEffect dt = _dropEffect dt <#> case _ of "copy" -> Copy "link" -> Link "move" -> Move "none" -> None _ -> None foreign import _setDropEffect :: String -> DataTransfer -> Effect Unit -- | Sets the data transfer object's drop effect. setDropEffect :: DropEffect -> DataTransfer -> Effect Unit setDropEffect de = _setDropEffect case de of Copy -> "copy" Link -> "link" Move -> "move" None -> "none"