Use powersearch input element in share form

This commit is contained in:
eikek 2021-10-07 23:51:09 +02:00
parent fe77f7245a
commit 40aa2d4102
7 changed files with 136 additions and 66 deletions

View File

@ -478,14 +478,14 @@ updateUserSettings lmsg model =
updateCollSettings : Page.CollectiveSettings.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg ) updateCollSettings : Page.CollectiveSettings.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateCollSettings lmsg model = updateCollSettings lmsg model =
let let
( lm, lc ) = ( lm, lc, ls ) =
Page.CollectiveSettings.Update.update model.flags Page.CollectiveSettings.Update.update model.flags
lmsg lmsg
model.collSettingsModel model.collSettingsModel
in in
( { model | collSettingsModel = lm } ( { model | collSettingsModel = lm }
, Cmd.map CollSettingsMsg lc , Cmd.map CollSettingsMsg lc
, Sub.none , Sub.map CollSettingsMsg ls
) )

View File

@ -153,6 +153,7 @@ attachHeader texts settings model _ attach =
[ href "#" [ href "#"
, onClick ToggleAttachMenu , onClick ToggleAttachMenu
, class S.secondaryBasicButton , class S.secondaryBasicButton
, class "mr-2"
, classList , classList
[ ( "bg-gray-200 dark:bg-bluegray-600 ", model.attachMenuOpen ) [ ( "bg-gray-200 dark:bg-bluegray-600 ", model.attachMenuOpen )
, ( "hidden", not multiAttach ) , ( "hidden", not multiAttach )
@ -160,12 +161,16 @@ attachHeader texts settings model _ attach =
, ( "hidden sm:block", multiAttach && not mobile ) , ( "hidden sm:block", multiAttach && not mobile )
] ]
] ]
[ i [ class "fa fa-images font-thin" ] [] [ if model.attachMenuOpen then
i [ class "fa fa-chevron-up" ] []
else
i [ class "fa fa-chevron-down" ] []
] ]
in in
div [ class "flex flex-col sm:flex-row items-center w-full" ] div [ class "flex flex-col sm:flex-row items-center w-full" ]
[ attachSelectToggle False [ attachSelectToggle False
, div [ class "ml-2 text-base font-bold flex-grow w-full text-center sm:text-left break-all" ] , div [ class "text-base font-bold flex-grow w-full text-center sm:text-left break-all" ]
[ text attachName [ text attachName
, text " (" , text " ("
, text (Util.Size.bytesReadable Util.Size.B (toFloat attach.size)) , text (Util.Size.bytesReadable Util.Size.B (toFloat attach.size))

View File

@ -11,6 +11,8 @@ module Comp.PowerSearchInput exposing
, Msg , Msg
, ViewSettings , ViewSettings
, init , init
, isValid
, setSearchString
, update , update
, viewInput , viewInput
, viewResult , viewResult
@ -43,6 +45,11 @@ init =
} }
isValid : Model -> Bool
isValid model =
model.input /= Nothing && model.result.success
type Msg type Msg
= SetSearch String = SetSearch String
| KeyUpMsg (Maybe KeyCode) | KeyUpMsg (Maybe KeyCode)
@ -63,6 +70,11 @@ type alias Result =
} }
setSearchString : String -> Msg
setSearchString q =
SetSearch q
--- Update --- Update

View File

@ -108,6 +108,7 @@ type Outcome
type alias UpdateResult = type alias UpdateResult =
{ model : Model { model : Model
, cmd : Cmd Msg , cmd : Cmd Msg
, sub : Sub Msg
, outcome : Outcome , outcome : Outcome
} }
@ -118,16 +119,18 @@ update flags msg model =
CancelPublish -> CancelPublish ->
{ model = model { model = model
, cmd = Cmd.none , cmd = Cmd.none
, sub = Sub.none
, outcome = OutcomeDone , outcome = OutcomeDone
} }
FormMsg lm -> FormMsg lm ->
let let
( fm, fc ) = ( fm, fc, fs ) =
Comp.ShareForm.update flags lm model.formModel Comp.ShareForm.update flags lm model.formModel
in in
{ model = { model | formModel = fm } { model = { model | formModel = fm }
, cmd = Cmd.map FormMsg fc , cmd = Cmd.map FormMsg fc
, sub = Sub.map FormMsg fs
, outcome = OutcomeInProgress , outcome = OutcomeInProgress
} }
@ -136,12 +139,14 @@ update flags msg model =
Just ( _, data ) -> Just ( _, data ) ->
{ model = { model | loading = True } { model = { model | loading = True }
, cmd = Api.addShare flags data PublishResp , cmd = Api.addShare flags data PublishResp
, sub = Sub.none
, outcome = OutcomeInProgress , outcome = OutcomeInProgress
} }
Nothing -> Nothing ->
{ model = { model | formError = FormErrorInvalid } { model = { model | formError = FormErrorInvalid }
, cmd = Cmd.none , cmd = Cmd.none
, sub = Sub.none
, outcome = OutcomeInProgress , outcome = OutcomeInProgress
} }
@ -149,18 +154,21 @@ update flags msg model =
if res.success then if res.success then
{ model = model { model = model
, cmd = Api.getShare flags res.id GetShareResp , cmd = Api.getShare flags res.id GetShareResp
, sub = Sub.none
, outcome = OutcomeInProgress , outcome = OutcomeInProgress
} }
else else
{ model = { model | formError = FormErrorSubmit res.message, loading = False } { model = { model | formError = FormErrorSubmit res.message, loading = False }
, cmd = Cmd.none , cmd = Cmd.none
, sub = Sub.none
, outcome = OutcomeInProgress , outcome = OutcomeInProgress
} }
PublishResp (Err err) -> PublishResp (Err err) ->
{ model = { model | formError = FormErrorHttp err, loading = False } { model = { model | formError = FormErrorHttp err, loading = False }
, cmd = Cmd.none , cmd = Cmd.none
, sub = Sub.none
, outcome = OutcomeInProgress , outcome = OutcomeInProgress
} }
@ -172,12 +180,14 @@ update flags msg model =
, viewMode = ViewModeInfo share , viewMode = ViewModeInfo share
} }
, cmd = Ports.initClipboard (Comp.ShareView.clipboardData share) , cmd = Ports.initClipboard (Comp.ShareView.clipboardData share)
, sub = Sub.none
, outcome = OutcomeInProgress , outcome = OutcomeInProgress
} }
GetShareResp (Err err) -> GetShareResp (Err err) ->
{ model = { model | formError = FormErrorHttp err, loading = False } { model = { model | formError = FormErrorHttp err, loading = False }
, cmd = Cmd.none , cmd = Cmd.none
, sub = Sub.none
, outcome = OutcomeInProgress , outcome = OutcomeInProgress
} }

View File

@ -12,6 +12,7 @@ import Api.Model.ShareDetail exposing (ShareDetail)
import Comp.Basic as B import Comp.Basic as B
import Comp.DatePicker import Comp.DatePicker
import Comp.PasswordInput import Comp.PasswordInput
import Comp.PowerSearchInput
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import DatePicker exposing (DatePicker) import DatePicker exposing (DatePicker)
import Html exposing (..) import Html exposing (..)
@ -25,7 +26,7 @@ import Util.Maybe
type alias Model = type alias Model =
{ share : ShareDetail { share : ShareDetail
, name : Maybe String , name : Maybe String
, query : String , queryModel : Comp.PowerSearchInput.Model
, enabled : Bool , enabled : Bool
, passwordModel : Comp.PasswordInput.Model , passwordModel : Comp.PasswordInput.Model
, password : Maybe String , password : Maybe String
@ -41,10 +42,15 @@ initQuery q =
let let
( dp, dpc ) = ( dp, dpc ) =
Comp.DatePicker.init Comp.DatePicker.init
res =
Comp.PowerSearchInput.update
(Comp.PowerSearchInput.setSearchString q)
Comp.PowerSearchInput.init
in in
( { share = Api.Model.ShareDetail.empty ( { share = Api.Model.ShareDetail.empty
, name = Nothing , name = Nothing
, query = q , queryModel = res.model
, enabled = True , enabled = True
, passwordModel = Comp.PasswordInput.init , passwordModel = Comp.PasswordInput.init
, password = Nothing , password = Nothing
@ -53,7 +59,10 @@ initQuery q =
, untilModel = dp , untilModel = dp
, untilDate = Nothing , untilDate = Nothing
} }
, Cmd.map UntilDateMsg dpc , Cmd.batch
[ Cmd.map UntilDateMsg dpc
, Cmd.map QueryMsg res.cmd
]
) )
@ -64,17 +73,19 @@ init =
isValid : Model -> Bool isValid : Model -> Bool
isValid model = isValid model =
model.query /= "" && model.untilDate /= Nothing Comp.PowerSearchInput.isValid model.queryModel
&& model.untilDate
/= Nothing
type Msg type Msg
= SetName String = SetName String
| SetQuery String
| SetShare ShareDetail | SetShare ShareDetail
| ToggleEnabled | ToggleEnabled
| ToggleClearPassword | ToggleClearPassword
| PasswordMsg Comp.PasswordInput.Msg | PasswordMsg Comp.PasswordInput.Msg
| UntilDateMsg Comp.DatePicker.Msg | UntilDateMsg Comp.DatePicker.Msg
| QueryMsg Comp.PowerSearchInput.Msg
setShare : ShareDetail -> Msg setShare : ShareDetail -> Msg
@ -88,7 +99,9 @@ getShare model =
Just Just
( model.share.id ( model.share.id
, { name = model.name , { name = model.name
, query = model.query , query =
model.queryModel.input
|> Maybe.withDefault ""
, enabled = model.enabled , enabled = model.enabled
, password = model.password , password = model.password
, removePassword = , removePassword =
@ -105,14 +118,20 @@ getShare model =
Nothing Nothing
update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
update _ msg model = update _ msg model =
case msg of case msg of
SetShare s -> SetShare s ->
let
res =
Comp.PowerSearchInput.update
(Comp.PowerSearchInput.setSearchString s.query)
model.queryModel
in
( { model ( { model
| share = s | share = s
, name = s.name , name = s.name
, query = s.query , queryModel = res.model
, enabled = s.enabled , enabled = s.enabled
, password = Nothing , password = Nothing
, passwordSet = s.password , passwordSet = s.password
@ -124,20 +143,18 @@ update _ msg model =
else else
Nothing Nothing
} }
, Cmd.none , Cmd.map QueryMsg res.cmd
, Sub.map QueryMsg res.subs
) )
SetName n -> SetName n ->
( { model | name = Util.Maybe.fromString n }, Cmd.none ) ( { model | name = Util.Maybe.fromString n }, Cmd.none, Sub.none )
SetQuery n ->
( { model | query = n }, Cmd.none )
ToggleEnabled -> ToggleEnabled ->
( { model | enabled = not model.enabled }, Cmd.none ) ( { model | enabled = not model.enabled }, Cmd.none, Sub.none )
ToggleClearPassword -> ToggleClearPassword ->
( { model | clearPassword = not model.clearPassword }, Cmd.none ) ( { model | clearPassword = not model.clearPassword }, Cmd.none, Sub.none )
PasswordMsg lm -> PasswordMsg lm ->
let let
@ -149,6 +166,7 @@ update _ msg model =
, password = pw , password = pw
} }
, Cmd.none , Cmd.none
, Sub.none
) )
UntilDateMsg lm -> UntilDateMsg lm ->
@ -166,6 +184,17 @@ update _ msg model =
in in
( { model | untilModel = dp, untilDate = nextDate } ( { model | untilModel = dp, untilDate = nextDate }
, Cmd.none , Cmd.none
, Sub.none
)
QueryMsg lm ->
let
res =
Comp.PowerSearchInput.update lm model.queryModel
in
( { model | queryModel = res.model }
, Cmd.map QueryMsg res.cmd
, Sub.map QueryMsg res.subs
) )
@ -175,6 +204,21 @@ update _ msg model =
view : Texts -> Model -> Html Msg view : Texts -> Model -> Html Msg
view texts model = view texts model =
let
queryInput =
div
[ class "relative flex flex-grow flex-row" ]
[ Html.map QueryMsg
(Comp.PowerSearchInput.viewInput
{ placeholder = texts.queryLabel
, extraAttrs = []
}
model.queryModel
)
, Html.map QueryMsg
(Comp.PowerSearchInput.viewResult [] model.queryModel)
]
in
div div
[ class "flex flex-col" ] [ class "flex flex-col" ]
[ div [ class "mb-4" ] [ div [ class "mb-4" ]
@ -202,20 +246,7 @@ view texts model =
[ text texts.queryLabel [ text texts.queryLabel
, B.inputRequired , B.inputRequired
] ]
, input , queryInput
[ type_ "text"
, onInput SetQuery
, placeholder texts.queryLabel
, value model.query
, id "sharequery"
, class S.textInput
, classList
[ ( S.inputErrorBorder
, model.query == ""
)
]
]
[]
] ]
, div [ class "mb-4" ] , div [ class "mb-4" ]
[ label [ label

View File

@ -98,7 +98,7 @@ loadShares =
--- update --- update
update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
update flags msg model = update flags msg model =
case msg of case msg of
InitNewShare -> InitNewShare ->
@ -118,14 +118,18 @@ update flags msg model =
else else
Cmd.none Cmd.none
, Sub.none
) )
FormMsg lm -> FormMsg lm ->
let let
( fm, fc ) = ( fm, fc, fs ) =
Comp.ShareForm.update flags lm model.formModel Comp.ShareForm.update flags lm model.formModel
in in
( { model | formModel = fm }, Cmd.map FormMsg fc ) ( { model | formModel = fm, formError = FormErrorNone }
, Cmd.map FormMsg fc
, Sub.map FormMsg fs
)
TableMsg lm -> TableMsg lm ->
let let
@ -137,75 +141,79 @@ update flags msg model =
setShare share flags model setShare share flags model
RequestDelete -> RequestDelete ->
( { model | deleteConfirm = DeleteConfirmOn }, Cmd.none ) ( { model | deleteConfirm = DeleteConfirmOn }, Cmd.none, Sub.none )
CancelDelete -> CancelDelete ->
( { model | deleteConfirm = DeleteConfirmOff }, Cmd.none ) ( { model | deleteConfirm = DeleteConfirmOff }, Cmd.none, Sub.none )
DeleteShareNow id -> DeleteShareNow id ->
( { model | deleteConfirm = DeleteConfirmOff, loading = True } ( { model | deleteConfirm = DeleteConfirmOff, loading = True }
, Api.deleteShare flags id DeleteShareResp , Api.deleteShare flags id DeleteShareResp
, Sub.none
) )
LoadShares -> LoadShares ->
( { model | loading = True }, Api.getShares flags LoadSharesResp ) ( { model | loading = True }, Api.getShares flags LoadSharesResp, Sub.none )
LoadSharesResp (Ok list) -> LoadSharesResp (Ok list) ->
( { model | loading = False, shares = list.items, formError = FormErrorNone }, Cmd.none ) ( { model | loading = False, shares = list.items, formError = FormErrorNone }
, Cmd.none
, Sub.none
)
LoadSharesResp (Err err) -> LoadSharesResp (Err err) ->
( { model | loading = False, formError = FormErrorHttp err }, Cmd.none ) ( { model | loading = False, formError = FormErrorHttp err }, Cmd.none, Sub.none )
Submit -> Submit ->
case Comp.ShareForm.getShare model.formModel of case Comp.ShareForm.getShare model.formModel of
Just ( id, data ) -> Just ( id, data ) ->
if id == "" then if id == "" then
( { model | loading = True }, Api.addShare flags data AddShareResp ) ( { model | loading = True }, Api.addShare flags data AddShareResp, Sub.none )
else else
( { model | loading = True }, Api.updateShare flags id data UpdateShareResp ) ( { model | loading = True }, Api.updateShare flags id data UpdateShareResp, Sub.none )
Nothing -> Nothing ->
( { model | formError = FormErrorInvalid }, Cmd.none ) ( { model | formError = FormErrorInvalid }, Cmd.none, Sub.none )
AddShareResp (Ok res) -> AddShareResp (Ok res) ->
if res.success then if res.success then
( model, Api.getShare flags res.id GetShareResp ) ( model, Api.getShare flags res.id GetShareResp, Sub.none )
else else
( { model | loading = False, formError = FormErrorSubmit res.message }, Cmd.none ) ( { model | loading = False, formError = FormErrorSubmit res.message }, Cmd.none, Sub.none )
AddShareResp (Err err) -> AddShareResp (Err err) ->
( { model | loading = False, formError = FormErrorHttp err }, Cmd.none ) ( { model | loading = False, formError = FormErrorHttp err }, Cmd.none, Sub.none )
UpdateShareResp (Ok res) -> UpdateShareResp (Ok res) ->
if res.success then if res.success then
( model, Api.getShare flags model.formModel.share.id GetShareResp ) ( model, Api.getShare flags model.formModel.share.id GetShareResp, Sub.none )
else else
( { model | loading = False, formError = FormErrorSubmit res.message }, Cmd.none ) ( { model | loading = False, formError = FormErrorSubmit res.message }, Cmd.none, Sub.none )
UpdateShareResp (Err err) -> UpdateShareResp (Err err) ->
( { model | loading = False, formError = FormErrorHttp err }, Cmd.none ) ( { model | loading = False, formError = FormErrorHttp err }, Cmd.none, Sub.none )
GetShareResp (Ok share) -> GetShareResp (Ok share) ->
setShare share flags model setShare share flags model
GetShareResp (Err err) -> GetShareResp (Err err) ->
( { model | formError = FormErrorHttp err }, Cmd.none ) ( { model | formError = FormErrorHttp err }, Cmd.none, Sub.none )
DeleteShareResp (Ok res) -> DeleteShareResp (Ok res) ->
if res.success then if res.success then
update flags (SetViewMode Table) { model | loading = False } update flags (SetViewMode Table) { model | loading = False }
else else
( { model | formError = FormErrorSubmit res.message, loading = False }, Cmd.none ) ( { model | formError = FormErrorSubmit res.message, loading = False }, Cmd.none, Sub.none )
DeleteShareResp (Err err) -> DeleteShareResp (Err err) ->
( { model | formError = FormErrorHttp err, loading = False }, Cmd.none ) ( { model | formError = FormErrorHttp err, loading = False }, Cmd.none, Sub.none )
setShare : ShareDetail -> Flags -> Model -> ( Model, Cmd Msg ) setShare : ShareDetail -> Flags -> Model -> ( Model, Cmd Msg, Sub Msg )
setShare share flags model = setShare share flags model =
let let
nextModel = nextModel =
@ -214,10 +222,10 @@ setShare share flags model =
initClipboard = initClipboard =
Ports.initClipboard (Comp.ShareView.clipboardData share) Ports.initClipboard (Comp.ShareView.clipboardData share)
( nm, nc ) = ( nm, nc, ns ) =
update flags (FormMsg <| Comp.ShareForm.setShare share) nextModel update flags (FormMsg <| Comp.ShareForm.setShare share) nextModel
in in
( nm, Cmd.batch [ initClipboard, nc ] ) ( nm, Cmd.batch [ initClipboard, nc ], ns )

View File

@ -16,7 +16,7 @@ import Data.Flags exposing (Flags)
import Page.CollectiveSettings.Data exposing (..) import Page.CollectiveSettings.Data exposing (..)
update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
update flags msg model = update flags msg model =
case msg of case msg of
SetTab t -> SetTab t ->
@ -45,21 +45,21 @@ update flags msg model =
( m2, c2 ) = ( m2, c2 ) =
Comp.SourceManage.update flags m model.sourceModel Comp.SourceManage.update flags m model.sourceModel
in in
( { model | sourceModel = m2 }, Cmd.map SourceMsg c2 ) ( { model | sourceModel = m2 }, Cmd.map SourceMsg c2, Sub.none )
ShareMsg lm -> ShareMsg lm ->
let let
( sm, sc ) = ( sm, sc, ss ) =
Comp.ShareManage.update flags lm model.shareModel Comp.ShareManage.update flags lm model.shareModel
in in
( { model | shareModel = sm }, Cmd.map ShareMsg sc ) ( { model | shareModel = sm }, Cmd.map ShareMsg sc, Sub.map ShareMsg ss )
UserMsg m -> UserMsg m ->
let let
( m2, c2 ) = ( m2, c2 ) =
Comp.UserManage.update flags m model.userModel Comp.UserManage.update flags m model.userModel
in in
( { model | userModel = m2 }, Cmd.map UserMsg c2 ) ( { model | userModel = m2 }, Cmd.map UserMsg c2, Sub.none )
SettingsFormMsg m -> SettingsFormMsg m ->
let let
@ -76,6 +76,7 @@ update flags msg model =
in in
( { model | settingsModel = m2, formState = InitialState } ( { model | settingsModel = m2, formState = InitialState }
, Cmd.batch [ cmd, Cmd.map SettingsFormMsg c2 ] , Cmd.batch [ cmd, Cmd.map SettingsFormMsg c2 ]
, Sub.none
) )
Init -> Init ->
@ -84,13 +85,14 @@ update flags msg model =
[ Api.getInsights flags GetInsightsResp [ Api.getInsights flags GetInsightsResp
, Api.getCollectiveSettings flags CollectiveSettingsResp , Api.getCollectiveSettings flags CollectiveSettingsResp
] ]
, Sub.none
) )
GetInsightsResp (Ok data) -> GetInsightsResp (Ok data) ->
( { model | insights = data }, Cmd.none ) ( { model | insights = data }, Cmd.none, Sub.none )
GetInsightsResp (Err _) -> GetInsightsResp (Err _) ->
( model, Cmd.none ) ( model, Cmd.none, Sub.none )
CollectiveSettingsResp (Ok data) -> CollectiveSettingsResp (Ok data) ->
let let
@ -99,10 +101,11 @@ update flags msg model =
in in
( { model | settingsModel = cm } ( { model | settingsModel = cm }
, Cmd.map SettingsFormMsg cc , Cmd.map SettingsFormMsg cc
, Sub.none
) )
CollectiveSettingsResp (Err _) -> CollectiveSettingsResp (Err _) ->
( model, Cmd.none ) ( model, Cmd.none, Sub.none )
SubmitResp (Ok res) -> SubmitResp (Ok res) ->
( { model ( { model
@ -114,7 +117,8 @@ update flags msg model =
SubmitFailed res.message SubmitFailed res.message
} }
, Cmd.none , Cmd.none
, Sub.none
) )
SubmitResp (Err err) -> SubmitResp (Err err) ->
( { model | formState = SubmitError err }, Cmd.none ) ( { model | formState = SubmitError err }, Cmd.none, Sub.none )