mirror of
https://github.com/byteverse/colonnade.git
synced 2026-04-23 16:37:44 +02:00
add expandable to reflex-dom-colonnade
This commit is contained in:
parent
76cb112361
commit
bfb8e59c09
16
.gitignore
vendored
16
.gitignore
vendored
@ -5,8 +5,6 @@ cabal.config
|
|||||||
cabal.sandbox.config
|
cabal.sandbox.config
|
||||||
*.chi
|
*.chi
|
||||||
*.chs.h
|
*.chs.h
|
||||||
config/client_session_key.aes
|
|
||||||
playground/
|
|
||||||
dist*
|
dist*
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*.dyn_hi
|
*.dyn_hi
|
||||||
@ -19,23 +17,13 @@ dist*
|
|||||||
*.o
|
*.o
|
||||||
*.prof
|
*.prof
|
||||||
*.sqlite3
|
*.sqlite3
|
||||||
untracked/
|
|
||||||
uploads/
|
|
||||||
static/combined/
|
|
||||||
static/tmp/
|
|
||||||
*.swp
|
*.swp
|
||||||
.virtualenv
|
.virtualenv
|
||||||
.stack-work/
|
.stack-work/
|
||||||
yesod-devel/
|
|
||||||
tmp/
|
tmp/
|
||||||
config/client_session_key.aes
|
|
||||||
playground/auth.txt
|
|
||||||
**/*.dump-hi
|
**/*.dump-hi
|
||||||
tags
|
tags
|
||||||
TAGS
|
TAGS
|
||||||
|
colonnade/ex1.hs
|
||||||
|
|
||||||
docs/db/unthreat
|
reflex-dom-colonnade/result
|
||||||
ex1.hs
|
|
||||||
|
|
||||||
geolite-csv/data/large
|
|
||||||
geolite-lmdb/data/large
|
|
||||||
|
|||||||
47
nix/default.nix
Normal file
47
nix/default.nix
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
{ package, test ? true, frontend ? false }:
|
||||||
|
let bootstrap = import <nixpkgs> {};
|
||||||
|
fetch-github-json = owner: repo: path:
|
||||||
|
let commit = builtins.fromJSON (builtins.readFile path);
|
||||||
|
in bootstrap.fetchFromGitHub {
|
||||||
|
inherit owner repo;
|
||||||
|
inherit (commit) rev sha256;
|
||||||
|
};
|
||||||
|
reflex-platform = import (fetch-github-json "reflex-frp" "reflex-platform" ./reflex-platform.json) {};
|
||||||
|
compiler = if frontend then "ghcjs" else "ghc";
|
||||||
|
overrides = (builtins.getAttr compiler reflex-platform).override {
|
||||||
|
overrides = self: super:
|
||||||
|
with reflex-platform;
|
||||||
|
let options = pkg: lib.overrideCabal pkg (drv: { doCheck = test; });
|
||||||
|
filterPredicate = p: type:
|
||||||
|
let path = baseNameOf p; in
|
||||||
|
!builtins.any (x: x)
|
||||||
|
[(type == "directory" && path == "dist")
|
||||||
|
(type == "symlink" && path == "result")
|
||||||
|
(type == "directory" && path == ".git")];
|
||||||
|
in {
|
||||||
|
mkDerivation = args: super.mkDerivation (args //
|
||||||
|
(if nixpkgs.stdenv.isDarwin && !frontend then {
|
||||||
|
postCompileBuildDriver = ''
|
||||||
|
echo "Patching dynamic library dependencies"
|
||||||
|
# 1. Link all dylibs from 'dynamic-library-dirs's in package confs to $out/lib/links
|
||||||
|
mkdir -p $out/lib/links
|
||||||
|
for d in $(grep dynamic-library-dirs $packageConfDir/*|awk '{print $2}'); do
|
||||||
|
ln -s $d/*.dylib $out/lib/links
|
||||||
|
done
|
||||||
|
|
||||||
|
# 2. Patch 'dynamic-library-dirs' in package confs to point to the symlink dir
|
||||||
|
for f in $packageConfDir/*.conf; do
|
||||||
|
sed -i "s,dynamic-library-dirs: .*,dynamic-library-dirs: $out/lib/links," $f
|
||||||
|
done
|
||||||
|
|
||||||
|
# 3. Recache package database
|
||||||
|
ghc-pkg --package-db="$packageConfDir" recache
|
||||||
|
'';
|
||||||
|
} else {}));
|
||||||
|
} // import ./overrides.nix { inherit options filterPredicate lib cabal2nixResult self super; };
|
||||||
|
};
|
||||||
|
drv = builtins.getAttr package overrides;
|
||||||
|
in if reflex-platform.nixpkgs.lib.inNixShell then
|
||||||
|
reflex-platform.workOn overrides drv
|
||||||
|
else
|
||||||
|
drv
|
||||||
7
nix/overrides.nix
Normal file
7
nix/overrides.nix
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{ options ? (x: x), filterPredicate ? (x: true), lib, cabal2nixResult, self, super }:
|
||||||
|
let build = path: options (self.callPackage (cabal2nixResult (builtins.filterSource filterPredicate path)) {});
|
||||||
|
in {
|
||||||
|
# Core Libraries
|
||||||
|
colonnade = lib.dontCheck (build ../colonnade);
|
||||||
|
reflex-dom-colonnade = build ../reflex-dom-colonnade;
|
||||||
|
}
|
||||||
7
nix/reflex-platform.json
Normal file
7
nix/reflex-platform.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"url": "https://github.com/reflex-frp/reflex-platform",
|
||||||
|
"rev": "a16213b82f05808ad96b81939850a32ecedd18eb",
|
||||||
|
"date": "2017-05-05T11:40:26-04:00",
|
||||||
|
"sha256": "0dfm8pcpk2zpkfrc9gxh79pkk4ac8ljfm5nqv0sksd64qlhhpj4f",
|
||||||
|
"fetchSubmodules": true
|
||||||
|
}
|
||||||
5
reflex-dom-colonnade/default.nix
Normal file
5
reflex-dom-colonnade/default.nix
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{ test ? "true" }:
|
||||||
|
let parseBool = str: with builtins;
|
||||||
|
let json = fromJSON str; in if isBool json then json else throw "nix parseBool: ${str} is not a bool.";
|
||||||
|
in
|
||||||
|
import ../nix/default.nix { package = "reflex-dom-colonnade"; frontend = false; test = parseBool test; }
|
||||||
@ -26,7 +26,6 @@ library
|
|||||||
, reflex-dom == 0.4.*
|
, reflex-dom == 0.4.*
|
||||||
, containers >= 0.5 && < 0.6
|
, containers >= 0.5 && < 0.6
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
ghc-options: -Wall
|
|
||||||
|
|
||||||
source-repository head
|
source-repository head
|
||||||
type: git
|
type: git
|
||||||
|
|||||||
@ -5,6 +5,8 @@
|
|||||||
{-# LANGUAGE TypeFamilies #-}
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
{-# LANGUAGE UndecidableInstances #-}
|
{-# LANGUAGE UndecidableInstances #-}
|
||||||
|
|
||||||
|
{-# OPTIONS_GHC -Wall -Werror #-}
|
||||||
|
|
||||||
module Reflex.Dom.Colonnade
|
module Reflex.Dom.Colonnade
|
||||||
(
|
(
|
||||||
-- * Types
|
-- * Types
|
||||||
@ -16,6 +18,7 @@ module Reflex.Dom.Colonnade
|
|||||||
, cappedTraversing
|
, cappedTraversing
|
||||||
, dynamic
|
, dynamic
|
||||||
, dynamicCapped
|
, dynamicCapped
|
||||||
|
, expandable
|
||||||
-- * Cell Functions
|
-- * Cell Functions
|
||||||
, cell
|
, cell
|
||||||
, charCell
|
, charCell
|
||||||
@ -30,7 +33,8 @@ import qualified Data.Text as T
|
|||||||
import qualified Data.Text.Lazy as LT
|
import qualified Data.Text.Lazy as LT
|
||||||
import qualified Data.Text.Lazy.Builder as LT
|
import qualified Data.Text.Lazy.Builder as LT
|
||||||
import qualified Data.Map.Strict as M
|
import qualified Data.Map.Strict as M
|
||||||
import Data.Foldable (Foldable(..),for_)
|
import qualified Data.Vector as V
|
||||||
|
import Data.Foldable (Foldable(..),for_,forM_)
|
||||||
import Data.Traversable (for)
|
import Data.Traversable (for)
|
||||||
import Data.Semigroup (Semigroup(..))
|
import Data.Semigroup (Semigroup(..))
|
||||||
import Control.Applicative (liftA2)
|
import Control.Applicative (liftA2)
|
||||||
@ -89,7 +93,7 @@ basic ::
|
|||||||
-> Colonnade Headed a (Cell t m ()) -- ^ Data encoding strategy
|
-> Colonnade Headed a (Cell t m ()) -- ^ Data encoding strategy
|
||||||
-> f a -- ^ Collection of data
|
-> f a -- ^ Collection of data
|
||||||
-> m ()
|
-> m ()
|
||||||
basic tableAttrs = static tableAttrs Nothing mempty (const mempty)
|
basic tableAttrs = static tableAttrs (Just (M.empty,M.empty)) mempty (const mempty)
|
||||||
|
|
||||||
body :: (DomBuilder t m, PostBuild t m, Foldable f, Monoid e)
|
body :: (DomBuilder t m, PostBuild t m, Foldable f, Monoid e)
|
||||||
=> M.Map T.Text T.Text
|
=> M.Map T.Text T.Text
|
||||||
@ -237,3 +241,31 @@ dynamicCapped tableAttrs headAttrs bodyAttrs trAttrs fascia cornice collection =
|
|||||||
-- TODO: Figure out what this ignored argument represents and dont ignore it
|
-- TODO: Figure out what this ignored argument represents and dont ignore it
|
||||||
_ <- encodeCorniceHeadDynamic headAttrs fascia (E.annotate cornice)
|
_ <- encodeCorniceHeadDynamic headAttrs fascia (E.annotate cornice)
|
||||||
dynamicBody bodyAttrs trAttrs (E.discard cornice) collection
|
dynamicBody bodyAttrs trAttrs (E.discard cornice) collection
|
||||||
|
|
||||||
|
-- | Table with cells that can create expanded content
|
||||||
|
-- between the rows.
|
||||||
|
expandable :: (MonadWidget t m, Foldable f)
|
||||||
|
=> Dynamic t (M.Map T.Text T.Text) -- ^ @\<table\>@ tag attributes
|
||||||
|
-> Dynamic t (M.Map T.Text T.Text) -- ^ Attributes of expanded @\<td\>@
|
||||||
|
-> f a -- ^ Values
|
||||||
|
-> Colonnade Headed a (Cell t m (Event t (Maybe (m ()))))
|
||||||
|
-- ^ Encoding into cells with events that can fire to create additional content under the row
|
||||||
|
-> m ()
|
||||||
|
expandable tableAttrs tdExpandedAttrs as encoding@(E.Colonnade v) = do
|
||||||
|
let vlen = V.length v
|
||||||
|
elDynAttr "table" tableAttrs $ do
|
||||||
|
-- Discarding this result is technically the wrong thing
|
||||||
|
-- to do, but I cannot imagine why anyone would want to
|
||||||
|
-- drop down content under the heading.
|
||||||
|
_ <- el "thead" $ el "tr" $ E.headerMonadicGeneral_ encoding (elFromCell "th")
|
||||||
|
el "tbody" $ forM_ as $ \a -> do
|
||||||
|
e' <- el "tr" $ do
|
||||||
|
elist <- E.rowMonadicWith [] (++) encoding (fmap (\k -> [k]) . elFromCell "td") a
|
||||||
|
let e = leftmost elist
|
||||||
|
e' = flip fmap e $ \mwidg -> case mwidg of
|
||||||
|
Nothing -> return ()
|
||||||
|
Just widg -> el "tr" $ do
|
||||||
|
elDynAttr "td" (M.insert "colspan" (T.pack (show vlen)) <$> tdExpandedAttrs) widg
|
||||||
|
return e'
|
||||||
|
widgetHold (return ()) e'
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user