Skip to content
This repository has been archived by the owner on Apr 17, 2024. It is now read-only.

Commit

Permalink
LMO-515 | DES-111 | Implements "UI.Filter" (#267)
Browse files Browse the repository at this point in the history
- Implements `UI.Filter`
- Adds filters stories to the showcase;
- Adds filters story to Percy;
- Bumps dependencies;
- Optimizes when sorting a table descending;
- Move more rendering from Table's FilterView to Filter's View.
- Fixes filter's tabindex.
  • Loading branch information
PedroHLC committed Jul 22, 2021
1 parent b8fb22b commit c82f721
Show file tree
Hide file tree
Showing 22 changed files with 2,488 additions and 1,681 deletions.
7 changes: 7 additions & 0 deletions cypress/integration/visual-regression.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -168,4 +168,11 @@ describe('Percy Snapshots', () => {
cy.percySnapshot('Filterable dropdown')
})
})

describe('Filters', () => {
it('Creates a snapshot for all arrangement of filters', () => {
cy.visit('/#Complex%20components/Filter/United')
cy.percySnapshot('Filters')
})
})
})
3 changes: 2 additions & 1 deletion elm.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "PaackEng/paack-ui",
"summary": "Paack's Design System applied over Elm UI",
"license": "BSD-3-Clause",
"version": "6.2.0",
"version": "6.3.0",
"exposed-modules": [
"UI.Alert",
"UI.Analytics",
Expand All @@ -13,6 +13,7 @@
"UI.ContentPlaceholder",
"UI.Dropdown",
"UI.Effect",
"UI.Filter",
"UI.Icon",
"UI.Link",
"UI.ListView",
Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "paack-ui",
"version": "1.0.0",
"version": "6.3.0",
"description": "Paack's Design System applied over Elm UI",
"main": "index.js",
"assetsPath": "showcase/public/assets/",
Expand Down Expand Up @@ -34,9 +34,9 @@
},
"homepage": "https://paackeng.github.io/paack-ui/",
"dependencies": {
"@percy/cli": "^1.0.0-beta.58",
"@percy/cli": "^1.0.0-beta.60",
"@percy/cypress": "^3.1.0",
"cypress": "^7.7.0",
"cypress": "^8.0.0",
"elm": "^0.19.1-5",
"elm-format": "^0.8.5",
"elm-hot": "^1.1.6",
Expand Down
17 changes: 17 additions & 0 deletions showcase/src/Filters/Model.elm
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module Filters.Model exposing (Model, initModel)

import Msg exposing (Msg)
import UI.Filter as Filter exposing (FilterModel)


type alias Model =
{ demoFilter : FilterModel Msg String
}


initModel : Model
initModel =
{ demoFilter =
Filter.multiTextFilter [] identity
|> Filter.setItems [ "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune" ]
}
7 changes: 7 additions & 0 deletions showcase/src/Filters/Msg.elm
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module Filters.Msg exposing (Msg(..))

import UI.Filter exposing (FilterMsg)


type Msg
= FilterMsg FilterMsg
213 changes: 213 additions & 0 deletions showcase/src/Filters/Stories.elm
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
module Filters.Stories exposing (stories, update)

import Element exposing (Element, fill, maximum, minimum)
import Filters.Model as Story
import Filters.Msg as Story
import Model exposing (Model)
import Msg exposing (Msg)
import PluginOptions exposing (defaultWithMenu)
import Return exposing (Return)
import UI.Button as Button
import UI.Filter as Filter
import UI.ListView as ListView
import UI.RenderConfig exposing (RenderConfig)
import UI.Size as Size
import UI.Text as Text
import UI.TextField as TextField
import UIExplorer exposing (storiesOf)
import Utils
exposing
( ExplorerStory
, ExplorerUI
, goToDocsCallToAction
, iconsSvgSprite
, prettifyElmCode
, storyWithModel
)


update : Story.Msg -> Story.Model -> Return Msg.Msg Story.Model
update msg model =
case msg of
Story.FilterMsg subMsg ->
Tuple.mapBoth
(\newFilter -> { model | demoFilter = newFilter })
(always Cmd.none)
(Filter.update (Story.FilterMsg >> Msg.FiltersStoriesMsg) subMsg model.demoFilter)


stories : RenderConfig -> ExplorerUI
stories renderConfig =
storiesOf
"Filter"
[ medium renderConfig
, small renderConfig
, united renderConfig
]


medium : RenderConfig -> ExplorerStory
medium renderConfig =
storyWithModel
( "Medium"
, mediumView renderConfig
, { defaultWithMenu
| code = mediumExample
, note = goToDocsCallToAction "Filter"
}
)


mediumView : RenderConfig -> Model -> Element Msg
mediumView renderConfig { filtersStories } =
Element.column [ Element.width (fill |> maximum 240), Element.height (fill |> minimum 320) ]
[ iconsSvgSprite
, Filter.fromModel "Planet Name"
(Msg.FiltersStoriesMsg << Story.FilterMsg)
filtersStories.demoFilter
|> Filter.renderElement renderConfig
, ListView.simpleList identity
(always <| Element.el [ Element.padding 8 ] << Text.renderElement renderConfig << Text.body2)
|> ListView.withItems (Filter.getItems filtersStories.demoFilter)
|> ListView.renderElement renderConfig
]


mediumExample : String
mediumExample =
prettifyElmCode """
type alias Model =
{ demoFilter : FilterModel Msg String
}
init =
{ demoFilter =
Filter.multiTextFilter [] identity
|> Filter.setItems [ "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune" ]
}
view renderConfig model =
Element.column []
[ Filter.fromModel "Planet Name"
Msg.ForFilter
model.demoFilter
|> Filter.renderElement renderConfig
, ListView.simpleList identity
(always <| Text.renderElement renderConfig << Text.body2)
|> ListView.withItems (Filter.getItems model.demoFilter)
|> ListView.renderElement renderConfig
]
"""


small : RenderConfig -> ExplorerStory
small renderConfig =
storyWithModel
( "Extra Small"
, smallView renderConfig
, { defaultWithMenu
| code = smallExample
, note = goToDocsCallToAction "Filter"
}
)


smallView : RenderConfig -> Model -> Element Msg
smallView renderConfig { filtersStories } =
Element.column [ Element.width (fill |> maximum 240), Element.height (fill |> minimum 320) ]
[ iconsSvgSprite
, Filter.fromModel "Planet Name"
(Msg.FiltersStoriesMsg << Story.FilterMsg)
filtersStories.demoFilter
|> Filter.withSize Filter.sizeExtraSmall
|> Filter.renderElement renderConfig
, ListView.simpleList identity
(always <| Element.el [ Element.padding 8 ] << Text.renderElement renderConfig << Text.body2)
|> ListView.withItems (Filter.getItems filtersStories.demoFilter)
|> ListView.renderElement renderConfig
]


smallExample : String
smallExample =
prettifyElmCode """
type alias Model =
{ demoFilter : FilterModel Msg String
}
init =
{ demoFilter =
Filter.multiTextFilter [] identity
|> Filter.setItems [ "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune" ]
}
view renderConfig model =
Element.column []
[ Filter.fromModel "Planet Name"
Msg.ForFilter
model.demoFilter
|> Filter.withSize Filter.sizeExtraSmall
|> Filter.renderElement renderConfig
, ListView.simpleList identity
(always <| Text.renderElement renderConfig << Text.body2)
|> ListView.withItems (Filter.getItems model.demoFilter)
|> ListView.renderElement renderConfig
]
"""


united : RenderConfig -> ExplorerStory
united renderConfig =
storyWithModel
( "United"
, unitedView renderConfig
, { defaultWithMenu
| note = goToDocsCallToAction "Filter"
}
)


unitedView : RenderConfig -> Model -> Element Msg
unitedView renderConfig _ =
Element.wrappedRow [ Element.width fill, Element.height (fill |> minimum 320), Element.spacing 16 ]
[ iconsSvgSprite
, Element.column [ Element.width (fill |> maximum 160), Element.spacing 16 ]
[ Filter.customFilter "Closed"
{ openMsg = Msg.NoOp, closeMsg = Msg.NoOp, isOpen = False }
|> Filter.renderElement renderConfig
, Filter.customFilter "Applied"
{ openMsg = Msg.NoOp, closeMsg = Msg.NoOp, isOpen = False }
|> Filter.withAppliedHeader
(Just <| Filter.appliedHeader "💘" Msg.NoOp)
|> Filter.renderElement renderConfig
]
, Filter.customFilter "Mambo No. 5"
{ openMsg = Msg.NoOp, closeMsg = Msg.NoOp, isOpen = True }
|> Filter.withSize Filter.sizeExtraSmall
|> Filter.withSorting
(Filter.sorting
{ sortAscendingMsg = Msg.NoOp
, sortDescendingMsg = Msg.NoOp
, clearSortingMsg = Msg.NoOp
}
|> Filter.withAppliedSorting Filter.sortingAscending
|> Filter.withSortingPreview { smaller = "Monica", larger = "Jessica" }
)
|> Filter.withButtons
[ Button.disabled <| Button.fromLabel "in my life"
, Button.disabled <| Button.fromLabel "by my side"
, Button.disabled <| Button.fromLabel "is all I need"
]
|> Filter.withBody
[ ""
|> TextField.singlelineText (always Msg.NoOp) "A little bit of"
|> TextField.withPlaceholder "A little bit of"
|> TextField.withSize Size.extraSmall
|> TextField.withWidth TextField.widthFull
|> TextField.withOnEnterPressed Msg.NoOp
|> TextField.renderElement renderConfig
]
|> Filter.renderElement renderConfig
]
6 changes: 6 additions & 0 deletions showcase/src/Main.elm
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import Checkboxes.Stories as Checkboxes
import ContentPlaceholders
import Dialog
import Dropdown.Stories as Dropdowns
import Filters.Stories as Filters
import Html exposing (Html, div, img)
import Html.Attributes exposing (src, style)
import Icons
Expand Down Expand Up @@ -131,6 +132,7 @@ main =
[ Tables.stories renderConfig
, Paginators.stories renderConfig
, Sidebar.stories renderConfig
, Filters.stories renderConfig
]
|> exploreWithCategories config

Expand Down Expand Up @@ -201,6 +203,10 @@ updateStories msg ({ customModel } as model) =
Dropdowns.update renderConfig submsg customModel.dropdownStories
|> R.map (\t -> { model | customModel = { customModel | dropdownStories = t } })

FiltersStoriesMsg subMsg ->
Filters.update subMsg customModel.filtersStories
|> R.map (\t -> { model | customModel = { customModel | filtersStories = t } })

NoOp ->
( model, Cmd.none )

Expand Down
27 changes: 15 additions & 12 deletions showcase/src/Model.elm
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module Model exposing
import Buttons.Model as Buttons
import Checkboxes.Model as Checkboxes
import Dropdown.Model as Dropdown
import Filters.Model as Filters
import Layouts.Model as Layouts
import Paginators.Model as Paginators
import Radio.Model as Radio
Expand All @@ -18,30 +19,32 @@ import UIExplorer.Plugins.Tabs as TabsPlugin

type alias Model =
{ buttonsStories : Buttons.Model
, paginatorsStories : Paginators.Model
, tablesStories : Tables.Model
, checkboxesStories : Checkboxes.Model
, switchesStories : Switches.Model
, dropdownStories : Dropdown.Model
, filtersStories : Filters.Model
, layoutsStories : Layouts.Model
, paginatorsStories : Paginators.Model
, radioStories : Radio.Model
, sidebarStories : Sidebar.Model
, switchesStories : Switches.Model
, tablesStories : Tables.Model
, tabsStories : Tabs.Model
, tabs : TabsPlugin.Model
, layoutsStories : Layouts.Model
, sidebarStories : Sidebar.Model
, dropdownStories : Dropdown.Model
}


init : Model
init =
{ buttonsStories = Buttons.initModel
, paginatorsStories = Paginators.initModel
, tablesStories = Tables.initModel
, checkboxesStories = Checkboxes.initModel
, switchesStories = Switches.initModel
, dropdownStories = Dropdown.initModel
, filtersStories = Filters.initModel
, layoutsStories = Layouts.initModel
, paginatorsStories = Paginators.initModel
, radioStories = Radio.initModel
, sidebarStories = Sidebar.initModel
, switchesStories = Switches.initModel
, tablesStories = Tables.initModel
, tabsStories = Tabs.initModel
, tabs = TabsPlugin.initialModel
, layoutsStories = Layouts.initModel
, sidebarStories = Sidebar.initModel
, dropdownStories = Dropdown.initModel
}
14 changes: 8 additions & 6 deletions showcase/src/Msg.elm
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module Msg exposing (Msg(..))
import Buttons.Msg as Buttons
import Checkboxes.Msg as Checkboxes
import Dropdown.Msg as Dropdown
import Filters.Msg as Filters
import Layouts.Msg as Layouts
import Paginators.Msg as Paginators
import Radio.Msg as Radio
Expand All @@ -15,14 +16,15 @@ import UIExplorer.Plugins.Tabs as TabsPlugin

type Msg
= ButtonsStoriesMsg Buttons.Msg
| PaginatorsStoriesMsg Paginators.Msg
| TablesStoriesMsg Tables.Msg
| CheckboxesStoriesMsg Checkboxes.Msg
| SwitchesStoriesMsg Switches.Msg
| RadioStoriesMsg Radio.Msg
| DropdownStoriesMsg Dropdown.Msg
| FiltersStoriesMsg Filters.Msg
| LayoutsStoriesMsg Layouts.Msg
| PaginatorsStoriesMsg Paginators.Msg
| RadioStoriesMsg Radio.Msg
| SidebarStoriesMsg Sidebar.Msg
| SwitchesStoriesMsg Switches.Msg
| TablesStoriesMsg Tables.Msg
| TabsStoriesMsg Tabs.Msg
| TabMsg TabsPlugin.Msg
| DropdownStoriesMsg Dropdown.Msg
| NoOp
| TabMsg TabsPlugin.Msg
Loading

0 comments on commit c82f721

Please sign in to comment.