mirror of
				https://github.com/TheAnachronism/docspell.git
				synced 2025-10-31 17:50:11 +00:00 
			
		
		
		
	Update source form to specify folder
This commit is contained in:
		| @@ -60,6 +60,9 @@ init key url flags settings = | ||||
|  | ||||
|         ( mdm, mdc ) = | ||||
|             Page.ManageData.Data.init flags | ||||
|  | ||||
|         ( csm, csc ) = | ||||
|             Page.CollectiveSettings.Data.init flags | ||||
|     in | ||||
|     ( { flags = flags | ||||
|       , key = key | ||||
| @@ -68,7 +71,7 @@ init key url flags settings = | ||||
|       , homeModel = Page.Home.Data.init flags | ||||
|       , loginModel = Page.Login.Data.emptyModel | ||||
|       , manageDataModel = mdm | ||||
|       , collSettingsModel = Page.CollectiveSettings.Data.emptyModel | ||||
|       , collSettingsModel = csm | ||||
|       , userSettingsModel = um | ||||
|       , queueModel = Page.Queue.Data.emptyModel | ||||
|       , registerModel = Page.Register.Data.emptyModel | ||||
| @@ -82,6 +85,7 @@ init key url flags settings = | ||||
|     , Cmd.batch | ||||
|         [ Cmd.map UserSettingsMsg uc | ||||
|         , Cmd.map ManageDataMsg mdc | ||||
|         , Cmd.map CollSettingsMsg csc | ||||
|         ] | ||||
|     ) | ||||
|  | ||||
|   | ||||
| @@ -54,6 +54,7 @@ import Page exposing (Page(..)) | ||||
| import Ports | ||||
| import Set exposing (Set) | ||||
| import Util.File exposing (makeFileId) | ||||
| import Util.Folder exposing (mkFolderOption) | ||||
| import Util.Http | ||||
| import Util.List | ||||
| import Util.Maybe | ||||
| @@ -131,36 +132,6 @@ isEditNotes field = | ||||
|             False | ||||
|  | ||||
|  | ||||
| mkFolderOption : Flags -> List FolderItem -> IdName -> Comp.Dropdown.Option | ||||
| mkFolderOption flags allFolders idref = | ||||
|     let | ||||
|         folder = | ||||
|             List.filter (\e -> e.id == idref.id) allFolders | ||||
|                 |> List.head | ||||
|  | ||||
|         isMember = | ||||
|             folder | ||||
|                 |> Maybe.map .isMember | ||||
|                 |> Maybe.withDefault False | ||||
|  | ||||
|         isOwner = | ||||
|             Maybe.map .owner folder | ||||
|                 |> Maybe.map .name | ||||
|                 |> (==) (Maybe.map .user flags.account) | ||||
|  | ||||
|         adds = | ||||
|             if isOwner then | ||||
|                 "owner" | ||||
|  | ||||
|             else if isMember then | ||||
|                 "member" | ||||
|  | ||||
|             else | ||||
|                 "" | ||||
|     in | ||||
|     { value = idref.id, text = idref.name, additional = adds } | ||||
|  | ||||
|  | ||||
| emptyModel : Model | ||||
| emptyModel = | ||||
|     { item = Api.Model.ItemDetail.empty | ||||
| @@ -2552,13 +2523,5 @@ isFolderMember model = | ||||
|             Comp.Dropdown.getSelected model.folderModel | ||||
|                 |> List.head | ||||
|                 |> Maybe.map .id | ||||
|  | ||||
|         findFolder id = | ||||
|             List.filter (\e -> e.id == id) model.allFolders | ||||
|                 |> List.head | ||||
|  | ||||
|         folder = | ||||
|             Maybe.andThen findFolder selected | ||||
|     in | ||||
|     Maybe.map .isMember folder | ||||
|         |> Maybe.withDefault True | ||||
|     Util.Folder.isFolderMember model.allFolders selected | ||||
|   | ||||
| @@ -1,20 +1,29 @@ | ||||
| module Comp.SourceForm exposing | ||||
|     ( Model | ||||
|     , Msg(..) | ||||
|     , emptyModel | ||||
|     , getSource | ||||
|     , init | ||||
|     , isValid | ||||
|     , update | ||||
|     , view | ||||
|     ) | ||||
|  | ||||
| import Api | ||||
| import Api.Model.FolderItem exposing (FolderItem) | ||||
| import Api.Model.FolderList exposing (FolderList) | ||||
| import Api.Model.IdName exposing (IdName) | ||||
| import Api.Model.Source exposing (Source) | ||||
| import Comp.Dropdown exposing (isDropdownChangeMsg) | ||||
| import Comp.FixedDropdown | ||||
| import Data.Flags exposing (Flags) | ||||
| import Data.Priority exposing (Priority) | ||||
| import Data.UiSettings exposing (UiSettings) | ||||
| import Html exposing (..) | ||||
| import Html.Attributes exposing (..) | ||||
| import Html.Events exposing (onCheck, onInput) | ||||
| import Http | ||||
| import Markdown | ||||
| import Util.Folder exposing (mkFolderOption) | ||||
|  | ||||
|  | ||||
| type alias Model = | ||||
| @@ -24,6 +33,9 @@ type alias Model = | ||||
|     , priorityModel : Comp.FixedDropdown.Model Priority | ||||
|     , priority : Priority | ||||
|     , enabled : Bool | ||||
|     , folderModel : Comp.Dropdown.Model IdName | ||||
|     , allFolders : List FolderItem | ||||
|     , folderId : Maybe String | ||||
|     } | ||||
|  | ||||
|  | ||||
| @@ -38,9 +50,23 @@ emptyModel = | ||||
|             Data.Priority.all | ||||
|     , priority = Data.Priority.Low | ||||
|     , enabled = False | ||||
|     , folderModel = | ||||
|         Comp.Dropdown.makeSingle | ||||
|             { makeOption = \e -> { value = e.id, text = e.name, additional = "" } | ||||
|             , placeholder = "" | ||||
|             } | ||||
|     , allFolders = [] | ||||
|     , folderId = Nothing | ||||
|     } | ||||
|  | ||||
|  | ||||
| init : Flags -> ( Model, Cmd Msg ) | ||||
| init flags = | ||||
|     ( emptyModel | ||||
|     , Api.getFolders flags "" False GetFolderResp | ||||
|     ) | ||||
|  | ||||
|  | ||||
| isValid : Model -> Bool | ||||
| isValid model = | ||||
|     model.abbrev /= "" | ||||
| @@ -57,6 +83,7 @@ getSource model = | ||||
|         , description = model.description | ||||
|         , enabled = model.enabled | ||||
|         , priority = Data.Priority.toName model.priority | ||||
|         , folder = model.folderId | ||||
|     } | ||||
|  | ||||
|  | ||||
| @@ -66,10 +93,12 @@ type Msg | ||||
|     | SetDescr String | ||||
|     | ToggleEnabled | ||||
|     | PrioDropdownMsg (Comp.FixedDropdown.Msg Priority) | ||||
|     | GetFolderResp (Result Http.Error FolderList) | ||||
|     | FolderDropdownMsg (Comp.Dropdown.Msg IdName) | ||||
|  | ||||
|  | ||||
| update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) | ||||
| update _ msg model = | ||||
| update flags msg model = | ||||
|     case msg of | ||||
|         SetSource t -> | ||||
|             let | ||||
| @@ -83,19 +112,41 @@ update _ msg model = | ||||
|                         , description = t.description | ||||
|                         , priority = t.priority | ||||
|                         , enabled = t.enabled | ||||
|                         , folder = t.folder | ||||
|                     } | ||||
|  | ||||
|                 newModel = | ||||
|                     { model | ||||
|                         | source = np | ||||
|                         , abbrev = t.abbrev | ||||
|                         , description = t.description | ||||
|                         , priority = | ||||
|                             Data.Priority.fromString t.priority | ||||
|                                 |> Maybe.withDefault Data.Priority.Low | ||||
|                         , enabled = t.enabled | ||||
|                         , folderId = t.folder | ||||
|                     } | ||||
|  | ||||
|                 mkIdName id = | ||||
|                     List.filterMap | ||||
|                         (\f -> | ||||
|                             if f.id == id then | ||||
|                                 Just (IdName id f.name) | ||||
|  | ||||
|                             else | ||||
|                                 Nothing | ||||
|                         ) | ||||
|                         model.allFolders | ||||
|  | ||||
|                 sel = | ||||
|                     case Maybe.map mkIdName t.folder of | ||||
|                         Just idref -> | ||||
|                             idref | ||||
|  | ||||
|                         Nothing -> | ||||
|                             [] | ||||
|             in | ||||
|             ( { model | ||||
|                 | source = np | ||||
|                 , abbrev = t.abbrev | ||||
|                 , description = t.description | ||||
|                 , priority = | ||||
|                     Data.Priority.fromString t.priority | ||||
|                         |> Maybe.withDefault Data.Priority.Low | ||||
|                 , enabled = t.enabled | ||||
|               } | ||||
|             , Cmd.none | ||||
|             ) | ||||
|             update flags (FolderDropdownMsg (Comp.Dropdown.SetSelection sel)) newModel | ||||
|  | ||||
|         ToggleEnabled -> | ||||
|             ( { model | enabled = not model.enabled }, Cmd.none ) | ||||
| @@ -127,16 +178,60 @@ update _ msg model = | ||||
|             , Cmd.none | ||||
|             ) | ||||
|  | ||||
|         GetFolderResp (Ok fs) -> | ||||
|             let | ||||
|                 model_ = | ||||
|                     { model | ||||
|                         | allFolders = fs.items | ||||
|                         , folderModel = | ||||
|                             Comp.Dropdown.setMkOption | ||||
|                                 (mkFolderOption flags fs.items) | ||||
|                                 model.folderModel | ||||
|                     } | ||||
|  | ||||
| view : Flags -> Model -> Html Msg | ||||
| view flags model = | ||||
|                 mkIdName fitem = | ||||
|                     IdName fitem.id fitem.name | ||||
|  | ||||
|                 opts = | ||||
|                     fs.items | ||||
|                         |> List.map mkIdName | ||||
|                         |> Comp.Dropdown.SetOptions | ||||
|             in | ||||
|             update flags (FolderDropdownMsg opts) model_ | ||||
|  | ||||
|         GetFolderResp (Err _) -> | ||||
|             ( model, 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 | folderId = Maybe.map .id idref } | ||||
|  | ||||
|                     else | ||||
|                         newModel | ||||
|             in | ||||
|             ( model_, Cmd.map FolderDropdownMsg c2 ) | ||||
|  | ||||
|  | ||||
| view : Flags -> UiSettings -> Model -> Html Msg | ||||
| view flags settings model = | ||||
|     let | ||||
|         priorityItem = | ||||
|             Comp.FixedDropdown.Item | ||||
|                 model.priority | ||||
|                 (Data.Priority.toName model.priority) | ||||
|     in | ||||
|     div [ class "ui form" ] | ||||
|     div [ class "ui warning form" ] | ||||
|         [ div | ||||
|             [ classList | ||||
|                 [ ( "field", True ) | ||||
| @@ -179,6 +274,25 @@ view flags model = | ||||
|                     model.priorityModel | ||||
|                 ) | ||||
|             ] | ||||
|         , div [ class "field" ] | ||||
|             [ label [] | ||||
|                 [ text "Folder" | ||||
|                 ] | ||||
|             , Html.map FolderDropdownMsg (Comp.Dropdown.view settings model.folderModel) | ||||
|             , div | ||||
|                 [ classList | ||||
|                     [ ( "ui warning message", True ) | ||||
|                     , ( "hidden", isFolderMember model ) | ||||
|                     ] | ||||
|                 ] | ||||
|                 [ Markdown.toHtml [] """ | ||||
| You are **not a member** of this folder. Items created through this | ||||
| link 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. | ||||
|                       """ | ||||
|                 ] | ||||
|             ] | ||||
|         , urlInfoMessage flags model | ||||
|         ] | ||||
|  | ||||
| @@ -217,3 +331,14 @@ urlInfoMessage flags model = | ||||
|                 ] | ||||
|             ] | ||||
|         ] | ||||
|  | ||||
|  | ||||
| isFolderMember : Model -> Bool | ||||
| isFolderMember model = | ||||
|     let | ||||
|         selected = | ||||
|             Comp.Dropdown.getSelected model.folderModel | ||||
|                 |> List.head | ||||
|                 |> Maybe.map .id | ||||
|     in | ||||
|     Util.Folder.isFolderMember model.allFolders selected | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| module Comp.SourceManage exposing | ||||
|     ( Model | ||||
|     , Msg(..) | ||||
|     , emptyModel | ||||
|     , init | ||||
|     , update | ||||
|     , view | ||||
|     ) | ||||
| @@ -14,6 +14,7 @@ import Comp.SourceForm | ||||
| import Comp.SourceTable | ||||
| import Comp.YesNoDimmer | ||||
| import Data.Flags exposing (Flags) | ||||
| import Data.UiSettings exposing (UiSettings) | ||||
| import Html exposing (..) | ||||
| import Html.Attributes exposing (..) | ||||
| import Html.Events exposing (onClick, onSubmit) | ||||
| @@ -37,15 +38,21 @@ type ViewMode | ||||
|     | Form | ||||
|  | ||||
|  | ||||
| emptyModel : Model | ||||
| emptyModel = | ||||
|     { tableModel = Comp.SourceTable.emptyModel | ||||
|     , formModel = Comp.SourceForm.emptyModel | ||||
|     , viewMode = Table | ||||
|     , formError = Nothing | ||||
|     , loading = False | ||||
|     , deleteConfirm = Comp.YesNoDimmer.emptyModel | ||||
|     } | ||||
| init : Flags -> ( Model, Cmd Msg ) | ||||
| init flags = | ||||
|     let | ||||
|         ( fm, fc ) = | ||||
|             Comp.SourceForm.init flags | ||||
|     in | ||||
|     ( { tableModel = Comp.SourceTable.emptyModel | ||||
|       , formModel = fm | ||||
|       , viewMode = Table | ||||
|       , formError = Nothing | ||||
|       , loading = False | ||||
|       , deleteConfirm = Comp.YesNoDimmer.emptyModel | ||||
|       } | ||||
|     , Cmd.map FormMsg fc | ||||
|     ) | ||||
|  | ||||
|  | ||||
| type Msg | ||||
| @@ -187,13 +194,13 @@ update flags msg model = | ||||
|             ( { model | deleteConfirm = cm }, cmd ) | ||||
|  | ||||
|  | ||||
| view : Flags -> Model -> Html Msg | ||||
| view flags model = | ||||
| view : Flags -> UiSettings -> Model -> Html Msg | ||||
| view flags settings model = | ||||
|     if model.viewMode == Table then | ||||
|         viewTable model | ||||
|  | ||||
|     else | ||||
|         div [] (viewForm flags model) | ||||
|         div [] (viewForm flags settings model) | ||||
|  | ||||
|  | ||||
| viewTable : Model -> Html Msg | ||||
| @@ -215,8 +222,8 @@ viewTable model = | ||||
|         ] | ||||
|  | ||||
|  | ||||
| viewForm : Flags -> Model -> List (Html Msg) | ||||
| viewForm flags model = | ||||
| viewForm : Flags -> UiSettings -> Model -> List (Html Msg) | ||||
| viewForm flags settings model = | ||||
|     let | ||||
|         newSource = | ||||
|             model.formModel.source.id == "" | ||||
| @@ -236,7 +243,7 @@ viewForm flags model = | ||||
|             ] | ||||
|     , Html.form [ class "ui attached segment", onSubmit Submit ] | ||||
|         [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) | ||||
|         , Html.map FormMsg (Comp.SourceForm.view flags model.formModel) | ||||
|         , Html.map FormMsg (Comp.SourceForm.view flags settings model.formModel) | ||||
|         , div | ||||
|             [ classList | ||||
|                 [ ( "ui error message", True ) | ||||
|   | ||||
| @@ -2,7 +2,7 @@ module Page.CollectiveSettings.Data exposing | ||||
|     ( Model | ||||
|     , Msg(..) | ||||
|     , Tab(..) | ||||
|     , emptyModel | ||||
|     , init | ||||
|     ) | ||||
|  | ||||
| import Api.Model.BasicResult exposing (BasicResult) | ||||
| @@ -11,6 +11,7 @@ import Api.Model.ItemInsights exposing (ItemInsights) | ||||
| import Comp.CollectiveSettingsForm | ||||
| import Comp.SourceManage | ||||
| import Comp.UserManage | ||||
| import Data.Flags exposing (Flags) | ||||
| import Http | ||||
|  | ||||
|  | ||||
| @@ -24,15 +25,21 @@ type alias Model = | ||||
|     } | ||||
|  | ||||
|  | ||||
| emptyModel : Model | ||||
| emptyModel = | ||||
|     { currentTab = Just InsightsTab | ||||
|     , sourceModel = Comp.SourceManage.emptyModel | ||||
|     , userModel = Comp.UserManage.emptyModel | ||||
|     , settingsModel = Comp.CollectiveSettingsForm.init Api.Model.CollectiveSettings.empty | ||||
|     , insights = Api.Model.ItemInsights.empty | ||||
|     , submitResult = Nothing | ||||
|     } | ||||
| init : Flags -> ( Model, Cmd Msg ) | ||||
| init flags = | ||||
|     let | ||||
|         ( sm, sc ) = | ||||
|             Comp.SourceManage.init flags | ||||
|     in | ||||
|     ( { currentTab = Just InsightsTab | ||||
|       , sourceModel = sm | ||||
|       , userModel = Comp.UserManage.emptyModel | ||||
|       , settingsModel = Comp.CollectiveSettingsForm.init Api.Model.CollectiveSettings.empty | ||||
|       , insights = Api.Model.ItemInsights.empty | ||||
|       , submitResult = Nothing | ||||
|       } | ||||
|     , Cmd.map SourceMsg sc | ||||
|     ) | ||||
|  | ||||
|  | ||||
| type Tab | ||||
|   | ||||
| @@ -59,7 +59,7 @@ view flags settings model = | ||||
|             [ div [ class "" ] | ||||
|                 (case model.currentTab of | ||||
|                     Just SourceTab -> | ||||
|                         viewSources flags model | ||||
|                         viewSources flags settings model | ||||
|  | ||||
|                     Just UserTab -> | ||||
|                         viewUsers settings model | ||||
| @@ -153,15 +153,15 @@ makeTagStats nc = | ||||
|         ] | ||||
|  | ||||
|  | ||||
| viewSources : Flags -> Model -> List (Html Msg) | ||||
| viewSources flags model = | ||||
| viewSources : Flags -> UiSettings -> Model -> List (Html Msg) | ||||
| viewSources flags settings model = | ||||
|     [ h2 [ class "ui header" ] | ||||
|         [ i [ class "ui upload icon" ] [] | ||||
|         , div [ class "content" ] | ||||
|             [ text "Sources" | ||||
|             ] | ||||
|         ] | ||||
|     , Html.map SourceMsg (Comp.SourceManage.view flags model.sourceModel) | ||||
|     , Html.map SourceMsg (Comp.SourceManage.view flags settings model.sourceModel) | ||||
|     ] | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										53
									
								
								modules/webapp/src/main/elm/Util/Folder.elm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								modules/webapp/src/main/elm/Util/Folder.elm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| module Util.Folder exposing | ||||
|     ( isFolderMember | ||||
|     , mkFolderOption | ||||
|     ) | ||||
|  | ||||
| import Api.Model.FolderItem exposing (FolderItem) | ||||
| import Api.Model.IdName exposing (IdName) | ||||
| import Comp.Dropdown | ||||
| import Data.Flags exposing (Flags) | ||||
|  | ||||
|  | ||||
| mkFolderOption : Flags -> List FolderItem -> IdName -> Comp.Dropdown.Option | ||||
| mkFolderOption flags allFolders idref = | ||||
|     let | ||||
|         folder = | ||||
|             List.filter (\e -> e.id == idref.id) allFolders | ||||
|                 |> List.head | ||||
|  | ||||
|         isMember = | ||||
|             folder | ||||
|                 |> Maybe.map .isMember | ||||
|                 |> Maybe.withDefault False | ||||
|  | ||||
|         isOwner = | ||||
|             Maybe.map .owner folder | ||||
|                 |> Maybe.map .name | ||||
|                 |> (==) (Maybe.map .user flags.account) | ||||
|  | ||||
|         adds = | ||||
|             if isOwner then | ||||
|                 "owner" | ||||
|  | ||||
|             else if isMember then | ||||
|                 "member" | ||||
|  | ||||
|             else | ||||
|                 "" | ||||
|     in | ||||
|     { value = idref.id, text = idref.name, additional = adds } | ||||
|  | ||||
|  | ||||
| isFolderMember : List FolderItem -> Maybe String -> Bool | ||||
| isFolderMember allFolders selected = | ||||
|     let | ||||
|         findFolder id = | ||||
|             List.filter (\e -> e.id == id) allFolders | ||||
|                 |> List.head | ||||
|  | ||||
|         folder = | ||||
|             Maybe.andThen findFolder selected | ||||
|     in | ||||
|     Maybe.map .isMember folder | ||||
|         |> Maybe.withDefault True | ||||
		Reference in New Issue
	
	Block a user