From 661e7fe0945215ade4fc20b639a15aaeedbf5b87 Mon Sep 17 00:00:00 2001 From: Peter Murphy Date: Tue, 16 Mar 2021 11:36:41 -0400 Subject: [PATCH 1/5] Add DataTransferItem and related API --- src/Web/HTML/Event/DataTransfer.js | 4 +++ src/Web/HTML/Event/DataTransfer.purs | 5 +++ .../Event/DataTransfer/DataTransferItem.js | 19 ++++++++++ .../Event/DataTransfer/DataTransferItem.purs | 35 +++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 src/Web/HTML/Event/DataTransfer/DataTransferItem.js create mode 100644 src/Web/HTML/Event/DataTransfer/DataTransferItem.purs diff --git a/src/Web/HTML/Event/DataTransfer.js b/src/Web/HTML/Event/DataTransfer.js index 8cec0ca..598b872 100644 --- a/src/Web/HTML/Event/DataTransfer.js +++ b/src/Web/HTML/Event/DataTransfer.js @@ -4,6 +4,10 @@ exports._files = function (dataTransfer) { return dataTransfer.files; }; +exports.items = function (dataTransfer) { + return dataTransfer.items; +}; + exports.types = function (dataTransfer) { return dataTransfer.types; }; diff --git a/src/Web/HTML/Event/DataTransfer.purs b/src/Web/HTML/Event/DataTransfer.purs index b63d127..3bf7b29 100644 --- a/src/Web/HTML/Event/DataTransfer.purs +++ b/src/Web/HTML/Event/DataTransfer.purs @@ -16,6 +16,7 @@ import Data.MediaType (MediaType(..)) import Data.Nullable (Nullable, toMaybe) import Effect (Effect) import Web.File.FileList (FileList) +import Web.HTML.Event.DataTransfer.DataTransferItem (DataTransferItemList) foreign import data DataTransfer :: Type @@ -29,6 +30,10 @@ 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 diff --git a/src/Web/HTML/Event/DataTransfer/DataTransferItem.js b/src/Web/HTML/Event/DataTransfer/DataTransferItem.js new file mode 100644 index 0000000..430d243 --- /dev/null +++ b/src/Web/HTML/Event/DataTransfer/DataTransferItem.js @@ -0,0 +1,19 @@ +"use strict"; + +exports.kind = function (dataTransferItem) { + return dataTransferItem.kind; +}; + +exports.type_ = function (dataTransferItem) { + return dataTransferItem.type; +}; + +exports._dataTransferItem = function (index) { + return function (dataTransferItemList) { + return dataTransferItemList[index]; + }; +}; + +exports._length = function (dataTransferItemList) { + return dataTransferItemList.length; +}; diff --git a/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs b/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs new file mode 100644 index 0000000..d0e148f --- /dev/null +++ b/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs @@ -0,0 +1,35 @@ +module Web.HTML.Event.DataTransfer.DataTransferItem + ( DataTransferItem + , DataTransferItemList + ) where + +import Prelude +import Data.Maybe (Maybe) +import Data.Nullable (Nullable) +import Data.Nullable as Nullable + +-- | Returns the drag data item kind, which is either "string" or "file". +foreign import kind :: DataTransferItem -> String + +-- | A Unicode string giving the type or format of the data, generally given by +-- | a MIME type. Some values that are not MIME types are special-cased for +-- | legacy reasons. The API does not enforce the use of MIME types; other +-- | values can be used as well. In all cases, however, the values are all +-- | converted to ASCII lowercase by the API. +-- | There is a limit of one text item per item type string. +foreign import type_ :: DataTransferItem -> String + +-- | Access an item in the `DataTransferItemList` by index. +dataTransferItem :: Int -> DataTransferItemList -> Maybe DataTransferItem +dataTransferItem = map Nullable.toMaybe <$> _dataTransferItem + +foreign import _dataTransferItem :: Int -> DataTransferItemList -> Nullable DataTransferItem + +length :: DataTransferItemList -> Int +length = _length + +foreign import _length :: DataTransferItemList -> Int + +foreign import data DataTransferItem :: Type + +foreign import data DataTransferItemList :: Type From 8e712710d9a9987f90127098edbff3e07a02e829 Mon Sep 17 00:00:00 2001 From: Peter Murphy Date: Tue, 16 Mar 2021 12:33:55 -0400 Subject: [PATCH 2/5] Add to CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0854c6e..049190c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Notable changes to this project are documented in this file. The format is based Breaking changes: New features: +- Added `items` function for `DataTransfer` and related types (`DataTransferItem`, `DataTransferItemList`) (#55 by @ptrfrncsmrph) Bugfixes: From c52f03f307c590a4e6ec7630ce2d69e8640a3c34 Mon Sep 17 00:00:00 2001 From: Peter Murphy Date: Thu, 7 Oct 2021 21:33:06 -0400 Subject: [PATCH 3/5] Make kind a sum type, add to exports --- src/Web/HTML/Event/DataTransfer.purs | 1 + .../Event/DataTransfer/DataTransferItem.js | 8 +++++-- .../Event/DataTransfer/DataTransferItem.purs | 23 ++++++++++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/Web/HTML/Event/DataTransfer.purs b/src/Web/HTML/Event/DataTransfer.purs index 3bf7b29..2256539 100644 --- a/src/Web/HTML/Event/DataTransfer.purs +++ b/src/Web/HTML/Event/DataTransfer.purs @@ -1,6 +1,7 @@ module Web.HTML.Event.DataTransfer ( DataTransfer , files + , items , types , getData , setData diff --git a/src/Web/HTML/Event/DataTransfer/DataTransferItem.js b/src/Web/HTML/Event/DataTransfer/DataTransferItem.js index 430d243..42c9bf9 100644 --- a/src/Web/HTML/Event/DataTransfer/DataTransferItem.js +++ b/src/Web/HTML/Event/DataTransfer/DataTransferItem.js @@ -1,7 +1,11 @@ "use strict"; -exports.kind = function (dataTransferItem) { - return dataTransferItem.kind; +exports._kind = function (text, file, dataTransferItem) { + if (dataTransferItem.kind === "string") { + return text; + } else { + return file; + } }; exports.type_ = function (dataTransferItem) { diff --git a/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs b/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs index d0e148f..0e60dd9 100644 --- a/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs +++ b/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs @@ -1,15 +1,36 @@ module Web.HTML.Event.DataTransfer.DataTransferItem ( DataTransferItem + , DataTransferItemKind(..) , DataTransferItemList + , dataTransferItem + , kind + , length + , type_ ) where import Prelude + +import Data.Function.Uncurried (Fn3) +import Data.Function.Uncurried as Uncurried import Data.Maybe (Maybe) import Data.Nullable (Nullable) import Data.Nullable as Nullable +data DataTransferItemKind = Text | File + +derive instance Eq DataTransferItemKind +derive instance Ord DataTransferItemKind + +instance Show DataTransferItemKind where + show = case _ of + Text -> "Text" + File -> "File" + -- | Returns the drag data item kind, which is either "string" or "file". -foreign import kind :: DataTransferItem -> String +kind :: DataTransferItem -> DataTransferItemKind +kind = Uncurried.runFn3 _kind Text File + +foreign import _kind :: Fn3 DataTransferItemKind DataTransferItemKind DataTransferItem DataTransferItemKind -- | A Unicode string giving the type or format of the data, generally given by -- | a MIME type. Some values that are not MIME types are special-cased for From 4870dd4b18dc90bd7f10c5c10b9705d5e323945a Mon Sep 17 00:00:00 2001 From: Peter Murphy Date: Thu, 7 Oct 2021 21:39:26 -0400 Subject: [PATCH 4/5] Order foreign imports first --- src/Web/HTML/Event/DataTransfer/DataTransferItem.purs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs b/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs index 0e60dd9..66e4f8a 100644 --- a/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs +++ b/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs @@ -26,12 +26,12 @@ instance Show DataTransferItemKind where Text -> "Text" File -> "File" +foreign import _kind :: Fn3 DataTransferItemKind DataTransferItemKind DataTransferItem DataTransferItemKind + -- | Returns the drag data item kind, which is either "string" or "file". kind :: DataTransferItem -> DataTransferItemKind kind = Uncurried.runFn3 _kind Text File -foreign import _kind :: Fn3 DataTransferItemKind DataTransferItemKind DataTransferItem DataTransferItemKind - -- | A Unicode string giving the type or format of the data, generally given by -- | a MIME type. Some values that are not MIME types are special-cased for -- | legacy reasons. The API does not enforce the use of MIME types; other @@ -40,17 +40,17 @@ foreign import _kind :: Fn3 DataTransferItemKind DataTransferItemKind DataTransf -- | There is a limit of one text item per item type string. foreign import type_ :: DataTransferItem -> String +foreign import _dataTransferItem :: Int -> DataTransferItemList -> Nullable DataTransferItem + -- | Access an item in the `DataTransferItemList` by index. dataTransferItem :: Int -> DataTransferItemList -> Maybe DataTransferItem dataTransferItem = map Nullable.toMaybe <$> _dataTransferItem -foreign import _dataTransferItem :: Int -> DataTransferItemList -> Nullable DataTransferItem +foreign import _length :: DataTransferItemList -> Int length :: DataTransferItemList -> Int length = _length -foreign import _length :: DataTransferItemList -> Int - foreign import data DataTransferItem :: Type foreign import data DataTransferItemList :: Type From 879e72446714e433088c9e0f84f40d5d7732767f Mon Sep 17 00:00:00 2001 From: Peter Murphy Date: Thu, 7 Oct 2021 22:16:48 -0400 Subject: [PATCH 5/5] Update `kind` to return `Maybe` --- .../Event/DataTransfer/DataTransferItem.js | 8 +++++--- .../Event/DataTransfer/DataTransferItem.purs | 20 +++++++++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Web/HTML/Event/DataTransfer/DataTransferItem.js b/src/Web/HTML/Event/DataTransfer/DataTransferItem.js index 42c9bf9..dd10c49 100644 --- a/src/Web/HTML/Event/DataTransfer/DataTransferItem.js +++ b/src/Web/HTML/Event/DataTransfer/DataTransferItem.js @@ -1,10 +1,12 @@ "use strict"; -exports._kind = function (text, file, dataTransferItem) { +exports._kind = function (nothing, just, text, file, dataTransferItem) { if (dataTransferItem.kind === "string") { - return text; + return just(text); + } else if (dataTransferItem.kind === "file") { + return just(file); } else { - return file; + return nothing; } }; diff --git a/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs b/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs index 66e4f8a..f71bc5f 100644 --- a/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs +++ b/src/Web/HTML/Event/DataTransfer/DataTransferItem.purs @@ -10,9 +10,9 @@ module Web.HTML.Event.DataTransfer.DataTransferItem import Prelude -import Data.Function.Uncurried (Fn3) +import Data.Function.Uncurried (Fn5) import Data.Function.Uncurried as Uncurried -import Data.Maybe (Maybe) +import Data.Maybe (Maybe(..)) import Data.Nullable (Nullable) import Data.Nullable as Nullable @@ -26,11 +26,19 @@ instance Show DataTransferItemKind where Text -> "Text" File -> "File" -foreign import _kind :: Fn3 DataTransferItemKind DataTransferItemKind DataTransferItem DataTransferItemKind +foreign import _kind + :: Fn5 (forall x. Maybe x) + (forall x. x -> Maybe x) + DataTransferItemKind + DataTransferItemKind + DataTransferItem + (Maybe DataTransferItemKind) --- | Returns the drag data item kind, which is either "string" or "file". -kind :: DataTransferItem -> DataTransferItemKind -kind = Uncurried.runFn3 _kind Text File +-- | Returns the drag data item kind of the `DataTransferItem`. In the case +-- | where the `DataTransferItem` object is in _disabled mode_, `Nothing` is +-- | returned. +kind :: DataTransferItem -> Maybe DataTransferItemKind +kind = Uncurried.runFn5 _kind Nothing Just Text File -- | A Unicode string giving the type or format of the data, generally given by -- | a MIME type. Some values that are not MIME types are special-cased for