mirror of
				https://github.com/TheAnachronism/docspell.git
				synced 2025-10-31 17:50:11 +00:00 
			
		
		
		
	Allow to set a folder when importing mailboxes
This commit is contained in:
		| @@ -10,10 +10,13 @@ module Comp.ScanMailboxForm exposing | ||||
|  | ||||
| import Api | ||||
| import Api.Model.BasicResult exposing (BasicResult) | ||||
| import Api.Model.FolderItem exposing (FolderItem) | ||||
| import Api.Model.FolderList exposing (FolderList) | ||||
| import Api.Model.IdName exposing (IdName) | ||||
| import Api.Model.ImapSettingsList exposing (ImapSettingsList) | ||||
| import Api.Model.ScanMailboxSettings exposing (ScanMailboxSettings) | ||||
| import Comp.CalEventInput | ||||
| import Comp.Dropdown | ||||
| import Comp.Dropdown exposing (isDropdownChangeMsg) | ||||
| import Comp.IntField | ||||
| import Comp.StringListInput | ||||
| import Comp.YesNoDimmer | ||||
| @@ -26,9 +29,12 @@ import Html exposing (..) | ||||
| import Html.Attributes exposing (..) | ||||
| import Html.Events exposing (onCheck, onClick, onInput) | ||||
| import Http | ||||
| import Markdown | ||||
| import Util.Folder exposing (mkFolderOption) | ||||
| import Util.Http | ||||
| import Util.List | ||||
| import Util.Maybe | ||||
| import Util.Update | ||||
|  | ||||
|  | ||||
| type alias Model = | ||||
| @@ -47,6 +53,9 @@ type alias Model = | ||||
|     , formMsg : Maybe BasicResult | ||||
|     , loading : Int | ||||
|     , yesNoDelete : Comp.YesNoDimmer.Model | ||||
|     , folderModel : Comp.Dropdown.Model IdName | ||||
|     , allFolders : List FolderItem | ||||
|     , itemFolderId : Maybe String | ||||
|     } | ||||
|  | ||||
|  | ||||
| @@ -73,6 +82,8 @@ type Msg | ||||
|     | FoldersMsg Comp.StringListInput.Msg | ||||
|     | DirectionMsg (Maybe Direction) | ||||
|     | YesNoDeleteMsg Comp.YesNoDimmer.Msg | ||||
|     | GetFolderResp (Result Http.Error FolderList) | ||||
|     | FolderDropdownMsg (Comp.Dropdown.Msg IdName) | ||||
|  | ||||
|  | ||||
| initWith : Flags -> ScanMailboxSettings -> ( Model, Cmd Msg ) | ||||
| @@ -108,11 +119,13 @@ initWith flags s = | ||||
|         , scheduleModel = sm | ||||
|         , formMsg = Nothing | ||||
|         , yesNoDelete = Comp.YesNoDimmer.emptyModel | ||||
|         , itemFolderId = s.itemFolder | ||||
|       } | ||||
|     , Cmd.batch | ||||
|         [ Api.getImapSettings flags "" ConnResp | ||||
|         , nc | ||||
|         , Cmd.map CalEventMsg sc | ||||
|         , Api.getFolders flags "" False GetFolderResp | ||||
|         ] | ||||
|     ) | ||||
|  | ||||
| @@ -143,12 +156,20 @@ init flags = | ||||
|       , schedule = initialSchedule | ||||
|       , scheduleModel = sm | ||||
|       , formMsg = Nothing | ||||
|       , loading = 1 | ||||
|       , loading = 2 | ||||
|       , yesNoDelete = Comp.YesNoDimmer.emptyModel | ||||
|       , folderModel = | ||||
|             Comp.Dropdown.makeSingle | ||||
|                 { makeOption = \e -> { value = e.id, text = e.name, additional = "" } | ||||
|                 , placeholder = "" | ||||
|                 } | ||||
|       , allFolders = [] | ||||
|       , itemFolderId = Nothing | ||||
|       } | ||||
|     , Cmd.batch | ||||
|         [ Api.getImapSettings flags "" ConnResp | ||||
|         , Cmd.map CalEventMsg sc | ||||
|         , Api.getFolders flags "" False GetFolderResp | ||||
|         ] | ||||
|     ) | ||||
|  | ||||
| @@ -186,6 +207,7 @@ makeSettings model = | ||||
|                 , folders = folders | ||||
|                 , direction = Maybe.map Data.Direction.toString model.direction | ||||
|                 , schedule = Data.CalEvent.makeEvent timer | ||||
|                 , itemFolder = model.itemFolderId | ||||
|             } | ||||
|     in | ||||
|     Data.Validated.map3 make | ||||
| @@ -402,6 +424,84 @@ update flags msg model = | ||||
|             , Cmd.none | ||||
|             ) | ||||
|  | ||||
|         GetFolderResp (Ok fs) -> | ||||
|             let | ||||
|                 model_ = | ||||
|                     { model | ||||
|                         | allFolders = fs.items | ||||
|                         , loading = model.loading - 1 | ||||
|                         , folderModel = | ||||
|                             Comp.Dropdown.setMkOption | ||||
|                                 (mkFolderOption flags fs.items) | ||||
|                                 model.folderModel | ||||
|                     } | ||||
|  | ||||
|                 mkIdName fitem = | ||||
|                     IdName fitem.id fitem.name | ||||
|  | ||||
|                 opts = | ||||
|                     fs.items | ||||
|                         |> List.map mkIdName | ||||
|                         |> Comp.Dropdown.SetOptions | ||||
|  | ||||
|                 mkIdNameFromId id = | ||||
|                     List.filterMap | ||||
|                         (\f -> | ||||
|                             if f.id == id then | ||||
|                                 Just (IdName id f.name) | ||||
|  | ||||
|                             else | ||||
|                                 Nothing | ||||
|                         ) | ||||
|                         fs.items | ||||
|  | ||||
|                 sel = | ||||
|                     case Maybe.map mkIdNameFromId model.itemFolderId of | ||||
|                         Just idref -> | ||||
|                             idref | ||||
|  | ||||
|                         Nothing -> | ||||
|                             [] | ||||
|  | ||||
|                 removeAction ( a, _, c ) = | ||||
|                     ( a, c ) | ||||
|  | ||||
|                 addNoAction ( a, b ) = | ||||
|                     ( a, NoAction, b ) | ||||
|             in | ||||
|             Util.Update.andThen1 | ||||
|                 [ update flags (FolderDropdownMsg opts) >> removeAction | ||||
|                 , update flags (FolderDropdownMsg (Comp.Dropdown.SetSelection sel)) >> removeAction | ||||
|                 ] | ||||
|                 model_ | ||||
|                 |> addNoAction | ||||
|  | ||||
|         GetFolderResp (Err _) -> | ||||
|             ( { model | loading = model.loading - 1 } | ||||
|             , NoAction | ||||
|             , Cmd.none | ||||
|             ) | ||||
|  | ||||
|         FolderDropdownMsg m -> | ||||
|             let | ||||
|                 ( m2, c2 ) = | ||||
|                     Comp.Dropdown.update m model.folderModel | ||||
|  | ||||
|                 newModel = | ||||
|                     { model | folderModel = m2 } | ||||
|  | ||||
|                 idref = | ||||
|                     Comp.Dropdown.getSelected m2 |> List.head | ||||
|  | ||||
|                 model_ = | ||||
|                     if isDropdownChangeMsg m then | ||||
|                         { newModel | itemFolderId = Maybe.map .id idref } | ||||
|  | ||||
|                     else | ||||
|                         newModel | ||||
|             in | ||||
|             ( model_, NoAction, Cmd.map FolderDropdownMsg c2 ) | ||||
|  | ||||
|  | ||||
|  | ||||
| --- View | ||||
| @@ -424,7 +524,7 @@ view : String -> UiSettings -> Model -> Html Msg | ||||
| view extraClasses settings model = | ||||
|     div | ||||
|         [ classList | ||||
|             [ ( "ui form", True ) | ||||
|             [ ( "ui warning form", True ) | ||||
|             , ( extraClasses, True ) | ||||
|             , ( "error", isFormError model ) | ||||
|             , ( "success", isFormSuccess model ) | ||||
| @@ -547,6 +647,28 @@ view extraClasses settings model = | ||||
|                     ] | ||||
|                 ] | ||||
|             ] | ||||
|         , div [ class "field" ] | ||||
|             [ label [] | ||||
|                 [ text "Item Folder" | ||||
|                 ] | ||||
|             , Html.map FolderDropdownMsg (Comp.Dropdown.view settings model.folderModel) | ||||
|             , span [ class "small-info" ] | ||||
|                 [ text "Put all items from this mailbox into the selected folder" | ||||
|                 ] | ||||
|             , div | ||||
|                 [ classList | ||||
|                     [ ( "ui warning message", True ) | ||||
|                     , ( "hidden", isFolderMember model ) | ||||
|                     ] | ||||
|                 ] | ||||
|                 [ Markdown.toHtml [] """ | ||||
| You are **not a member** of this folder. Items created from mails in | ||||
| this mailbox will be **hidden** from any search results. Use a folder | ||||
| where you are a member of to make items visible. This message will | ||||
| disappear then. | ||||
|                       """ | ||||
|                 ] | ||||
|             ] | ||||
|         , div [ class "required field" ] | ||||
|             [ label [] | ||||
|                 [ text "Schedule" | ||||
| @@ -612,3 +734,14 @@ view extraClasses settings model = | ||||
|             [ text "Start Once" | ||||
|             ] | ||||
|         ] | ||||
|  | ||||
|  | ||||
| isFolderMember : Model -> Bool | ||||
| isFolderMember model = | ||||
|     let | ||||
|         selected = | ||||
|             Comp.Dropdown.getSelected model.folderModel | ||||
|                 |> List.head | ||||
|                 |> Maybe.map .id | ||||
|     in | ||||
|     Util.Folder.isFolderMember model.allFolders selected | ||||
|   | ||||
		Reference in New Issue
	
	Block a user