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

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

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 )

View File

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

View File

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

View 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