From ad40233861cb1fd50033ff28bfefab3a7b87a699 Mon Sep 17 00:00:00 2001 From: Sjoerd Visscher Date: Wed, 1 Dec 2021 14:09:42 +0100 Subject: [PATCH] Store evaluation with its simulation (#155) * Store evaluation with its simulation * Remove release banner * Rename Blocks to Slots --- plutus-playground-client/src/Action/View.purs | 2 +- plutus-playground-client/src/Cursor.purs | 21 ++--- .../src/MainFrame/Lenses.purs | 87 +++++++++++-------- .../src/MainFrame/State.purs | 35 ++++---- .../src/MainFrame/Types.purs | 12 ++- .../src/MainFrame/View.purs | 72 +++++++-------- .../src/Simulator/View.purs | 26 +++--- 7 files changed, 132 insertions(+), 123 deletions(-) diff --git a/plutus-playground-client/src/Action/View.purs b/plutus-playground-client/src/Action/View.purs index d0bf4ddb28..cd2f975bda 100644 --- a/plutus-playground-client/src/Action/View.purs +++ b/plutus-playground-client/src/Action/View.purs @@ -124,7 +124,7 @@ actionPaneBody index (AddBlocks { blocks }) = , formGroup_ [ formRow_ [ label [ classes [ col, colFormLabel ] ] - [ text "Blocks" ] + [ text "Slots" ] , col_ [ input [ type_ InputNumber diff --git a/plutus-playground-client/src/Cursor.purs b/plutus-playground-client/src/Cursor.purs index 8d3b95ea7b..4883ccba09 100644 --- a/plutus-playground-client/src/Cursor.purs +++ b/plutus-playground-client/src/Cursor.purs @@ -29,8 +29,7 @@ import Data.Array as Array import Data.Argonaut.Decode (class DecodeJson, decodeJson) import Data.Argonaut.Encode (class EncodeJson, encodeJson) import Data.Foldable (class Foldable, foldMap, foldl, foldr) -import Data.Lens (Traversal', wander) -import Data.Lens.AffineTraversal (affineTraversal) +import Data.Lens.AffineTraversal (AffineTraversal', affineTraversal) import Data.Lens.Index (class Index) import Data.Maybe (fromMaybe, maybe) import Data.Ord as Ord @@ -79,18 +78,12 @@ instance encodeCursor :: EncodeJson a => EncodeJson (Cursor a) where instance decodeCursor :: DecodeJson a => DecodeJson (Cursor a) where decodeJson value = uncurry Cursor <$> decodeJson value -_current :: forall a. Traversal' (Cursor a) a -_current = - wander \coalg (Cursor index xs) -> - Array.index xs index - # maybe - (pure xs) - ( let - f x = fromMaybe xs $ Array.updateAt index x xs - in - coalg >>> map f - ) - # map (Cursor index) +_current :: forall a. AffineTraversal' (Cursor a) a +_current = affineTraversal set pre + where + set (Cursor index xs) a = Cursor index $ fromMaybe xs $ Array.updateAt index a xs + + pre c@(Cursor index xs) = maybe (Left c) Right $ Array.index xs index clamp :: forall a. Cursor a -> Cursor a clamp (Cursor index xs) = diff --git a/plutus-playground-client/src/MainFrame/Lenses.purs b/plutus-playground-client/src/MainFrame/Lenses.purs index 3c703fbb39..0dc5d0860b 100644 --- a/plutus-playground-client/src/MainFrame/Lenses.purs +++ b/plutus-playground-client/src/MainFrame/Lenses.purs @@ -1,33 +1,35 @@ module MainFrame.Lenses - ( _demoFilesMenuVisible - , _gistErrorPaneVisible - , _currentView + ( _actionDrag + , _authStatus + , _balancesChartSlot + , _blockchainVisualisationState + , _compilationResult + , _contractDemoEditorContents , _contractDemos + , _createGistResult , _currentDemoName + , _currentView + , _demoFilesMenuVisible + , _editorSlot , _editorState - , _simulations - , _actionDrag , _evaluationResult - , _successfulEvaluationResult - , _lastEvaluatedSimulation - , _compilationResult - , _successfulCompilationResult - , _lastSuccessfulCompilationResult - , _authStatus - , _createGistResult + , _functionSchema + , _gistErrorPaneVisible , _gistUrl - , _blockchainVisualisationState - , _editorSlot - , _balancesChartSlot - , _contractDemoEditorContents - , _simulationId + , _knownCurrencies + , _lastSuccessfulCompilationResult + , _result + , _resultRollup + , _simulation , _simulationActions + , _simulationBlockchainVisualisationState + , _simulationEvaluationResult + , _simulationId , _simulationWallets - , _resultRollup - , _functionSchema + , _simulations + , _successfulCompilationResult + , _successfulEvaluationResult , _walletKeys - , _knownCurrencies - , _result , _warnings , getKnownCurrencies ) where @@ -36,19 +38,20 @@ import Prologue import Auth (AuthStatus) import Chain.Types as Chain import Control.Monad.State.Class (class MonadState) -import Cursor (Cursor) -import Data.Lens (Lens', Traversal', _Right, lens, preview) +import Cursor (Cursor, _current) +import Data.Lens (Lens', _Right, lens, preview, set) import Data.Lens.Extra (peruse) import Data.Lens.Iso.Newtype (_Newtype) import Data.Lens.Record (prop) +import Data.Lens.Types (AffineTraversal') import Data.Maybe (fromMaybe) import Editor.Types (State) as Editor import Gist (Gist) import Language.Haskell.Interpreter (InterpreterError, InterpreterResult, SourceCode, _InterpreterResult) import Ledger.CardanoWallet (WalletNumber) -import MainFrame.Types (State, View, WebData) -import Network.RemoteData (_Success) -import Playground.Types (CompilationResult, ContractCall, ContractDemo, EvaluationResult, FunctionSchema, KnownCurrency, PlaygroundError, Simulation, SimulatorWallet) +import MainFrame.Types (FullSimulation, State, View, WebData, WebEvaluationResult) +import Network.RemoteData (_Success, RemoteData(NotAsked)) +import Playground.Types (CompilationResult, ContractCall, ContractDemo, EvaluationResult, FunctionSchema, KnownCurrency, Simulation, SimulatorWallet) import Plutus.V1.Ledger.Crypto (PubKeyHash) import Schema (FormSchema) import Schema.Types (FormArgument) @@ -73,21 +76,18 @@ _currentDemoName = _Newtype <<< prop (Proxy :: _ "currentDemoName") _editorState :: Lens' State Editor.State _editorState = _Newtype <<< prop (Proxy :: _ "editorState") -_simulations :: Lens' State (Cursor Simulation) +_simulations :: Lens' State (Cursor FullSimulation) _simulations = _Newtype <<< prop (Proxy :: _ "simulations") _actionDrag :: Lens' State (Maybe Int) _actionDrag = _Newtype <<< prop (Proxy :: _ "actionDrag") -_evaluationResult :: Lens' State (WebData (Either PlaygroundError EvaluationResult)) -_evaluationResult = _Newtype <<< prop (Proxy :: _ "evaluationResult") +_evaluationResult :: Lens' State WebEvaluationResult +_evaluationResult = withDefault NotAsked (_simulations <<< _current <<< _simulationEvaluationResult) -_successfulEvaluationResult :: Traversal' State EvaluationResult +_successfulEvaluationResult :: AffineTraversal' State EvaluationResult _successfulEvaluationResult = _evaluationResult <<< _Success <<< _Right -_lastEvaluatedSimulation :: Lens' State (Maybe Simulation) -_lastEvaluatedSimulation = _Newtype <<< prop (Proxy :: _ "lastEvaluatedSimulation") - _compilationResult :: Lens' State (WebData (Either InterpreterError (InterpreterResult CompilationResult))) _compilationResult = _Newtype <<< lens g s where @@ -97,7 +97,7 @@ _compilationResult = _Newtype <<< lens g s Just cr -> r { compilationResult = c, lastSuccessfulCompilationResult = Just cr } Nothing -> r { compilationResult = c } -_successfulCompilationResult :: Traversal' State CompilationResult +_successfulCompilationResult :: AffineTraversal' State CompilationResult _successfulCompilationResult = _compilationResult <<< _Success <<< _Right <<< _InterpreterResult <<< _result _lastSuccessfulCompilationResult :: Lens' State (Maybe CompilationResult) @@ -113,7 +113,24 @@ _gistUrl :: Lens' State (Maybe String) _gistUrl = _Newtype <<< prop (Proxy :: _ "gistUrl") _blockchainVisualisationState :: Lens' State Chain.State -_blockchainVisualisationState = _Newtype <<< prop (Proxy :: _ "blockchainVisualisationState") +_blockchainVisualisationState = withDefault Chain.initialState (_simulations <<< _current <<< _simulationBlockchainVisualisationState) + +_simulation :: Lens' FullSimulation Simulation +_simulation = prop (Proxy :: _ "simulation") + +_simulationEvaluationResult :: Lens' FullSimulation WebEvaluationResult +_simulationEvaluationResult = prop (Proxy :: _ "evaluationResult") + +_simulationBlockchainVisualisationState :: Lens' FullSimulation Chain.State +_simulationBlockchainVisualisationState = prop (Proxy :: _ "blockchainVisualisationState") + +------------------------------------------------------------ +withDefault :: forall s a. a -> AffineTraversal' s a -> Lens' s a +withDefault def l = lens doGet doSet + where + doGet s = fromMaybe def $ preview l s + + doSet s a = set l a s ------------------------------------------------------------ _editorSlot :: Proxy "editorSlot" diff --git a/plutus-playground-client/src/MainFrame/State.purs b/plutus-playground-client/src/MainFrame/State.purs index 7af8d1ae47..7a6c64cabd 100644 --- a/plutus-playground-client/src/MainFrame/State.purs +++ b/plutus-playground-client/src/MainFrame/State.purs @@ -57,9 +57,9 @@ import Halogen as H import Halogen.Query (HalogenM) import Language.Haskell.Interpreter (CompilationError(..), InterpreterError(..), SourceCode(..)) import Ledger.CardanoWallet (WalletNumber(WalletNumber)) -import MainFrame.Lenses (_actionDrag, _authStatus, _blockchainVisualisationState, _compilationResult, _contractDemos, _createGistResult, _currentDemoName, _currentView, _demoFilesMenuVisible, _editorState, _evaluationResult, _functionSchema, _gistErrorPaneVisible, _gistUrl, _knownCurrencies, _lastEvaluatedSimulation, _lastSuccessfulCompilationResult, _resultRollup, _simulationActions, _simulationId, _simulationWallets, _simulations, _successfulCompilationResult, _successfulEvaluationResult, getKnownCurrencies) +import MainFrame.Lenses (_actionDrag, _authStatus, _blockchainVisualisationState, _compilationResult, _contractDemos, _createGistResult, _currentDemoName, _currentView, _demoFilesMenuVisible, _editorState, _evaluationResult, _functionSchema, _gistErrorPaneVisible, _gistUrl, _knownCurrencies, _lastSuccessfulCompilationResult, _resultRollup, _simulation, _simulationActions, _simulationId, _simulationWallets, _simulations, _successfulCompilationResult, _successfulEvaluationResult, getKnownCurrencies) import MainFrame.MonadApp (class MonadApp, editorGetContents, editorHandleAction, editorSetAnnotations, editorSetContents, getGistByGistId, getOauthStatus, postGistByGistId, postContract, postEvaluation, postGist, preventDefault, resizeBalancesChart, resizeEditor, runHalogenApp, saveBuffer, scrollIntoView, setDataTransferData, setDropEffect) -import MainFrame.Types (ChildSlots, DragAndDropEventType(..), HAction(..), Query, State(..), View(..), WalletEvent(..)) +import MainFrame.Types (ChildSlots, DragAndDropEventType(..), FullSimulation, HAction(..), Query, State(..), View(..), WalletEvent(..)) import MainFrame.View (render) import Monaco (IMarkerData, markerSeverity) import Network.RemoteData (RemoteData(..), _Success, isSuccess) @@ -92,6 +92,13 @@ mkSimulation simulationCurrencies simulationId = , simulationWallets: mkSimulatorWallet simulationCurrencies <<< BigInt.fromInt <$> 1 .. 2 } +mkFullSimulation :: Simulation -> FullSimulation +mkFullSimulation simulation = + { simulation + , evaluationResult: NotAsked + , blockchainVisualisationState: Chain.initialState + } + mkInitialState :: forall m. MonadThrow Error m => Editor.State -> m State mkInitialState editorState = do contractDemos <- @@ -115,12 +122,9 @@ mkInitialState editorState = do , lastSuccessfulCompilationResult: Nothing , simulations: Cursor.empty , actionDrag: Nothing - , evaluationResult: NotAsked - , lastEvaluatedSimulation: Nothing , authStatus: NotAsked , createGistResult: NotAsked , gistUrl: Nothing - , blockchainVisualisationState: Chain.initialState } ------------------------------------------------------------ @@ -201,7 +205,7 @@ handleAction (ActionDragAndDrop _ DragLeave _) = pure unit handleAction (ActionDragAndDrop destination Drop event) = do use _actionDrag >>= case _ of - Just source -> modifying (_simulations <<< _current <<< _simulationActions) (Array.move source destination) + Just source -> modifying (_simulations <<< _current <<< _simulation <<< _simulationActions) (Array.move source destination) _ -> pure unit preventDefault event assign _actionDrag Nothing @@ -227,7 +231,7 @@ handleAction EvaluateActions = void $ runMaybeT $ do - simulation <- peruse (_simulations <<< _current) + simulation <- peruse (_simulations <<< _current <<< _simulation) evaluation <- MaybeT do contents <- editorGetContents @@ -239,7 +243,6 @@ handleAction EvaluateActions = Success (Right _) -> do -- on successful evaluation, update last evaluated simulation, and reset and show transactions when (isSuccess result) do - assign _lastEvaluatedSimulation simulation assign _blockchainVisualisationState Chain.initialState -- preselect the first transaction (if any) mAnnotatedBlockchain <- peruse (_successfulEvaluationResult <<< _resultRollup <<< to AnnotatedBlockchain) @@ -266,7 +269,7 @@ handleAction (LoadScript key) = do assign _demoFilesMenuVisible false assign _currentView Editor assign _currentDemoName (Just contractDemoName) - assign _simulations $ Cursor.fromArray contractDemoSimulations + assign _simulations $ mkFullSimulation <$> Cursor.fromArray contractDemoSimulations assign (_editorState <<< _lastCompiledCode) (Just contractDemoEditorContents) assign (_editorState <<< _currentCodeIsCompiled) true assign _compilationResult (Success <<< Right $ contractDemoContext) @@ -289,12 +292,12 @@ handleAction AddSimulationSlot = do modifying _simulations ( \simulations -> let - maxsimulationId = fromMaybe 0 $ maximumOf (traversed <<< _simulationId) simulations + maxsimulationId = fromMaybe 0 $ maximumOf (traversed <<< _simulation <<< _simulationId) simulations simulationId = maxsimulationId + 1 in Cursor.snoc simulations - (mkSimulation knownCurrencies simulationId) + (mkFullSimulation $ mkSimulation knownCurrencies simulationId) ) Nothing -> pure unit assign _currentView Simulations @@ -321,13 +324,13 @@ handleAction (RemoveSimulationSlot index) = do handleAction (ModifyWallets action) = do knownCurrencies <- getKnownCurrencies - modifying (_simulations <<< _current <<< _simulationWallets) (handleActionWalletEvent (mkSimulatorWallet knownCurrencies) action) + modifying (_simulations <<< _current <<< _simulation <<< _simulationWallets) (handleActionWalletEvent (mkSimulatorWallet knownCurrencies) action) handleAction (ChangeSimulation subaction) = do knownCurrencies <- getKnownCurrencies let initialValue = mkInitialValue knownCurrencies zero - modifying (_simulations <<< _current <<< _simulationActions) (handleSimulationAction initialValue subaction) + modifying (_simulations <<< _current <<< _simulation <<< _simulationActions) (handleSimulationAction initialValue subaction) handleAction (ChainAction subaction) = do mAnnotatedBlockchain <- @@ -383,7 +386,7 @@ handleAction CompileProgram = do ) ( assign _simulations $ case newCurrencies of - Just currencies -> Cursor.singleton $ mkSimulation currencies 1 + Just currencies -> Cursor.singleton $ mkFullSimulation $ mkSimulation currencies 1 Nothing -> Cursor.empty ) pure unit @@ -411,7 +414,7 @@ handleGistAction PublishOrUpdateGist = do $ runMaybeT do mContents <- lift $ editorGetContents simulations <- use _simulations - newGist <- hoistMaybe $ mkNewGist { source: mContents, simulations } + newGist <- hoistMaybe $ mkNewGist { source: mContents, simulations: _.simulation <$> simulations } mGist <- use _createGistResult assign _createGistResult Loading newResult <- @@ -456,7 +459,7 @@ handleGistAction LoadGist = -- Load the simulation, if available. simulationString <- noteT "Simulation not found in gist." $ view simulationGistFile gist simulations <- except $ lmap printJsonDecodeError $ parseDecodeJson simulationString - assign _simulations simulations + assign _simulations $ mkFullSimulation <$> simulations where toEither :: forall e a. Either e a -> RemoteData e a -> Either e a toEither _ (Success a) = Right a diff --git a/plutus-playground-client/src/MainFrame/Types.purs b/plutus-playground-client/src/MainFrame/Types.purs index e883fcca1f..771aa6cf4e 100644 --- a/plutus-playground-client/src/MainFrame/Types.purs +++ b/plutus-playground-client/src/MainFrame/Types.purs @@ -6,6 +6,7 @@ module MainFrame.Types , WebData , WebCompilationResult , WebEvaluationResult + , FullSimulation , SimulatorAction , Query , HAction(..) @@ -54,14 +55,11 @@ newtype State , editorState :: Editor.State , compilationResult :: WebCompilationResult , lastSuccessfulCompilationResult :: Maybe CompilationResult - , simulations :: Cursor Simulation + , simulations :: Cursor FullSimulation , actionDrag :: Maybe Int - , evaluationResult :: WebEvaluationResult - , lastEvaluatedSimulation :: Maybe Simulation , authStatus :: WebData AuthStatus , createGistResult :: WebData Gist , gistUrl :: Maybe String - , blockchainVisualisationState :: Chain.State } derive instance newtypeState :: Newtype State _ @@ -98,6 +96,12 @@ type WebCompilationResult type WebEvaluationResult = WebData (Either PlaygroundError EvaluationResult) +type FullSimulation + = { simulation :: Simulation + , blockchainVisualisationState :: Chain.State + , evaluationResult :: WebEvaluationResult + } + -- this synonym is defined in playground-common/src/Playground/Types.hs type SimulatorAction = ContractCall FormArgument diff --git a/plutus-playground-client/src/MainFrame/View.purs b/plutus-playground-client/src/MainFrame/View.purs index 425d316cb3..d5269450a7 100644 --- a/plutus-playground-client/src/MainFrame/View.purs +++ b/plutus-playground-client/src/MainFrame/View.purs @@ -1,9 +1,8 @@ module MainFrame.View (render) where import Bootstrap (active, btn, containerFluid, hidden, justifyContentBetween, mlAuto, mrAuto, navItem, navLink, navbar, navbarBrand, navbarExpand, navbarNav, navbarText, nbsp) -import Chain.Types as Chain import Control.Monad.State (evalState) -import Cursor (Cursor) +import Cursor (Cursor, current) import Data.Either (Either(..)) import Data.Lens (view) import Data.Maybe (Maybe(..)) @@ -22,9 +21,9 @@ import Halogen.HTML.Properties (class_, classes, height, href, src, target, widt import Icons (Icon(..), icon) import Language.Haskell.Interpreter (_SourceCode) import MainFrame.Lenses (getKnownCurrencies, _contractDemoEditorContents) -import MainFrame.Types (ChildSlots, HAction(..), State(..), View(..), WebCompilationResult, WebEvaluationResult) +import MainFrame.Types (ChildSlots, FullSimulation, HAction(..), State(..), View(..), WebCompilationResult) import Network.RemoteData (RemoteData(..)) -import Playground.Types (ContractDemo(..), Simulation) +import Playground.Types (ContractDemo(..)) import Prelude (class Eq, const, ($), (<$>), (<<<), (==)) import Schema.Types (mkInitialValue) import Simulator.View (simulatorTitle, simulationsPane, simulationsNav) @@ -34,24 +33,17 @@ import Transaction.View (evaluationPane) foreign import plutusLogo :: String render :: forall m. MonadAff m => State -> ComponentHTML HAction ChildSlots m -render state@(State { contractDemos, currentView, editorState, compilationResult, simulations, evaluationResult, blockchainVisualisationState }) = +render state@(State { contractDemos, currentView, editorState, compilationResult, simulations }) = div [ class_ $ ClassName "frame" ] - [ releaseBanner - , mainHeader + [ mainHeader , subHeader state , editorMain contractDemos currentView editorState compilationResult , simulationsMain state - , transactionsMain currentView simulations evaluationResult blockchainVisualisationState + , transactionsMain currentView simulations , mainFooter ] -releaseBanner :: forall p. HTML p HAction -releaseBanner = - div - [ class_ $ ClassName "release-banner" ] - [ text "Plutus Refresh - Updated 25th January 2021" ] - mainHeader :: forall p. HTML p HAction mainHeader = nav @@ -166,12 +158,12 @@ simulationsMain state@(State { currentView }) = , simulationsWrapper state ] -transactionsMain :: forall m. MonadAff m => View -> Cursor Simulation -> WebEvaluationResult -> Chain.State -> ComponentHTML HAction ChildSlots m -transactionsMain currentView simulations evaluationResult blockchainVisualisationState = +transactionsMain :: forall m. MonadAff m => View -> Cursor FullSimulation -> ComponentHTML HAction ChildSlots m +transactionsMain currentView simulations = main [ classes $ mainComponentClasses currentView Transactions ] [ simulatorTitle - , transactionsWrapper simulations evaluationResult blockchainVisualisationState + , transactionsWrapper simulations ] mainComponentClasses :: forall view. Eq view => view -> view -> Array (ClassName) @@ -206,7 +198,7 @@ editorWrapper contractDemos editorState compilationResult = defaultContents = view (_contractDemoEditorContents <<< _SourceCode) <$> lookupContractDemo "Vesting" contractDemos simulationsWrapper :: forall p. State -> HTML p HAction -simulationsWrapper state@(State { actionDrag, compilationResult, simulations, lastEvaluatedSimulation, evaluationResult }) = +simulationsWrapper state@(State { actionDrag, compilationResult, simulations }) = let knownCurrencies = evalState getKnownCurrencies state @@ -219,36 +211,36 @@ simulationsWrapper state@(State { actionDrag, compilationResult, simulations, la actionDrag compilationResult simulations - lastEvaluatedSimulation - evaluationResult ] -transactionsWrapper :: forall m. MonadAff m => Cursor Simulation -> WebEvaluationResult -> Chain.State -> ComponentHTML HAction ChildSlots m -transactionsWrapper simulations evaluationResult blockchainVisualisationState = +transactionsWrapper :: forall m. MonadAff m => Cursor FullSimulation -> ComponentHTML HAction ChildSlots m +transactionsWrapper simulations = div [ classes [ ClassName "main-body", ClassName "simulator" ] ] [ div [ class_ $ ClassName "simulations" ] [ simulationsNav simulations , div - [ class_ $ ClassName "simulation" ] case evaluationResult of - Success (Right evaluation) -> [ evaluationPane blockchainVisualisationState evaluation ] - Success (Left _) -> - [ text "Your simulation has errors. Click the " - , strong_ [ text "Simulations" ] - , text " tab above to fix them and recompile." - ] - Failure _ -> - [ text "Your simulation has errors. Click the " - , strong_ [ text "Simulations" ] - , text " tab above to fix them and recompile." - ] - Loading -> [ icon Spinner ] - NotAsked -> - [ text "Click the " - , strong_ [ text "Simulations" ] - , text " tab above and evaluate a simulation to see some results." - ] + [ class_ $ ClassName "simulation" ] case current simulations of + Just { evaluationResult, blockchainVisualisationState } -> case evaluationResult of + Success (Right evaluation) -> [ evaluationPane blockchainVisualisationState evaluation ] + Success (Left _) -> + [ text "Your simulation has errors. Click the " + , strong_ [ text "Simulations" ] + , text " tab above to fix them and recompile." + ] + Failure _ -> + [ text "Your simulation has errors. Click the " + , strong_ [ text "Simulations" ] + , text " tab above to fix them and recompile." + ] + Loading -> [ icon Spinner ] + NotAsked -> + [ text "Click the " + , strong_ [ text "Simulations" ] + , text " tab above and evaluate a simulation to see some results." + ] + Nothing -> [] ] ] diff --git a/plutus-playground-client/src/Simulator/View.purs b/plutus-playground-client/src/Simulator/View.purs index 25815e00a7..a8f6b7bb18 100644 --- a/plutus-playground-client/src/Simulator/View.purs +++ b/plutus-playground-client/src/Simulator/View.purs @@ -28,9 +28,9 @@ import Language.Haskell.Interpreter as PI import Plutus.V1.Ledger.Value (Value) import Network.RemoteData (RemoteData(..), _Success) import MainFrame.Lenses (_functionSchema, _result) -import MainFrame.Types (HAction(..), View(..), SimulatorAction, WebCompilationResult, WebEvaluationResult) +import MainFrame.Types (FullSimulation, HAction(..), View(..), SimulatorAction, WebCompilationResult, WebEvaluationResult) import Playground.Types (PlaygroundError(..), Simulation(..), SimulatorWallet) -import Prelude (const, not, pure, show, (#), ($), (/=), (<$>), (<<<), (<>), (==), (>)) +import Prelude (const, not, pure, show, (#), ($), (<$>), (<<<), (<>), (==), (>)) import Wallet.View (walletsPane) simulatorTitle :: forall p. HTML p HAction @@ -47,9 +47,9 @@ simulatorTitle = [ text "< Return to Editor" ] ] -simulationsPane :: forall p. Value -> Maybe Int -> WebCompilationResult -> Cursor Simulation -> Maybe Simulation -> WebEvaluationResult -> HTML p HAction -simulationsPane initialValue actionDrag compilationResult simulations lastEvaluatedSimulation evaluationResult = case current simulations of - Just (Simulation { simulationWallets, simulationActions }) -> +simulationsPane :: forall p. Value -> Maybe Int -> WebCompilationResult -> Cursor FullSimulation -> HTML p HAction +simulationsPane initialValue actionDrag compilationResult simulations = case current simulations of + Just { simulation: Simulation { simulationWallets, simulationActions }, evaluationResult } -> div [ class_ $ ClassName "simulations" ] [ simulationsNav simulations @@ -58,14 +58,14 @@ simulationsPane initialValue actionDrag compilationResult simulations lastEvalua [ div [ classes [ ClassName "simulation-controls", floatRight ] ] [ evaluateActionsButton simulationWallets simulationActions evaluationResult - , viewTransactionsButton simulations lastEvaluatedSimulation evaluationResult + , viewTransactionsButton evaluationResult ] , walletsPane endpointSignatures initialValue simulationWallets , actionsPane actionDrag simulationWallets simulationActions , div [ classes [ ClassName "simulation-controls" ] ] [ evaluateActionsButton simulationWallets simulationActions evaluationResult - , viewTransactionsButton simulations lastEvaluatedSimulation evaluationResult + , viewTransactionsButton evaluationResult ] , case evaluationResult of Failure error -> ajaxErrorPane error @@ -80,7 +80,7 @@ simulationsPane initialValue actionDrag compilationResult simulations lastEvalua where endpointSignatures = view (_Success <<< _Right <<< _Newtype <<< _result <<< _functionSchema) compilationResult -simulationsNav :: forall p. Cursor Simulation -> HTML p HAction +simulationsNav :: forall p. Cursor FullSimulation -> HTML p HAction simulationsNav simulations = ul [ classes [ nav, ClassName "nav-tabs" ] @@ -93,8 +93,8 @@ simulationsNav simulations = <> [ addSimulationControl ] ) -simulationNavItem :: forall p. Boolean -> Int -> Int -> Simulation -> Array (HTML p HAction) -simulationNavItem canClose activeIndex index (Simulation { simulationName }) = +simulationNavItem :: forall p. Boolean -> Int -> Int -> FullSimulation -> Array (HTML p HAction) +simulationNavItem canClose activeIndex index { simulation: Simulation { simulationName } } = [ li [ id $ "simulation-nav-item-" <> show index , class_ navItem @@ -150,8 +150,8 @@ evaluateActionsButton simulationWallets simulationActions evaluationResult = btnText _ _ = text "Evaluate" -viewTransactionsButton :: forall p. Cursor Simulation -> Maybe Simulation -> WebEvaluationResult -> HTML p HAction -viewTransactionsButton simulations lastEvaluatedSimulation evaluationResult = +viewTransactionsButton :: forall p. WebEvaluationResult -> HTML p HAction +viewTransactionsButton evaluationResult = button [ classes [ btn, ClassName "btn-turquoise" ] , disabled isDisabled @@ -160,7 +160,7 @@ viewTransactionsButton simulations lastEvaluatedSimulation evaluationResult = [ text "Transactions" ] where isDisabled = case evaluationResult of - Success _ -> (current simulations) /= lastEvaluatedSimulation + Success _ -> false _ -> true actionsErrorPane :: forall p i. PlaygroundError -> HTML p i