Allow to specify ordering when retrieving meta data

The query now searches in more fields. For example, when getting a
list of tags, the query is applied to the tag name *and* category.
When listing persons, the query now also looks in the associated
organization name.

This has been used to make some headers in the meta data tables
clickable to sort the list accordingly.

Refs: #965, #538
This commit is contained in:
eikek
2021-08-24 21:35:57 +02:00
parent 5926565267
commit cf88f5c2de
52 changed files with 1236 additions and 208 deletions

View File

@ -25,6 +25,7 @@ import Data.CalEvent exposing (CalEvent)
import Data.DropdownStyle as DS
import Data.Flags exposing (Flags)
import Data.ListType exposing (ListType)
import Data.TagOrder
import Data.UiSettings exposing (UiSettings)
import Html exposing (..)
import Html.Attributes exposing (..)
@ -90,7 +91,7 @@ init flags sett =
Comp.FixedDropdown.init Data.ListType.all
}
, Cmd.batch
[ Api.getTags flags "" GetTagsResp
[ Api.getTags flags "" Data.TagOrder.NameAsc GetTagsResp
, Cmd.map ScheduleMsg cec
]
)

View File

@ -21,6 +21,7 @@ import Comp.Basic as B
import Comp.CustomFieldForm
import Comp.CustomFieldTable
import Comp.MenuBar as MB
import Data.CustomFieldOrder exposing (CustomFieldOrder)
import Data.Flags exposing (Flags)
import Html exposing (..)
import Html.Attributes exposing (..)
@ -36,6 +37,7 @@ type alias Model =
, fields : List CustomField
, query : String
, loading : Bool
, order : CustomFieldOrder
}
@ -54,13 +56,14 @@ empty =
, fields = []
, query = ""
, loading = False
, order = Data.CustomFieldOrder.LabelAsc
}
init : Flags -> ( Model, Cmd Msg )
init flags =
( empty
, Api.getCustomFields flags empty.query CustomFieldListResp
, loadFields flags empty
)
@ -68,14 +71,22 @@ init flags =
--- Update
loadFields : Flags -> Model -> Cmd Msg
loadFields flags model =
Api.getCustomFields flags model.query model.order CustomFieldListResp
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
update flags msg model =
case msg of
TableMsg lm ->
let
( tm, action ) =
( tm, action, maybeOrder ) =
Comp.CustomFieldTable.update lm model.tableModel
newOrder =
Maybe.withDefault model.order maybeOrder
detail =
case action of
Comp.CustomFieldTable.EditAction item ->
@ -83,8 +94,22 @@ update flags msg model =
Comp.CustomFieldTable.NoAction ->
model.detailModel
newModel =
{ model
| tableModel = tm
, detailModel = detail
, order = newOrder
}
( m1, c1 ) =
if model.order == newOrder then
( newModel, Cmd.none )
else
( newModel, loadFields flags newModel )
in
( { model | tableModel = tm, detailModel = detail }, Cmd.none )
( m1, c1 )
DetailMsg lm ->
case model.detailModel of
@ -95,7 +120,7 @@ update flags msg model =
cmd =
if back then
Api.getCustomFields flags model.query CustomFieldListResp
loadFields flags model
else
Cmd.none
@ -118,8 +143,12 @@ update flags msg model =
( model, Cmd.none )
SetQuery str ->
( { model | query = str }
, Api.getCustomFields flags str CustomFieldListResp
let
newModel =
{ model | query = str }
in
( newModel
, loadFields flags newModel
)
CustomFieldListResp (Ok sl) ->
@ -207,6 +236,7 @@ viewTable2 texts model =
}
, Html.map TableMsg
(Comp.CustomFieldTable.view2 texts.fieldTable
model.order
model.tableModel
model.fields
)

View File

@ -29,6 +29,7 @@ import Api.Model.ItemFieldValue exposing (ItemFieldValue)
import Comp.CustomFieldInput
import Comp.FixedDropdown
import Data.CustomFieldChange exposing (CustomFieldChange(..))
import Data.CustomFieldOrder
import Data.CustomFieldType
import Data.DropdownStyle as DS
import Data.Flags exposing (Flags)
@ -116,7 +117,7 @@ init flags =
initCmd : Flags -> Cmd Msg
initCmd flags =
Api.getCustomFields flags "" CustomFieldResp
Api.getCustomFields flags "" Data.CustomFieldOrder.LabelAsc CustomFieldResp
setValues : List ItemFieldValue -> Msg

View File

@ -16,8 +16,10 @@ module Comp.CustomFieldTable exposing
import Api.Model.CustomField exposing (CustomField)
import Comp.Basic as B
import Data.CustomFieldOrder exposing (CustomFieldOrder)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick)
import Messages.Comp.CustomFieldTable exposing (Texts)
import Styles as S
@ -28,6 +30,7 @@ type alias Model =
type Msg
= EditItem CustomField
| ToggleOrder CustomFieldOrder
type Action
@ -35,31 +38,88 @@ type Action
| EditAction CustomField
type Header
= Label
| Format
init : Model
init =
{}
update : Msg -> Model -> ( Model, Action )
update : Msg -> Model -> ( Model, Action, Maybe CustomFieldOrder )
update msg model =
case msg of
EditItem item ->
( model, EditAction item )
( model, EditAction item, Nothing )
ToggleOrder order ->
( model, NoAction, Just order )
newOrder : Header -> CustomFieldOrder -> CustomFieldOrder
newOrder header current =
case ( header, current ) of
( Label, Data.CustomFieldOrder.LabelAsc ) ->
Data.CustomFieldOrder.LabelDesc
( Label, _ ) ->
Data.CustomFieldOrder.LabelAsc
( Format, Data.CustomFieldOrder.FormatAsc ) ->
Data.CustomFieldOrder.FormatDesc
( Format, _ ) ->
Data.CustomFieldOrder.FormatAsc
--- View2
view2 : Texts -> Model -> List CustomField -> Html Msg
view2 texts _ items =
view2 : Texts -> CustomFieldOrder -> Model -> List CustomField -> Html Msg
view2 texts order _ items =
let
labelSortIcon =
case order of
Data.CustomFieldOrder.LabelAsc ->
"fa fa-sort-alpha-up"
Data.CustomFieldOrder.LabelDesc ->
"fa fa-sort-alpha-down-alt"
_ ->
"invisible fa fa-sort-alpha-up"
formatSortIcon =
case order of
Data.CustomFieldOrder.FormatAsc ->
"fa fa-sort-alpha-up"
Data.CustomFieldOrder.FormatDesc ->
"fa fa-sort-alpha-down-alt"
_ ->
"invisible fa fa-sort-alpha-up"
in
div []
[ table [ class S.tableMain ]
[ thead []
[ tr []
[ th [] []
, th [ class "text-left" ] [ text texts.nameLabel ]
, th [ class "text-left" ] [ text texts.format ]
, th [ class "text-left" ]
[ a [ href "#", onClick (ToggleOrder <| newOrder Label order) ]
[ i [ class labelSortIcon, class "mr-1" ] []
, text texts.nameLabel
]
]
, th [ class "text-left" ]
[ a [ href "#", onClick (ToggleOrder <| newOrder Format order) ]
[ i [ class formatSortIcon, class "mr-1" ] []
, text texts.format
]
]
, th [ class "text-center hidden sm:table-cell" ] [ text texts.usageCount ]
, th [ class "text-center hidden sm:table-cell" ] [ text texts.basics.created ]
]

View File

@ -22,6 +22,7 @@ import Comp.EquipmentForm
import Comp.EquipmentTable
import Comp.MenuBar as MB
import Comp.YesNoDimmer
import Data.EquipmentOrder exposing (EquipmentOrder)
import Data.Flags exposing (Flags)
import Html exposing (..)
import Html.Attributes exposing (..)
@ -40,6 +41,7 @@ type alias Model =
, loading : Bool
, deleteConfirm : Comp.YesNoDimmer.Model
, query : String
, order : EquipmentOrder
}
@ -64,6 +66,7 @@ emptyModel =
, loading = False
, deleteConfirm = Comp.YesNoDimmer.emptyModel
, query = ""
, order = Data.EquipmentOrder.NameAsc
}
@ -86,9 +89,12 @@ update flags msg model =
case msg of
TableMsg m ->
let
( tm, tc ) =
( tm, tc, maybeOrder ) =
Comp.EquipmentTable.update flags m model.tableModel
newOrder =
Maybe.withDefault model.order maybeOrder
( m2, c2 ) =
( { model
| tableModel = tm
@ -99,6 +105,7 @@ update flags msg model =
else
model.formError
, order = newOrder
}
, Cmd.map TableMsg tc
)
@ -110,8 +117,15 @@ update flags msg model =
Nothing ->
( m2, Cmd.none )
( m4, c4 ) =
if model.order == newOrder then
( m3, Cmd.none )
else
update flags LoadEquipments m3
in
( m3, Cmd.batch [ c2, c3 ] )
( m4, Cmd.batch [ c2, c3, c4 ] )
FormMsg m ->
let
@ -121,7 +135,7 @@ update flags msg model =
( { model | formModel = m2 }, Cmd.map FormMsg c2 )
LoadEquipments ->
( { model | loading = True }, Api.getEquipments flags "" EquipmentResp )
( { model | loading = True }, Api.getEquipments flags model.query model.order EquipmentResp )
EquipmentResp (Ok equipments) ->
let
@ -211,7 +225,7 @@ update flags msg model =
m =
{ model | query = str }
in
( m, Api.getEquipments flags str EquipmentResp )
( m, Api.getEquipments flags str model.order EquipmentResp )
@ -251,6 +265,7 @@ viewTable2 texts model =
}
, Html.map TableMsg
(Comp.EquipmentTable.view2 texts.equipmentTable
model.order
model.tableModel
)
, div

View File

@ -15,10 +15,12 @@ module Comp.EquipmentTable exposing
import Api.Model.Equipment exposing (Equipment)
import Comp.Basic as B
import Data.EquipmentOrder exposing (EquipmentOrder)
import Data.EquipmentUse
import Data.Flags exposing (Flags)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick)
import Messages.Comp.EquipmentTable exposing (Texts)
import Styles as S
@ -40,27 +42,50 @@ type Msg
= SetEquipments (List Equipment)
| Select Equipment
| Deselect
| ToggleOrder EquipmentOrder
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Maybe EquipmentOrder )
update _ msg model =
case msg of
SetEquipments list ->
( { model | equips = list, selected = Nothing }, Cmd.none )
( { model | equips = list, selected = Nothing }, Cmd.none, Nothing )
Select equip ->
( { model | selected = Just equip }, Cmd.none )
( { model | selected = Just equip }, Cmd.none, Nothing )
Deselect ->
( { model | selected = Nothing }, Cmd.none )
( { model | selected = Nothing }, Cmd.none, Nothing )
ToggleOrder order ->
( model, Cmd.none, Just order )
newOrder : EquipmentOrder -> EquipmentOrder
newOrder current =
case current of
Data.EquipmentOrder.NameAsc ->
Data.EquipmentOrder.NameDesc
Data.EquipmentOrder.NameDesc ->
Data.EquipmentOrder.NameAsc
--- View2
view2 : Texts -> Model -> Html Msg
view2 texts model =
view2 : Texts -> EquipmentOrder -> Model -> Html Msg
view2 texts order model =
let
nameSortIcon =
case order of
Data.EquipmentOrder.NameAsc ->
"fa fa-sort-alpha-up"
Data.EquipmentOrder.NameDesc ->
"fa fa-sort-alpha-down-alt"
in
table [ class S.tableMain ]
[ thead []
[ tr []
@ -68,7 +93,12 @@ view2 texts model =
, th [ class "text-left pr-1 md:px-2 w-20" ]
[ text texts.use
]
, th [ class "text-left" ] [ text texts.basics.name ]
, th [ class "text-left" ]
[ a [ href "#", onClick (ToggleOrder <| newOrder order) ]
[ i [ class nameSortIcon, class "mr-1" ] []
, text texts.basics.name
]
]
]
]
, tbody []

View File

@ -24,6 +24,7 @@ import Comp.FolderDetail
import Comp.FolderTable
import Comp.MenuBar as MB
import Data.Flags exposing (Flags)
import Data.FolderOrder exposing (FolderOrder)
import Html exposing (..)
import Html.Attributes exposing (..)
import Http
@ -39,6 +40,7 @@ type alias Model =
, query : String
, owningOnly : Bool
, loading : Bool
, order : FolderOrder
}
@ -62,6 +64,7 @@ empty =
, query = ""
, owningOnly = True
, loading = False
, order = Data.FolderOrder.NameAsc
}
@ -70,7 +73,7 @@ init flags =
( empty
, Cmd.batch
[ Api.getUsers flags UserListResp
, Api.getFolders flags empty.query empty.owningOnly FolderListResp
, loadFolders flags empty
]
)
@ -79,23 +82,41 @@ init flags =
--- Update
loadFolders : Flags -> Model -> Cmd Msg
loadFolders flags model =
Api.getFolders flags model.query model.order model.owningOnly FolderListResp
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
update flags msg model =
case msg of
TableMsg lm ->
let
( tm, action ) =
( tm, action, maybeOrder ) =
Comp.FolderTable.update lm model.tableModel
cmd =
newOrder =
Maybe.withDefault model.order maybeOrder
newModel =
{ model | tableModel = tm, order = newOrder }
detailCmd =
case action of
Comp.FolderTable.EditAction item ->
Api.getFolderDetail flags item.id FolderDetailResp
Comp.FolderTable.NoAction ->
Cmd.none
refreshCmd =
if model.order == newOrder then
Cmd.none
else
loadFolders flags newModel
in
( { model | tableModel = tm }, cmd )
( newModel, Cmd.batch [ detailCmd, refreshCmd ] )
DetailMsg lm ->
case model.detailModel of
@ -106,7 +127,7 @@ update flags msg model =
cmd =
if back then
Api.getFolders flags model.query model.owningOnly FolderListResp
loadFolders flags model
else
Cmd.none
@ -129,17 +150,24 @@ update flags msg model =
( model, Cmd.none )
SetQuery str ->
( { model | query = str }
, Api.getFolders flags str model.owningOnly FolderListResp
let
nm =
{ model | query = str }
in
( nm
, loadFolders flags nm
)
ToggleOwningOnly ->
let
newOwning =
not model.owningOnly
nm =
{ model | owningOnly = newOwning }
in
( { model | owningOnly = newOwning }
, Api.getFolders flags model.query newOwning FolderListResp
( nm
, loadFolders flags nm
)
UserListResp (Ok ul) ->
@ -241,6 +269,7 @@ viewTable2 texts model =
, Html.map TableMsg
(Comp.FolderTable.view2
texts.folderTable
model.order
model.tableModel
model.folders
)

View File

@ -16,8 +16,10 @@ module Comp.FolderTable exposing
import Api.Model.FolderItem exposing (FolderItem)
import Comp.Basic as B
import Data.FolderOrder exposing (FolderOrder)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick)
import Messages.Comp.FolderTable exposing (Texts)
import Styles as S
@ -28,6 +30,7 @@ type alias Model =
type Msg
= EditItem FolderItem
| ToggleOrder FolderOrder
type Action
@ -35,32 +38,87 @@ type Action
| EditAction FolderItem
type Header
= Name
| Owner
init : Model
init =
{}
update : Msg -> Model -> ( Model, Action )
update : Msg -> Model -> ( Model, Action, Maybe FolderOrder )
update msg model =
case msg of
EditItem item ->
( model, EditAction item )
( model, EditAction item, Nothing )
ToggleOrder order ->
( model, NoAction, Just order )
newOrder : Header -> FolderOrder -> FolderOrder
newOrder header current =
case ( header, current ) of
( Name, Data.FolderOrder.NameAsc ) ->
Data.FolderOrder.NameDesc
( Name, _ ) ->
Data.FolderOrder.NameAsc
( Owner, Data.FolderOrder.OwnerAsc ) ->
Data.FolderOrder.OwnerDesc
( Owner, _ ) ->
Data.FolderOrder.OwnerAsc
--- View2
view2 : Texts -> Model -> List FolderItem -> Html Msg
view2 texts _ items =
view2 : Texts -> FolderOrder -> Model -> List FolderItem -> Html Msg
view2 texts order _ items =
let
nameSortIcon =
case order of
Data.FolderOrder.NameAsc ->
"fa fa-sort-alpha-up"
Data.FolderOrder.NameDesc ->
"fa fa-sort-alpha-down-alt"
_ ->
"invisible fa fa-sort-alpha-up"
ownerSortIcon =
case order of
Data.FolderOrder.OwnerAsc ->
"fa fa-sort-alpha-up"
Data.FolderOrder.OwnerDesc ->
"fa fa-sort-alpha-down-alt"
_ ->
"invisible fa fa-sort-alpha-up"
in
table [ class S.tableMain ]
[ thead []
[ tr []
[ th [ class "w-px whitespace-nowrap pr-1 md:pr-3" ] []
, th [ class "text-left" ]
[ text texts.basics.name
[ a [ href "#", onClick (ToggleOrder <| newOrder Name order) ]
[ i [ class nameSortIcon, class "mr-1" ] []
, text texts.basics.name
]
]
, th [ class "text-left hidden sm:table-cell" ]
[ a [ href "#", onClick (ToggleOrder <| newOrder Owner order) ]
[ i [ class ownerSortIcon, class "mr-1" ] []
, text texts.owner
]
]
, th [ class "text-left hidden sm:table-cell" ] [ text "Owner" ]
, th [ class "text-center" ]
[ span [ class "hidden sm:inline" ]
[ text texts.memberCount

View File

@ -35,10 +35,14 @@ import Comp.Tabs as TB
import Data.CustomFieldChange exposing (CustomFieldChange(..))
import Data.Direction exposing (Direction)
import Data.DropdownStyle
import Data.EquipmentOrder
import Data.Fields
import Data.Flags exposing (Flags)
import Data.FolderOrder
import Data.Icons as Icons
import Data.PersonOrder
import Data.PersonUse
import Data.TagOrder
import Data.UiSettings exposing (UiSettings)
import DatePicker exposing (DatePicker)
import Html exposing (..)
@ -157,11 +161,11 @@ loadModel flags =
Comp.DatePicker.init
in
Cmd.batch
[ Api.getTags flags "" GetTagsResp
[ Api.getTags flags "" Data.TagOrder.NameAsc GetTagsResp
, Api.getOrgLight flags GetOrgResp
, Api.getPersons flags "" GetPersonResp
, Api.getEquipments flags "" GetEquipResp
, Api.getFolders flags "" False GetFolderResp
, Api.getPersons flags "" Data.PersonOrder.NameAsc GetPersonResp
, Api.getEquipments flags "" Data.EquipmentOrder.NameAsc GetEquipResp
, Api.getFolders flags "" Data.FolderOrder.NameAsc False GetFolderResp
, Cmd.map CustomFieldMsg (Comp.CustomFieldMultiInput.initCmd flags)
, Cmd.map ItemDatePickerMsg dpc
, Cmd.map DueDatePickerMsg dpc

View File

@ -59,10 +59,14 @@ import Comp.PersonForm
import Comp.SentMails
import Data.CustomFieldChange exposing (CustomFieldChange(..))
import Data.Direction
import Data.EquipmentOrder
import Data.Fields exposing (Field)
import Data.Flags exposing (Flags)
import Data.FolderOrder
import Data.ItemNav exposing (ItemNav)
import Data.PersonOrder
import Data.PersonUse
import Data.TagOrder
import Data.UiSettings exposing (UiSettings)
import DatePicker
import Dict
@ -265,7 +269,7 @@ update key flags inav settings msg model =
, getOptions flags
, proposalCmd
, Api.getSentMails flags item.id SentMailsResp
, Api.getPersons flags "" GetPersonResp
, Api.getPersons flags "" Data.PersonOrder.NameAsc GetPersonResp
, Cmd.map CustomFieldMsg (Comp.CustomFieldMultiInput.initCmd flags)
]
, sub =
@ -1642,11 +1646,11 @@ update key flags inav settings msg model =
getOptions : Flags -> Cmd Msg
getOptions flags =
Cmd.batch
[ Api.getTags flags "" GetTagsResp
[ Api.getTags flags "" Data.TagOrder.NameAsc GetTagsResp
, Api.getOrgLight flags GetOrgResp
, Api.getPersons flags "" GetPersonResp
, Api.getEquipments flags "" GetEquipResp
, Api.getFolders flags "" False GetFolderResp
, Api.getPersons flags "" Data.PersonOrder.NameAsc GetPersonResp
, Api.getEquipments flags "" Data.EquipmentOrder.NameAsc GetEquipResp
, Api.getFolders flags "" Data.FolderOrder.NameAsc False GetFolderResp
]

View File

@ -30,6 +30,7 @@ import Comp.YesNoDimmer
import Data.CalEvent exposing (CalEvent)
import Data.DropdownStyle as DS
import Data.Flags exposing (Flags)
import Data.TagOrder
import Data.UiSettings exposing (UiSettings)
import Data.Validated exposing (Validated(..))
import Html exposing (..)
@ -182,7 +183,7 @@ init flags =
}
, Cmd.batch
[ Api.getMailSettings flags "" ConnResp
, Api.getTags flags "" GetTagsResp
, Api.getTags flags "" Data.TagOrder.NameAsc GetTagsResp
, Cmd.map CalEventMsg scmd
]
)

View File

@ -23,6 +23,7 @@ import Comp.OrgForm
import Comp.OrgTable
import Comp.YesNoDimmer
import Data.Flags exposing (Flags)
import Data.OrganizationOrder exposing (OrganizationOrder)
import Data.UiSettings exposing (UiSettings)
import Html exposing (..)
import Html.Attributes exposing (..)
@ -41,6 +42,7 @@ type alias Model =
, loading : Bool
, deleteConfirm : Comp.YesNoDimmer.Model
, query : String
, order : OrganizationOrder
}
@ -65,6 +67,7 @@ emptyModel =
, loading = False
, deleteConfirm = Comp.YesNoDimmer.emptyModel
, query = ""
, order = Data.OrganizationOrder.NameAsc
}
@ -87,7 +90,7 @@ update flags msg model =
case msg of
TableMsg m ->
let
( tm, tc ) =
( tm, tc, maybeOrder ) =
Comp.OrgTable.update flags m model.tableModel
( m2, c2 ) =
@ -100,6 +103,7 @@ update flags msg model =
else
model.formError
, order = Maybe.withDefault model.order maybeOrder
}
, Cmd.map TableMsg tc
)
@ -111,8 +115,15 @@ update flags msg model =
Nothing ->
( m2, Cmd.none )
( m4, c4 ) =
if maybeOrder /= Nothing && maybeOrder /= Just model.order then
update flags LoadOrgs m3
else
( m3, Cmd.none )
in
( m3, Cmd.batch [ c2, c3 ] )
( m4, Cmd.batch [ c2, c3, c4 ] )
FormMsg m ->
let
@ -122,7 +133,13 @@ update flags msg model =
( { model | formModel = m2 }, Cmd.map FormMsg c2 )
LoadOrgs ->
( { model | loading = True }, Api.getOrganizations flags model.query OrgResp )
( { model | loading = True }
, Api.getOrganizations
flags
model.query
model.order
OrgResp
)
OrgResp (Ok orgs) ->
let
@ -212,7 +229,7 @@ update flags msg model =
m =
{ model | query = str }
in
( m, Api.getOrganizations flags str OrgResp )
( m, Api.getOrganizations flags str model.order OrgResp )
@ -250,7 +267,7 @@ viewTable2 texts model =
]
, rootClasses = "mb-4"
}
, Html.map TableMsg (Comp.OrgTable.view2 texts.orgTable model.tableModel)
, Html.map TableMsg (Comp.OrgTable.view2 texts.orgTable model.order model.tableModel)
, B.loadingDimmer
{ active = model.loading
, label = texts.basics.loading

View File

@ -17,8 +17,10 @@ import Api.Model.Organization exposing (Organization)
import Comp.Basic as B
import Data.Flags exposing (Flags)
import Data.OrgUse
import Data.OrganizationOrder exposing (OrganizationOrder)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick)
import Messages.Comp.OrgTable exposing (Texts)
import Styles as S
import Util.Address
@ -42,27 +44,50 @@ type Msg
= SetOrgs (List Organization)
| Select Organization
| Deselect
| ToggleOrder OrganizationOrder
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Maybe OrganizationOrder )
update _ msg model =
case msg of
SetOrgs list ->
( { model | orgs = list, selected = Nothing }, Cmd.none )
( { model | orgs = list, selected = Nothing }, Cmd.none, Nothing )
Select equip ->
( { model | selected = Just equip }, Cmd.none )
( { model | selected = Just equip }, Cmd.none, Nothing )
Deselect ->
( { model | selected = Nothing }, Cmd.none )
( { model | selected = Nothing }, Cmd.none, Nothing )
ToggleOrder order ->
( model, Cmd.none, Just order )
newOrder : OrganizationOrder -> OrganizationOrder
newOrder current =
case current of
Data.OrganizationOrder.NameAsc ->
Data.OrganizationOrder.NameDesc
Data.OrganizationOrder.NameDesc ->
Data.OrganizationOrder.NameAsc
--- View2
view2 : Texts -> Model -> Html Msg
view2 texts model =
view2 : Texts -> OrganizationOrder -> Model -> Html Msg
view2 texts order model =
let
nameSortIcon =
case order of
Data.OrganizationOrder.NameAsc ->
"fa fa-sort-alpha-up"
Data.OrganizationOrder.NameDesc ->
"fa fa-sort-alpha-down-alt"
in
table [ class S.tableMain ]
[ thead []
[ tr []
@ -71,7 +96,10 @@ view2 texts model =
[ text texts.use
]
, th [ class "text-left" ]
[ text texts.basics.name
[ a [ href "#", onClick (ToggleOrder <| newOrder order) ]
[ i [ class nameSortIcon, class "mr-1" ] []
, text texts.basics.name
]
]
, th [ class "text-left hidden md:table-cell" ]
[ text texts.address

View File

@ -24,6 +24,7 @@ import Comp.PersonForm
import Comp.PersonTable
import Comp.YesNoDimmer
import Data.Flags exposing (Flags)
import Data.PersonOrder exposing (PersonOrder)
import Data.UiSettings exposing (UiSettings)
import Html exposing (..)
import Html.Attributes exposing (..)
@ -42,6 +43,7 @@ type alias Model =
, loading : Int
, deleteConfirm : Comp.YesNoDimmer.Model
, query : String
, order : PersonOrder
}
@ -66,6 +68,7 @@ emptyModel =
, loading = 0
, deleteConfirm = Comp.YesNoDimmer.emptyModel
, query = ""
, order = Data.PersonOrder.NameAsc
}
@ -89,9 +92,12 @@ update flags msg model =
case msg of
TableMsg m ->
let
( tm, tc ) =
( tm, tc, maybeOrder ) =
Comp.PersonTable.update flags m model.tableModel
newOrder =
Maybe.withDefault model.order maybeOrder
( m2, c2 ) =
( { model
| tableModel = tm
@ -102,6 +108,7 @@ update flags msg model =
else
model.formError
, order = newOrder
}
, Cmd.map TableMsg tc
)
@ -113,8 +120,15 @@ update flags msg model =
Nothing ->
( m2, Cmd.none )
( m4, c4 ) =
if model.order == newOrder then
( m3, Cmd.none )
else
update flags LoadPersons m3
in
( m3, Cmd.batch [ c2, c3 ] )
( m4, Cmd.batch [ c2, c3, c4 ] )
FormMsg m ->
let
@ -126,7 +140,7 @@ update flags msg model =
LoadPersons ->
( { model | loading = model.loading + 2 }
, Cmd.batch
[ Api.getPersons flags model.query PersonResp
[ Api.getPersons flags model.query model.order PersonResp
, Api.getOrgLight flags GetOrgResp
]
)
@ -244,7 +258,7 @@ update flags msg model =
m =
{ model | query = str }
in
( m, Api.getPersons flags str PersonResp )
( m, Api.getPersons flags str model.order PersonResp )
isLoading : Model -> Bool
@ -287,7 +301,7 @@ viewTable2 texts model =
]
, rootClasses = "mb-4"
}
, Html.map TableMsg (Comp.PersonTable.view2 texts.personTable model.tableModel)
, Html.map TableMsg (Comp.PersonTable.view2 texts.personTable model.order model.tableModel)
, B.loadingDimmer
{ active = isLoading model
, label = texts.basics.loading

View File

@ -16,9 +16,11 @@ module Comp.PersonTable exposing
import Api.Model.Person exposing (Person)
import Comp.Basic as B
import Data.Flags exposing (Flags)
import Data.PersonOrder exposing (PersonOrder)
import Data.PersonUse
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick)
import Messages.Comp.PersonTable exposing (Texts)
import Styles as S
import Util.Contact
@ -41,27 +43,75 @@ type Msg
= SetPersons (List Person)
| Select Person
| Deselect
| ToggleOrder PersonOrder
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Maybe PersonOrder )
update _ msg model =
case msg of
SetPersons list ->
( { model | equips = list, selected = Nothing }, Cmd.none )
( { model | equips = list, selected = Nothing }, Cmd.none, Nothing )
Select equip ->
( { model | selected = Just equip }, Cmd.none )
( { model | selected = Just equip }, Cmd.none, Nothing )
Deselect ->
( { model | selected = Nothing }, Cmd.none )
( { model | selected = Nothing }, Cmd.none, Nothing )
ToggleOrder order ->
( model, Cmd.none, Just order )
type Header
= Name
| Org
newOrder : Header -> PersonOrder -> PersonOrder
newOrder header current =
case ( header, current ) of
( Name, Data.PersonOrder.NameAsc ) ->
Data.PersonOrder.NameDesc
( Name, _ ) ->
Data.PersonOrder.NameAsc
( Org, Data.PersonOrder.OrgAsc ) ->
Data.PersonOrder.OrgDesc
( Org, _ ) ->
Data.PersonOrder.OrgAsc
--- View2
view2 : Texts -> Model -> Html Msg
view2 texts model =
view2 : Texts -> PersonOrder -> Model -> Html Msg
view2 texts order model =
let
nameSortIcon =
case order of
Data.PersonOrder.NameAsc ->
"fa fa-sort-alpha-up"
Data.PersonOrder.NameDesc ->
"fa fa-sort-alpha-down-alt"
_ ->
"invisible fa fa-sort-alpha-down-alt"
orgSortIcon =
case order of
Data.PersonOrder.OrgAsc ->
"fa fa-sort-alpha-up"
Data.PersonOrder.OrgDesc ->
"fa fa-sort-alpha-down-alt"
_ ->
"invisible fa fa-sort-alpha-down-alt"
in
table [ class S.tableMain ]
[ thead []
[ tr []
@ -69,8 +119,18 @@ view2 texts model =
, th [ class "text-left pr-1 md:px-2" ]
[ text texts.use
]
, th [ class "text-left" ] [ text texts.basics.name ]
, th [ class "text-left hidden sm:table-cell" ] [ text texts.basics.organization ]
, th [ class "text-left" ]
[ a [ href "#", onClick (ToggleOrder <| newOrder Name order) ]
[ i [ class nameSortIcon, class "mr-1" ] []
, text texts.basics.name
]
]
, th [ class "text-left hidden sm:table-cell" ]
[ a [ href "#", onClick (ToggleOrder <| newOrder Org order) ]
[ i [ class orgSortIcon, class "mr-1" ] []
, text texts.basics.organization
]
]
, th [ class "text-left hidden md:table-cell" ] [ text texts.contact ]
]
]

View File

@ -37,7 +37,9 @@ import Data.CalEvent exposing (CalEvent)
import Data.Direction exposing (Direction(..))
import Data.DropdownStyle as DS
import Data.Flags exposing (Flags)
import Data.FolderOrder
import Data.Language exposing (Language)
import Data.TagOrder
import Data.UiSettings exposing (UiSettings)
import Data.Validated exposing (Validated(..))
import Html exposing (..)
@ -221,8 +223,8 @@ initWith flags s =
[ Api.getImapSettings flags "" ConnResp
, nc
, Cmd.map CalEventMsg sc
, Api.getFolders flags "" False GetFolderResp
, Api.getTags flags "" GetTagResp
, Api.getFolders flags "" Data.FolderOrder.NameAsc False GetFolderResp
, Api.getTags flags "" Data.TagOrder.NameAsc GetTagResp
]
)
@ -268,8 +270,8 @@ init flags =
}
, Cmd.batch
[ Api.getImapSettings flags "" ConnResp
, Api.getFolders flags "" False GetFolderResp
, Api.getTags flags "" GetTagResp
, Api.getFolders flags "" Data.FolderOrder.NameAsc False GetFolderResp
, Api.getTags flags "" Data.TagOrder.NameAsc GetTagResp
, Cmd.map CalEventMsg scmd
]
)

View File

@ -40,10 +40,12 @@ import Comp.TagSelect
import Data.CustomFieldChange exposing (CustomFieldValueCollect)
import Data.Direction exposing (Direction)
import Data.DropdownStyle as DS
import Data.EquipmentOrder
import Data.EquipmentUse
import Data.Fields
import Data.Flags exposing (Flags)
import Data.ItemQuery as Q exposing (ItemQuery)
import Data.PersonOrder
import Data.PersonUse
import Data.SearchMode exposing (SearchMode)
import Data.UiSettings exposing (UiSettings)
@ -441,8 +443,8 @@ updateDrop ddm flags settings msg model =
Cmd.batch
[ Api.itemSearchStats flags Api.Model.ItemQuery.empty GetAllTagsResp
, Api.getOrgLight flags GetOrgResp
, Api.getEquipments flags "" GetEquipResp
, Api.getPersons flags "" GetPersonResp
, Api.getEquipments flags "" Data.EquipmentOrder.NameAsc GetEquipResp
, Api.getPersons flags "" Data.PersonOrder.NameAsc GetPersonResp
, Cmd.map CustomFieldMsg (Comp.CustomFieldMultiInput.initCmd flags)
, cdp
]
@ -1088,7 +1090,7 @@ findTab tab =
Nothing
tabLook :UiSettings -> Model -> SearchTab -> Comp.Tabs.Look
tabLook : UiSettings -> Model -> SearchTab -> Comp.Tabs.Look
tabLook settings model tab =
let
isHidden f =
@ -1097,6 +1099,7 @@ tabLook settings model tab =
hiddenOr fields default =
if List.all isHidden fields then
Comp.Tabs.Hidden
else
default
@ -1126,41 +1129,41 @@ tabLook settings model tab =
activeWhen model.inboxCheckbox
TabTags ->
hiddenOr [Data.Fields.Tag]
hiddenOr [ Data.Fields.Tag ]
(activeWhenNotEmpty model.tagSelection.includeTags model.tagSelection.excludeTags)
TabTagCategories ->
hiddenOr [Data.Fields.Tag]
hiddenOr [ Data.Fields.Tag ]
(activeWhenNotEmpty model.tagSelection.includeCats model.tagSelection.excludeCats)
TabFolder ->
hiddenOr [Data.Fields.Folder]
hiddenOr [ Data.Fields.Folder ]
(activeWhenJust model.selectedFolder)
TabCorrespondent ->
hiddenOr [Data.Fields.CorrOrg, Data.Fields.CorrPerson] <|
hiddenOr [ Data.Fields.CorrOrg, Data.Fields.CorrPerson ] <|
activeWhenNotEmpty (Comp.Dropdown.getSelected model.orgModel)
(Comp.Dropdown.getSelected model.corrPersonModel)
TabConcerning ->
hiddenOr [Data.Fields.ConcPerson, Data.Fields.ConcEquip ] <|
hiddenOr [ Data.Fields.ConcPerson, Data.Fields.ConcEquip ] <|
activeWhenNotEmpty (Comp.Dropdown.getSelected model.concPersonModel)
(Comp.Dropdown.getSelected model.concEquipmentModel)
TabDate ->
hiddenOr [Data.Fields.Date] <|
activeWhenJust (Util.Maybe.or [model.fromDate, model.untilDate])
hiddenOr [ Data.Fields.Date ] <|
activeWhenJust (Util.Maybe.or [ model.fromDate, model.untilDate ])
TabDueDate ->
hiddenOr [Data.Fields.DueDate] <|
activeWhenJust (Util.Maybe.or [model.fromDueDate, model.untilDueDate])
hiddenOr [ Data.Fields.DueDate ] <|
activeWhenJust (Util.Maybe.or [ model.fromDueDate, model.untilDueDate ])
TabSource ->
hiddenOr [Data.Fields.SourceName] <|
hiddenOr [ Data.Fields.SourceName ] <|
activeWhenJust model.sourceModel
TabDirection ->
hiddenOr [Data.Fields.Direction] <|
hiddenOr [ Data.Fields.Direction ] <|
activeWhenNotEmpty (Comp.Dropdown.getSelected model.directionModel) []
TabTrashed ->
@ -1179,7 +1182,6 @@ searchTabState settings model tab =
searchTab =
findTab tab
folded =
if Set.member tab.name model.openTabs then
Comp.Tabs.Open
@ -1189,10 +1191,10 @@ searchTabState settings model tab =
state =
{ folded = folded
, look = Maybe.map (tabLook settings model) searchTab
|> Maybe.withDefault Comp.Tabs.Normal
, look =
Maybe.map (tabLook settings model) searchTab
|> Maybe.withDefault Comp.Tabs.Normal
}
in
( state, ToggleAkkordionTab tab.name )

View File

@ -27,8 +27,10 @@ import Comp.Dropdown exposing (isDropdownChangeMsg)
import Comp.FixedDropdown
import Data.DropdownStyle as DS
import Data.Flags exposing (Flags)
import Data.FolderOrder
import Data.Language exposing (Language)
import Data.Priority exposing (Priority)
import Data.TagOrder
import Data.UiSettings exposing (UiSettings)
import Html exposing (..)
import Html.Attributes exposing (..)
@ -89,8 +91,8 @@ init : Flags -> ( Model, Cmd Msg )
init flags =
( emptyModel
, Cmd.batch
[ Api.getFolders flags "" False GetFolderResp
, Api.getTags flags "" GetTagResp
[ Api.getFolders flags "" Data.FolderOrder.NameAsc False GetFolderResp
, Api.getTags flags "" Data.TagOrder.NameAsc GetTagResp
]
)

View File

@ -23,6 +23,7 @@ import Comp.TagForm
import Comp.TagTable
import Comp.YesNoDimmer
import Data.Flags exposing (Flags)
import Data.TagOrder exposing (TagOrder)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onSubmit)
@ -42,6 +43,7 @@ type alias Model =
, loading : Bool
, deleteConfirm : Comp.YesNoDimmer.Model
, query : String
, order : TagOrder
}
@ -66,6 +68,7 @@ emptyModel =
, loading = False
, deleteConfirm = Comp.YesNoDimmer.emptyModel
, query = ""
, order = Data.TagOrder.NameAsc
}
@ -88,12 +91,16 @@ update flags msg model =
case msg of
TableMsg m ->
let
( tm, tc ) =
( tm, tc, maybeOrder ) =
Comp.TagTable.update flags m model.tagTableModel
newOrder =
Maybe.withDefault model.order maybeOrder
( m2, c2 ) =
( { model
| tagTableModel = tm
, order = newOrder
, viewMode = Maybe.map (\_ -> Form) tm.selected |> Maybe.withDefault Table
, formError =
if Util.Maybe.nonEmpty tm.selected then
@ -112,8 +119,15 @@ update flags msg model =
Nothing ->
( m2, Cmd.none )
( m4, c4 ) =
if model.order == newOrder then
( m3, Cmd.none )
else
update flags LoadTags m3
in
( m3, Cmd.batch [ c2, c3 ] )
( m4, Cmd.batch [ c2, c3, c4 ] )
FormMsg m ->
let
@ -123,7 +137,9 @@ update flags msg model =
( { model | tagFormModel = m2 }, Cmd.map FormMsg c2 )
LoadTags ->
( { model | loading = True }, Api.getTags flags model.query (TagResp model.query) )
( { model | loading = True }
, Api.getTags flags model.query model.order (TagResp model.query)
)
TagResp query (Ok tags) ->
let
@ -224,7 +240,7 @@ update flags msg model =
m =
{ model | query = str }
in
( m, Api.getTags flags str (TagResp str) )
( m, Api.getTags flags str model.order (TagResp str) )
@ -262,7 +278,7 @@ viewTable2 texts model =
]
, rootClasses = "mb-4"
}
, Html.map TableMsg (Comp.TagTable.view2 texts.tagTable model.tagTableModel)
, Html.map TableMsg (Comp.TagTable.view2 texts.tagTable model.order model.tagTableModel)
, div
[ classList
[ ( "ui dimmer", True )

View File

@ -16,8 +16,10 @@ module Comp.TagTable exposing
import Api.Model.Tag exposing (Tag)
import Comp.Basic as B
import Data.Flags exposing (Flags)
import Data.TagOrder exposing (TagOrder)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick)
import Messages.Comp.TagTable exposing (Texts)
import Styles as S
@ -35,37 +37,108 @@ emptyModel =
}
type Header
= Name
| Category
type Msg
= SetTags (List Tag)
| Select Tag
| Deselect
| SortClick TagOrder
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Maybe TagOrder )
update _ msg model =
case msg of
SetTags list ->
( { model | tags = list, selected = Nothing }, Cmd.none )
( { model | tags = list, selected = Nothing }, Cmd.none, Nothing )
Select tag ->
( { model | selected = Just tag }, Cmd.none )
( { model | selected = Just tag }, Cmd.none, Nothing )
Deselect ->
( { model | selected = Nothing }, Cmd.none )
( { model | selected = Nothing }, Cmd.none, Nothing )
SortClick order ->
( model, Cmd.none, Just order )
newOrder : Header -> TagOrder -> TagOrder
newOrder header current =
case ( header, current ) of
( Name, Data.TagOrder.NameAsc ) ->
Data.TagOrder.NameDesc
( Name, Data.TagOrder.NameDesc ) ->
Data.TagOrder.NameAsc
( Name, Data.TagOrder.CategoryAsc ) ->
Data.TagOrder.NameAsc
( Name, Data.TagOrder.CategoryDesc ) ->
Data.TagOrder.NameAsc
( Category, Data.TagOrder.NameAsc ) ->
Data.TagOrder.CategoryAsc
( Category, Data.TagOrder.NameDesc ) ->
Data.TagOrder.CategoryAsc
( Category, Data.TagOrder.CategoryAsc ) ->
Data.TagOrder.CategoryDesc
( Category, Data.TagOrder.CategoryDesc ) ->
Data.TagOrder.CategoryAsc
--- View2
view2 : Texts -> Model -> Html Msg
view2 texts model =
view2 : Texts -> TagOrder -> Model -> Html Msg
view2 texts order model =
let
nameSortIcon =
case order of
Data.TagOrder.NameAsc ->
"fa fa-sort-alpha-up"
Data.TagOrder.NameDesc ->
"fa fa-sort-alpha-down-alt"
_ ->
"invisible fa fa-sort-alpha-down"
catSortIcon =
case order of
Data.TagOrder.CategoryAsc ->
"fa fa-sort-alpha-up"
Data.TagOrder.CategoryDesc ->
"fa fa-sort-alpha-down-alt"
_ ->
"invisible fa fa-sort-alpha-down"
in
table [ class S.tableMain ]
[ thead []
[ tr []
[ th [ class "" ] []
, th [ class "text-left" ] [ text texts.basics.name ]
, th [ class "text-left" ] [ text texts.category ]
, th [ class "text-left" ]
[ a [ href "#", onClick (SortClick <| newOrder Name order) ]
[ i [ class nameSortIcon, class "mr-1" ] []
, text texts.basics.name
]
]
, th [ class "text-left" ]
[ a [ href "#", onClick (SortClick <| newOrder Category order) ]
[ i [ class catSortIcon, class "mr-1" ]
[]
, text texts.category
]
]
]
]
, tbody []

View File

@ -28,6 +28,7 @@ import Data.DropdownStyle as DS
import Data.Fields exposing (Field)
import Data.Flags exposing (Flags)
import Data.ItemTemplate as IT exposing (ItemTemplate)
import Data.TagOrder
import Data.UiSettings exposing (ItemPattern, Pos(..), UiSettings)
import Dict exposing (Dict)
import Html exposing (..)
@ -160,7 +161,7 @@ init flags settings =
Comp.FixedDropdown.init Messages.UiLanguage.all
, openTabs = Set.empty
}
, Api.getTags flags "" GetTagsResp
, Api.getTags flags "" Data.TagOrder.NameAsc GetTagsResp
)