From 8995248bff4f2f5ffea1b57e3cf9e718de456c38 Mon Sep 17 00:00:00 2001 From: Sarah Vaupel Date: Wed, 15 Apr 2020 14:48:47 +0200 Subject: [PATCH] refactor(workflows): switch to Int64 instead of *Id also fix rebase conflicts --- models/workflows.model | 10 +- src/Model/Types/Workflow.hs | 186 +++++++++++++++++++++++++----------- src/Utils.hs | 12 --- 3 files changed, 133 insertions(+), 75 deletions(-) diff --git a/models/workflows.model b/models/workflows.model index 868cc3953..e6f8b1ca0 100644 --- a/models/workflows.model +++ b/models/workflows.model @@ -1,15 +1,15 @@ WorkflowDefinition - graph (WorkflowGraph Int64 Int64) + graph WorkflowGraph scope WorkflowInstanceScope' WorkflowInstance definition WorkflowDefinition - graph (WorkflowGraph Int64 Int64) -- FileId, UserId - scope (WorkflowInstanceScope Int64 Int64 Int64) -- TermId, SchoolId, CourseId + graph WorkflowGraph + scope WorkflowInstanceScope WorkflowWorkflow instance WorkflowInstance - graph (WorkflowGraph Int64 Int64) -- FileId, UserId + graph WorkflowGraph initiator UserId Maybe - payload (WorkflowPayload Int64 Int64) -- FileId, UserId + payload WorkflowPayload currentNode WorkflowGraphNodeLabel Maybe diff --git a/src/Model/Types/Workflow.hs b/src/Model/Types/Workflow.hs index 9f359bfee..01cfa1fb1 100644 --- a/src/Model/Types/Workflow.hs +++ b/src/Model/Types/Workflow.hs @@ -3,7 +3,7 @@ module Model.Types.Workflow , WorkflowGraphNodeLabel , WorkflowInstanceScope(..) , WorkflowInstanceScope'(..) - , WorkflowPayload + , WorkflowPayload(..) , WorkflowPayload'(..) ) where @@ -30,8 +30,8 @@ import Data.Aeson.Types (Parser) ----- WORKFLOW GRAPH ----- -data WorkflowGraph fileid userid = WorkflowGraph - { wgNodes :: Map WorkflowGraphNodeLabel (WorkflowGraphNode fileid userid) +data WorkflowGraph = WorkflowGraph + { wgNodes :: Map WorkflowGraphNodeLabel WorkflowGraphNode } deriving (Show, Eq) @@ -40,54 +40,54 @@ data WorkflowGraph fileid userid = WorkflowGraph type WorkflowGraphNodeLabel = CI Text -data WorkflowGraphNode fileid userid = WGN +data WorkflowGraphNode = WGN { wgnDisplayLabel :: Maybe Text , wgnFinished :: Bool - , wgnEdges :: Set (WorkflowGraphEdge fileid userid) + , wgnEdges :: Set WorkflowGraphEdge } deriving (Eq, Ord, Show, Generic, Typeable) ----- WORKFLOW GRAPH: EDGES ----- -data WorkflowGraphEdge fileid userid = WGE +data WorkflowGraphEdge = WGE { wgeTarget :: WorkflowGraphNodeLabel - , wgeActors :: Set (WorkflowRole userid) - , wgeForm :: Map WorkflowPayloadLabel (NonNull (Set (WorkflowPayloadSpec fileid userid))) + , wgeActors :: Set WorkflowRole + , wgeForm :: Map WorkflowPayloadLabel (NonNull (Set WorkflowPayloadSpec)) } deriving Show -instance (Eq fileid, Eq userid) => Eq (WorkflowGraphEdge fileid userid) where +instance Eq WorkflowGraphEdge where e1@WGE{} == e2@WGE{} = wgeTarget e1 == wgeTarget e2 && wgeActors e1 == wgeActors e2 && wgeForm e1 == wgeForm e2 -instance (Ord fileid, Ord userid) => Ord (WorkflowGraphEdge fileid userid) where +instance Ord WorkflowGraphEdge where compare = mconcat [comparing wgeTarget, comparing wgeActors, comparing wgeForm] ----- WORKFLOW GRAPH: ROLES / ACTORS ----- -data WorkflowRole userid = WorkflowRoleUser userid - | WorkflowRoleAuthorized AuthDNF - | WorkflowRoleInitiator +data WorkflowRole = WorkflowRoleUser Int64 -- UserId + | WorkflowRoleAuthorized AuthDNF + | WorkflowRoleInitiator deriving (Eq, Ord, Show, Read, Generic, Typeable) ----- WORKFLOW GRAPH: PAYLOAD SPECIFICATION ----- -data WorkflowPayloadSpec fileid userid = forall payload. WorkflowPayloadSpec (WorkflowPayloadField fileid userid payload) +data WorkflowPayloadSpec = forall payload. WorkflowPayloadSpec (WorkflowPayloadField payload) -instance (Show fileid, Show userid) => Show (WorkflowPayloadSpec fileid userid) where +instance Show WorkflowPayloadSpec where show (WorkflowPayloadSpec payloadField) = show payloadField type WorkflowPayloadFieldLabel = Text -data WorkflowPayloadField fileid userid (payload :: *) where +data WorkflowPayloadField (payload :: Type) where WorkflowPayloadFieldText :: { wpftLabel :: WorkflowPayloadFieldLabel , wpftPlaceholder :: Text , wpftTooltip :: Maybe Text , wpftDefault :: Maybe Text , wpftOptional :: Maybe Bool - } -> WorkflowPayloadField fileid userid Text + } -> WorkflowPayloadField Text WorkflowPayloadFieldNumber :: { wpfnLabel :: WorkflowPayloadFieldLabel , wpfnPlaceholder :: Text , wpfnTooltip :: Maybe Text @@ -96,23 +96,23 @@ data WorkflowPayloadField fileid userid (payload :: *) where , wpfnMax :: Maybe Scientific , wpfnStep :: Scientific , wpfnOptional :: Maybe Bool - } -> WorkflowPayloadField fileid userid Scientific + } -> WorkflowPayloadField Scientific WorkflowPayloadFieldBool :: { wpfbLabel :: WorkflowPayloadFieldLabel , wpfbTooltip :: Maybe Text , wpfbDefault :: Maybe Bool - } -> WorkflowPayloadField fileid userid Bool + } -> WorkflowPayloadField Bool WorkflowPayloadFieldFile :: { wpffLabel :: WorkflowPayloadFieldLabel , wpffTooltip :: Maybe Text - , wpffDefault :: Maybe fileid + , wpffDefault :: Maybe Int64 -- FileId , wpffOptional :: Maybe Bool - } -> WorkflowPayloadField fileid userid FileInfo + } -> WorkflowPayloadField FileInfo WorkflowPayloadFieldUser :: { wpfuLabel :: WorkflowPayloadFieldLabel , wpfuTooltip :: Maybe Text - , wpfuDefault :: Maybe userid + , wpfuDefault :: Maybe Int64 -- UserId , wpfuOptional :: Maybe Bool - } -> WorkflowPayloadField fileid userid userid + } -> WorkflowPayloadField Int64 -instance (Show fileid, Show userid) => Show (WorkflowPayloadField fileid userid payload) where +instance Show (WorkflowPayloadField payload) where show (WorkflowPayloadFieldText{..} ) = "TextField{label = " <> show wpftLabel <> ", placeholder = " <> show wpftPlaceholder <> ", tooltip = " <> show wpftTooltip @@ -143,7 +143,7 @@ instance (Show fileid, Show userid) => Show (WorkflowPayloadField fileid userid <> ", optional = " <> show wpfuOptional <> "}" -instance (Eq fileid, Eq userid) => Eq (WorkflowPayloadSpec fileid userid) where +instance Eq WorkflowPayloadSpec where (WorkflowPayloadSpec f1@WorkflowPayloadFieldText{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldText{}) = wpftLabel f1 == wpftLabel f2 && wpftPlaceholder f1 == wpftPlaceholder f2 && wpftTooltip f1 == wpftTooltip f2 && wpftDefault f1 == wpftDefault f2 && wpftOptional f1 == wpftOptional f2 (WorkflowPayloadSpec f1@WorkflowPayloadFieldNumber{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldNumber{}) = wpfnLabel f1 == wpfnLabel f2 && wpfnPlaceholder f1 == wpfnPlaceholder f2 && wpfnTooltip f1 == wpfnTooltip f2 && wpfnDefault f1 == wpfnDefault f2 && wpfnOptional f1 == wpfnOptional f2 (WorkflowPayloadSpec f1@WorkflowPayloadFieldBool{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldBool{}) = wpfbLabel f1 == wpfbLabel f2 && wpfbTooltip f1 == wpfbTooltip f2 && wpfbDefault f1 == wpfbDefault f2 @@ -151,7 +151,7 @@ instance (Eq fileid, Eq userid) => Eq (WorkflowPayloadSpec fileid userid) where (WorkflowPayloadSpec f1@WorkflowPayloadFieldUser{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldUser{}) = wpfuLabel f1 == wpfuLabel f2 && wpfuTooltip f1 == wpfuTooltip f2 && wpfuDefault f1 == wpfuDefault f2 && wpfuOptional f1 == wpfuOptional f2 _ == _ = False -instance (Ord fileid, Ord userid) => Ord (WorkflowPayloadSpec fileid userid) where +instance Ord WorkflowPayloadSpec where compare (WorkflowPayloadSpec f1@WorkflowPayloadFieldText{}) (WorkflowPayloadSpec f2@WorkflowPayloadFieldText{}) = mconcat [comparing wpftLabel, comparing wpftPlaceholder, comparing wpftTooltip, comparing wpftDefault, comparing wpftOptional] f1 f2 compare (WorkflowPayloadSpec f1@WorkflowPayloadFieldNumber{}) (WorkflowPayloadSpec f2@WorkflowPayloadFieldNumber{}) = mconcat [comparing wpfnLabel, comparing wpfnPlaceholder, comparing wpfnTooltip, comparing wpfnDefault, comparing wpfnMin, comparing wpfnMax, comparing wpfnStep, comparing wpfnOptional] f1 f2 compare (WorkflowPayloadSpec f1@WorkflowPayloadFieldBool{}) (WorkflowPayloadSpec f2@WorkflowPayloadFieldBool{}) = mconcat [comparing wpfbLabel, comparing wpfbTooltip, comparing wpfbDefault] f1 f2 @@ -172,10 +172,10 @@ instance (Ord fileid, Ord userid) => Ord (WorkflowPayloadSpec fileid userid) whe ----- WORKFLOW INSTANCE ----- -data WorkflowInstanceScope term school course = WISGlobal - | WISTerm term - | WISSchool school - | WISCourse course +data WorkflowInstanceScope = WISGlobal + | WISTerm Int64 -- TermId + | WISSchool Int64 -- SchoolId + | WISCourse Int64 -- CourseId deriving (Eq, Ord, Show, Read, Data, Generic, Typeable) data WorkflowInstanceScope' = WISGlobal' | WISTerm' | WISSchool' | WISCourse' @@ -186,37 +186,37 @@ data WorkflowInstanceScope' = WISGlobal' | WISTerm' | WISSchool' | WISCourse' type WorkflowPayloadLabel = CI Text -type WorkflowPayload fileid userid = Map WorkflowPayloadLabel (Seq (WorkflowPayload' fileid userid)) +data WorkflowPayload = WorkflowPayload (Map WorkflowPayloadLabel (Seq WorkflowPayload')) -data WorkflowPayload' fileid userid = WorkflowPayload' - { wpPayload :: Map WorkflowPayloadFieldLabel (WorkflowFieldPayloadW fileid userid) - , wpActor :: Maybe userid +data WorkflowPayload' = WorkflowPayload' + { wpPayload :: Map WorkflowPayloadFieldLabel WorkflowFieldPayload + , wpActor :: Maybe Int64 -- UserId , wpActionTime :: UTCTime } -data WorkflowFieldPayloadW fileid userid = forall payload. WorkflowFieldPayloadW (WorkflowFieldPayload fileid userid payload) +data WorkflowFieldPayload = forall payload. WorkflowFieldPayload (WorkflowFieldPayload' payload) -data WorkflowFieldPayload fileid userid (payload :: *) where - WFPText :: Text -> WorkflowFieldPayload fileid userid Text - WFPNumber :: Scientific -> WorkflowFieldPayload fileid userid Scientific - WFPBool :: Bool -> WorkflowFieldPayload fileid userid Bool - WFPFile :: fileid -> WorkflowFieldPayload fileid userid fileid - WFPUser :: userid -> WorkflowFieldPayload fileid userid userid +data WorkflowFieldPayload' (payload :: Type) where + WFPText :: Text -> WorkflowFieldPayload' Text + WFPNumber :: Scientific -> WorkflowFieldPayload' Scientific + WFPBool :: Bool -> WorkflowFieldPayload' Bool + WFPFile :: Int64 -> WorkflowFieldPayload' Int64 -- FileId + WFPUser :: Int64 -> WorkflowFieldPayload' Int64 -- UserId -instance (Show fileid, Show userid) => Show (WorkflowFieldPayload fileid userid payload) where +instance Show (WorkflowFieldPayload' payload) where show (WFPText wfptText ) = "WFPText{text = " <> show wfptText <> "}" show (WFPNumber wfpnNumber) = "WFPNumber{number = " <> show wfpnNumber <> "}" show (WFPBool wfpbBool ) = "WFPBool{bool = " <> show wfpbBool <> "}" show (WFPFile wfpfFile ) = "WFPFile{file = " <> show wfpfFile <> "}" show (WFPUser wfpuUser ) = "WFPUser{user = " <> show wfpuUser <> "}" -data WorkflowFieldPayload' = WFPText' | WFPNumber' | WFPBool' | WFPFile' | WFPUser' +data WorkflowFieldPayload'' = WFPText' | WFPNumber' | WFPBool' | WFPFile' | WFPUser' deriving (Eq, Ord, Enum, Show, Read, Data, Generic, Typeable) ----- ToJSON / FromJSON instances ----- -instance (ToJSON userid) => ToJSON (WorkflowRole userid) where +instance ToJSON WorkflowRole where toJSON (WorkflowRoleUser uid) = JSON.object [ "tag" JSON..= ("user" :: Text) , "user" JSON..= uid @@ -228,7 +228,7 @@ instance (ToJSON userid) => ToJSON (WorkflowRole userid) where toJSON WorkflowRoleInitiator = JSON.object [ "tag" JSON..= ("initiator" :: Text) ] -instance (FromJSON userid) => FromJSON (WorkflowRole userid) where +instance FromJSON WorkflowRole where parseJSON = JSON.withObject "WorkflowRole" $ \o -> do fieldTag <- (o JSON..: "tag" :: Parser Text) case fieldTag of @@ -241,29 +241,33 @@ instance (FromJSON userid) => FromJSON (WorkflowRole userid) where "initiator" -> return WorkflowRoleInitiator _ -> terror $ "WorkflowRole parseJSON error: expected role (user|authorized|initiator), but got " <> fieldTag -instance (ToJSON fileid, ToJSON userid, Ord userid) => ToJSON (WorkflowGraph fileid userid) where +instance ToJSON WorkflowGraph where toJSON WorkflowGraph{..} = JSON.object [ "nodes" JSON..= wgNodes ] -instance (FromJSON fileid, FromJSON userid, Ord fileid, Ord userid) => FromJSON (WorkflowGraph fileid userid) where +instance FromJSON WorkflowGraph where parseJSON = JSON.withObject "WorkflowGraph" $ \o -> do - wgNodes <- (o JSON..: "nodes" :: Parser (Map WorkflowGraphNodeLabel (WorkflowGraphNode fileid userid))) - return WorkflowGraph{..} + fieldTag <- o JSON..: "tag" + case fieldTag of + "workflow" -> do + wgNodes <- (o JSON..: "nodes" :: Parser (Map WorkflowGraphNodeLabel WorkflowGraphNode)) + return WorkflowGraph{..} + _ -> terror $ "WorkflowGraph parseJSON error: expected tag workflow, but got " <> fieldTag -instance (ToJSON userid, ToJSON fileid) => ToJSON (WorkflowGraphEdge userid fileid) where +instance ToJSON WorkflowGraphEdge where toJSON (WGE{..}) = JSON.object [ "actors" JSON..= Set.toList wgeActors , "target" JSON..= wgeTarget , "form" JSON..= wgeForm ] -instance (FromJSON fileid, FromJSON userid, Ord fileid, Ord userid) => FromJSON (WorkflowGraphEdge fileid userid) where +instance FromJSON WorkflowGraphEdge where parseJSON = JSON.withObject "WorkflowGraphEdge" $ \o -> do wgeActors <- o JSON..: "actors" wgeTarget <- o JSON..: "target" wgeForm <- o JSON..: "form" return WGE{..} -instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowPayloadSpec fileid userid) where +instance ToJSON WorkflowPayloadSpec where toJSON (WorkflowPayloadSpec WorkflowPayloadFieldText{..}) = JSON.object [ "tag" JSON..= ("text" :: Text) , "label" JSON..= wpftLabel @@ -303,7 +307,7 @@ instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowPayloadSpec fileid us , "default" JSON..= wpfuDefault , "optional" JSON..= wpfuOptional ] -instance (FromJSON fileid, FromJSON userid) => FromJSON (WorkflowPayloadSpec fileid userid) where +instance FromJSON WorkflowPayloadSpec where parseJSON = JSON.withObject "WorkflowPayloadSpec" $ \o -> do fieldTag <- (o JSON..: "tag" :: Parser Text) case fieldTag of @@ -332,30 +336,96 @@ instance (FromJSON fileid, FromJSON userid) => FromJSON (WorkflowPayloadSpec fil "file" -> do wpffLabel <- o JSON..: "label" wpffTooltip <- o JSON..:? "tooltip" - wpffDefault <- (o JSON..:? "default" :: Parser (Maybe fileid)) + wpffDefault <- (o JSON..:? "default" :: Parser (Maybe Int64)) wpffOptional <- o JSON..:? "optional" return $ WorkflowPayloadSpec WorkflowPayloadFieldFile{..} "user" -> do wpfuLabel <- o JSON..: "label" wpfuTooltip <- o JSON..:? "tooltip" - wpfuDefault <- (o JSON..:? "default" :: Parser (Maybe userid)) + wpfuDefault <- (o JSON..:? "default" :: Parser (Maybe Int64)) wpfuOptional <- o JSON..:? "optional" return $ WorkflowPayloadSpec WorkflowPayloadFieldUser{..} _ -> terror $ "WorkflowPayloadSpec parseJSON error: expected field tag (text|number|bool|file|user), but got " <> fieldTag -instance (ToJSON fileid, ToJSON userid, Ord userid) => ToJSON (WorkflowGraphNode fileid userid) where +instance ToJSON WorkflowGraphNode where toJSON WGN{..} = JSON.object [ "display-label" JSON..= wgnDisplayLabel , "finished" JSON..= wgnFinished , "edges" JSON..= wgnEdges ] -instance (FromJSON fileid, FromJSON userid, Ord fileid, Ord userid) => FromJSON (WorkflowGraphNode fileid userid) where +instance FromJSON WorkflowGraphNode where parseJSON = JSON.withObject "WorkflowGraphNode" $ \o -> do wgnDisplayLabel <- o JSON..: "display-label" wgnFinished <- o JSON..: "finished" wgnEdges <- o JSON..: "edges" return WGN{..} +derivePersistFieldJSON ''WorkflowGraph + +deriveJSON defaultOptions ''WorkflowInstanceScope +derivePersistFieldJSON ''WorkflowInstanceScope + +deriveJSON defaultOptions ''WorkflowInstanceScope' +derivePersistFieldJSON ''WorkflowInstanceScope' + +instance ToJSON WorkflowFieldPayload where + toJSON (WorkflowFieldPayload (WFPText txt)) = JSON.object + [ "tag" JSON..= ("text" :: Text) + , "text" JSON..= txt + ] + toJSON (WorkflowFieldPayload (WFPNumber n)) = JSON.object + [ "tag" JSON..= ("number" :: Text) + , "number" JSON..= n + ] + toJSON (WorkflowFieldPayload (WFPBool b)) = JSON.object + [ "tag" JSON..= ("bool" :: Text) + , "bool" JSON..= b + ] + toJSON (WorkflowFieldPayload (WFPFile fid)) = JSON.object + [ "tag" JSON..= ("file" :: Text) + , "file" JSON..= fid + ] + toJSON (WorkflowFieldPayload (WFPUser uid)) = JSON.object + [ "tag" JSON..= ("user" :: Text) + , "user" JSON..= uid + ] +instance FromJSON WorkflowFieldPayload where + parseJSON = JSON.withObject "WorkflowFieldPayload" $ \o -> do + fieldTag <- (o JSON..: "tag" :: Parser Text) + case fieldTag of + "text" -> do + txt <- o JSON..: "text" + return $ WorkflowFieldPayload $ WFPText txt + "number" -> do + n <- (o JSON..: "number" :: Parser Scientific) + return $ WorkflowFieldPayload $ WFPNumber n + "bool" -> do + b <- (o JSON..: "bool" :: Parser Bool) + return $ WorkflowFieldPayload $ WFPBool b + "file" -> do + fid <- (o JSON..: "file" :: Parser Int64) + return $ WorkflowFieldPayload $ WFPFile fid + "user" -> do + uid <- (o JSON..: "user" :: Parser Int64) + return $ WorkflowFieldPayload $ WFPUser uid + _ -> terror $ "WorkflowFieldPayload parseJSON error: expected payload type (text|number|bool|file|user), but got " <> fieldTag + +instance ToJSON WorkflowPayload' where + toJSON WorkflowPayload'{..} = JSON.object + [ "payload" JSON..= wpPayload + , "actor" JSON..= wpActor + , "action-time" JSON..= wpActionTime + ] +instance FromJSON WorkflowPayload' where + parseJSON = JSON.withObject "WorkflowPayload'" $ \o -> do + wpPayload <- o JSON..: "payload" + wpActor <- o JSON..:? "actor" + wpActionTime <- o JSON..: "action-time" + return WorkflowPayload'{..} + +deriveJSON defaultOptions ''WorkflowPayload +derivePersistFieldJSON ''WorkflowPayload + instance (ToJSON termid, ToJSON schoolid, ToJSON courseid) => ToJSON (WorkflowInstanceScope termid schoolid courseid) where toJSON WISGlobal = JSON.object @@ -496,7 +566,7 @@ instance ( ToJSON fileid, ToJSON userid --testGraph = WorkflowGraph $ Map.fromList [("node1", WGN (Just "someLabel") True (Set.fromList [WGE "node1" (Set.fromList [WorkflowRoleUser "user-id", WorkflowRoleInitiator]) (Map.fromList [("sometext", impureNonNull $ Set.fromList [WorkflowPayloadSpec $ WorkflowPayloadFieldText "text-label" "text-placeholder" (Just "text-tooltip") (Just "text-default") Nothing]),("someuser", impureNonNull $ Set.fromList [WorkflowPayloadSpec $ WorkflowPayloadFieldUser "user-label" Nothing Nothing Nothing]),("someboolandnumber-opt", impureNonNull $ Set.fromList [WorkflowPayloadSpec $ WorkflowPayloadFieldBool "bool-label" Nothing (Just True), WorkflowPayloadSpec $ WorkflowPayloadFieldNumber "number-label" "number-placeholder" Nothing Nothing (Just 1) (Just 5) 0.01 (Just True)])])]))] --testGraphStr :: Data.ByteString.Lazy.Internal.ByteString ---testGraphStr = "{\"nodes\":{\"node1\":{\"display-label\":\"node-label\",\"finished\":true,\"edges\":[{\"actors\":[{\"tag\":\"initiator\"},{\"tag\":\"user\",\"user\":\"user-id\"},{\"tag\":\"authorized\",\"authorized\":{\"dnf\":{\"dnfTerms\":[[{\"plVar\":\"lecturer\",\"val\":\"variable\"},{\"plVar\":\"participant\",\"val\":\"negated\"}]]}}}],\"form\":{\"some-number\":[{\"tag\":\"number\",\"step\":0.01,\"label\":\"number-label\",\"placeholder\":\"number-placeholder\"}]},\"target\":\"node1\"}]}}}" +--testGraphStr = "{\"tag\":\"workflow\",\"nodes\":{\"node1\":{\"display-label\":\"node-label\",\"finished\":true,\"edges\":[{\"actors\":[{\"tag\":\"initiator\"},{\"tag\":\"user\",\"user\":\"user-id\"},{\"tag\":\"authorized\",\"authorized\":{\"dnf\":{\"dnfTerms\":[[{\"plVar\":\"lecturer\",\"val\":\"variable\"},{\"plVar\":\"participant\",\"val\":\"negated\"}]]}}}],\"form\":{\"some-number\":[{\"tag\":\"number\",\"step\":0.01,\"label\":\"number-label\",\"placeholder\":\"number-placeholder\"}]},\"target\":\"node1\"}]}}}" --testPayload :: WorkflowPayload Text Text --testPayload = Map.fromList [("sometext" :: WorkflowPayloadLabel, (Seq.singleton (WorkflowPayload' (Map.fromList [("text-label", WFPText "hello world!")]) (Just "actor-user-id" :: Maybe Text) (UTCTime (ModifiedJulianDay 58946) 57250))))] diff --git a/src/Utils.hs b/src/Utils.hs index 01155ff19..87d8f3586 100644 --- a/src/Utils.hs +++ b/src/Utils.hs @@ -247,18 +247,6 @@ str2widget s = [whamlet|#{s}|] withFragment :: Monad m => MForm m (a, WidgetFor site ()) -> Markup -> MForm m (a, WidgetFor site ()) withFragment form html = flip fmap form $ over _2 (toWidget html >>) -rationalToFixed :: forall a. HasResolution a => Rational -> Fixed a -rationalToFixed = MkFixed . round . (* (fromInteger $ resolution (Proxy @a))) - -rationalToFixed3 :: Rational -> Fixed E3 -rationalToFixed3 = rationalToFixed - -rationalToFixed2 :: Rational -> Fixed E2 -rationalToFixed2 = rationalToFixed - -realToFixed :: forall a n. (HasResolution a, Real n) => n -> Fixed a -realToFixed = rationalToFixed . toRational - -- | Convert `part` and `whole` into percentage including symbol -- showing trailing zeroes and to decimal digits textPercent :: Real a => a -> a -> Text