impl add/remove related tags
This commit is contained in:
parent
91b9d03cc9
commit
828a388b90
|
@ -3,15 +3,17 @@ module Component.TagCloud where
|
||||||
import Prelude hiding (div)
|
import Prelude hiding (div)
|
||||||
|
|
||||||
import App (getTagCloud, updateTagCloudMode)
|
import App (getTagCloud, updateTagCloudMode)
|
||||||
import Data.Array (sortBy)
|
import Data.Array (concat, cons, delete, notElem, null, sortBy)
|
||||||
import Data.Foldable (maximum, minimum)
|
import Data.Foldable (maximum, minimum)
|
||||||
import Data.Int (toNumber)
|
import Data.Int (toNumber)
|
||||||
import Data.Lens (Lens', lens)
|
import Data.Lens (Lens', lens)
|
||||||
import Data.Maybe (Maybe(..), fromMaybe)
|
import Data.Maybe (Maybe(..), fromMaybe)
|
||||||
import Data.Monoid (guard)
|
import Data.Monoid (guard)
|
||||||
import Data.String (toLower) as S
|
import Data.String (joinWith, toLower, null) as S
|
||||||
|
import Data.String (toLower)
|
||||||
import Data.Tuple (fst, uncurry)
|
import Data.Tuple (fst, uncurry)
|
||||||
import Effect.Aff (Aff)
|
import Effect.Aff (Aff)
|
||||||
|
import Foreign.Object (Object)
|
||||||
import Foreign.Object (toUnfoldable, empty, values) as F
|
import Foreign.Object (toUnfoldable, empty, values) as F
|
||||||
import Globals (app')
|
import Globals (app')
|
||||||
import Halogen (AttrName(..))
|
import Halogen (AttrName(..))
|
||||||
|
@ -99,12 +101,15 @@ tagcloudcomponent m' =
|
||||||
<> [button [ type_ ButtonButton, class_ "pa1 ml2 f7 link silver hover-blue "
|
<> [button [ type_ ButtonButton, class_ "pa1 ml2 f7 link silver hover-blue "
|
||||||
, onClick \_ -> Just (TExpanded (not (isExpanded mode)))]
|
, onClick \_ -> Just (TExpanded (not (isExpanded mode)))]
|
||||||
[ text (if isExpanded mode then "hide" else "show") ]]
|
[ text (if isExpanded mode then "hide" else "show") ]]
|
||||||
, whenH (isExpanded mode) $ \_ -> do
|
, whenH (isExpanded mode) \_ -> do
|
||||||
let n = fromMaybe 1 (minimum (F.values tagcloud))
|
let n = fromMaybe 1 (minimum (F.values tagcloud))
|
||||||
m = fromMaybe 1 (maximum (F.values tagcloud))
|
m = fromMaybe 1 (maximum (F.values tagcloud))
|
||||||
div [class_ "tag_cloud_body"] $ case mode of
|
div [class_ "tag_cloud_body"] $ case mode of
|
||||||
TagCloudModeNone -> []
|
TagCloudModeNone -> []
|
||||||
_ -> toArray n m tagcloud
|
(TagCloudModeRelated _ curtags) ->
|
||||||
|
toArray curtags n m tagcloud
|
||||||
|
_ ->
|
||||||
|
toArray [] n m tagcloud
|
||||||
|
|
||||||
]
|
]
|
||||||
where
|
where
|
||||||
|
@ -116,23 +121,28 @@ tagcloudcomponent m' =
|
||||||
modelb20 = TagCloudModeLowerBound (isExpanded mode) 20
|
modelb20 = TagCloudModeLowerBound (isExpanded mode) 20
|
||||||
|
|
||||||
|
|
||||||
toArray :: Int -> Int -> _
|
toArray :: Array String -> Int -> Int -> Object Int -> Array (HTML _ _)
|
||||||
toArray n m =
|
toArray curtags n m =
|
||||||
map (uncurry (toSizedTag n m))
|
concat
|
||||||
|
<<< map (uncurry (toSizedTag (map toLower curtags) n m))
|
||||||
<<< sortBy (comparing (S.toLower <<< fst))
|
<<< sortBy (comparing (S.toLower <<< fst))
|
||||||
<<< F.toUnfoldable
|
<<< F.toUnfoldable
|
||||||
|
|
||||||
linkToFilterTag tag = fromNullableStr app.userR <> "/t:" <> tag
|
linkToFilterTag tag = fromNullableStr app.userR <> (if S.null tag then "" else "/t:" <> tag)
|
||||||
toSizedTag :: Int -> Int -> String -> Int -> _
|
|
||||||
toSizedTag n m k v =
|
toSizedTag :: Array String -> Int -> Int -> String -> Int -> _
|
||||||
a [ href (linkToFilterTag k)
|
toSizedTag curtags n m k v =
|
||||||
, class_ "link tag mr1"
|
[ a [ href (linkToFilterTag k) , class_ "link tag mr1" , style]
|
||||||
, attr (AttrName "style") ("font-size:" <> show fontsize <> "%" <>
|
[ text k ]
|
||||||
";opacity:" <> show opacity)
|
, whenH (not (null curtags)) \_ -> if (notElem k_lower curtags)
|
||||||
] [text k]
|
then a [href (linkToFilterTag (S.joinWith "+" (cons k_lower curtags))), class_ "link mr2 tag-include"] [text "⊕"]
|
||||||
|
else a [href (linkToFilterTag (S.joinWith "+" (delete k_lower curtags))), class_ "link mr2 tag-exclude"] [text "⊖"]
|
||||||
|
]
|
||||||
where
|
where
|
||||||
|
k_lower = toLower k
|
||||||
fontsize = rescale identity (toNumber v) (toNumber n) (toNumber m) 100.0 150.0
|
fontsize = rescale identity (toNumber v) (toNumber n) (toNumber m) 100.0 150.0
|
||||||
opacity = rescale (log <<< (1.0 + _)) (toNumber v) (toNumber n) (toNumber m) 0.6 1.0
|
opacity = rescale (log <<< (1.0 + _)) (toNumber v) (toNumber n) (toNumber m) 0.6 1.0
|
||||||
|
style = attr (AttrName "style") ("font-size:" <> show fontsize <> "%" <> ";opacity:" <> show opacity)
|
||||||
|
|
||||||
rescale :: (Number -> Number) -> Number -> Number -> Number -> Number -> Number -> Number
|
rescale :: (Number -> Number) -> Number -> Number -> Number -> Number -> Number -> Number
|
||||||
rescale f v n m l h = (if m - n < 0.01 then 1.0 else (f (v - n) / f (m - n))) * (h - l) + l
|
rescale f v n m l h = (if m - n < 0.01 then 1.0 else (f (v - n) / f (m - n))) * (h - l) + l
|
||||||
|
|
|
@ -103,6 +103,16 @@ label {
|
||||||
line-height:190%;
|
line-height:190%;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
.tag-include {
|
||||||
|
color:rgb(221, 221, 221);
|
||||||
|
line-height:190%;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.tag-exclude {
|
||||||
|
color:rgb(255, 170, 170);
|
||||||
|
line-height:190%;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
.private { background:#ddd;border:1px solid #d1d1d1; }
|
.private { background:#ddd;border:1px solid #d1d1d1; }
|
||||||
.unread { color:#b41 }
|
.unread { color:#b41 }
|
||||||
|
|
2
static/js/app.min.js
vendored
2
static/js/app.min.js
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Loading…
Reference in a new issue