Update source form to specify folder

This commit is contained in:
Eike Kettner
2020-07-14 22:38:11 +02:00
parent 5b01c93711
commit ca5b7b999f
7 changed files with 245 additions and 86 deletions

View File

@ -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

View File

@ -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

View File

@ -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 )