diff --git a/slack_sdk/models/blocks/block_elements.py b/slack_sdk/models/blocks/block_elements.py index c65bd7f8..8b9ac4ed 100644 --- a/slack_sdk/models/blocks/block_elements.py +++ b/slack_sdk/models/blocks/block_elements.py @@ -1624,6 +1624,55 @@ def __init__( self.dispatch_action_config = dispatch_action_config +# ------------------------------------------------- +# File Input Element +# ------------------------------------------------- + + +class FileInputElement(InputInteractiveElement): + type = "file_input" + + @property + def attributes(self) -> Set[str]: + return super().attributes.union( + { + "filetypes", + "max_files", + } + ) + + def __init__( + self, + *, + action_id: Optional[str] = None, + filetypes: Optional[List[str]] = None, + max_files: Optional[int] = None, + **others: dict, + ): + """ + https://api.slack.com/reference/block-kit/block-elements#file_input + + Args: + action_id (required): An identifier for the input value when the parent modal is submitted. + You can use this when you receive a view_submission payload to identify the value of the input element. + Should be unique among all other action_ids in the containing block. Maximum length is 255 characters. + filetypes: An array of valid file extensions that will be accepted for this element. + All file extensions will be accepted if filetypes is not specified. + This validation is provided for convenience only, + and you should perform your own file type validation based on what you expect to receive. + max_files: Maximum number of files that can be uploaded for this file_input element. + Minimum of 1, maximum of 10. Defaults to 10 if not specified. + """ + super().__init__( + type=self.type, + action_id=action_id, + ) + show_unknown_key_warning(self, others) + + self.filetypes = filetypes + self.max_files = max_files + + # ------------------------------------------------- # Radio Buttons Select # ------------------------------------------------- diff --git a/tests/slack_sdk/models/test_elements.py b/tests/slack_sdk/models/test_elements.py index fe63d5fc..5a38e148 100644 --- a/tests/slack_sdk/models/test_elements.py +++ b/tests/slack_sdk/models/test_elements.py @@ -35,6 +35,7 @@ UrlInputElement, WorkflowButtonElement, RichTextInputElement, + FileInputElement, ) from . import STRING_3001_CHARS, STRING_301_CHARS @@ -1199,6 +1200,22 @@ def test_focus_on_load(self): self.assertDictEqual(input, NumberInputElement(**input).to_dict()) +# ------------------------------------------------- +# File Input Element +# ------------------------------------------------- + + +class FileInputElementTests(unittest.TestCase): + def test_element(self): + input = { + "type": "file_input", + "action_id": "file_input-action", + "filetypes": ["pdf", "txt"], + "max_files": 3, + } + self.assertDictEqual(input, FileInputElement(**input).to_dict()) + + # ------------------------------------------------- # Radio Buttons # -------------------------------------------------