packages feed

hledger-web 1.25 → 1.26

raw patch · 12 files changed

+56/−35 lines, 12 filesdep ~hledgerdep ~hledger-libPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: hledger, hledger-lib

API changes (from Hackage documentation)

- Hledger.Web.Import: CompositeRef :: CompositeDef -> ReferenceDef
- Hledger.Web.Import: SomePersistField :: a -> SomePersistField
- Hledger.Web.Import: class (PersistStoreWrite backend, PersistEntity record, BaseBackend backend ~ PersistEntityBackend record) => DeleteCascade record backend
- Hledger.Web.Import: data SomePersistField
- Hledger.Web.Import: deleteCascade :: forall (m :: Type -> Type). (DeleteCascade record backend, MonadIO m) => Key record -> ReaderT backend m ()
- Hledger.Web.Import: deleteCascadeWhere :: forall record backend (m :: Type -> Type). (MonadIO m, DeleteCascade record backend, PersistQueryWrite backend) => [Filter record] -> ReaderT backend m ()
- Hledger.Web.Import: mkDeleteCascade :: MkPersistSettings -> [UnboundEntityDef] -> Q [Dec]
- Hledger.Web.Import: mkSave :: String -> [EntityDef] -> Q [Dec]
+ Hledger.Web.Import: FTLit :: FieldTypeLit -> FieldType
+ Hledger.Web.Import: [pageDescription] :: PageContent url -> !Maybe Text
+ Hledger.Web.Import: getEntityUniquesNoPrimaryKey :: EntityDef -> [UniqueDef]
+ Hledger.Web.Import: setDescriptionIdemp :: MonadWidget m => Text -> m ()
+ Hledger.Web.Import: setDescriptionIdempI :: (MonadWidget m, RenderMessage (HandlerSite m) msg) => msg -> m ()
+ Hledger.Web.Import: tabulateEntity :: PersistEntity record => (forall a. () => EntityField record a -> a) -> Entity record
+ Hledger.Web.Import: tabulateEntityA :: (PersistEntity record, Applicative f) => (forall a. () => EntityField record a -> f a) -> f (Entity record)
- Hledger.Web.Import: PageContent :: !Html -> !HtmlUrl url -> !HtmlUrl url -> PageContent url
+ Hledger.Web.Import: PageContent :: !Html -> !Maybe Text -> !HtmlUrl url -> !HtmlUrl url -> PageContent url
- Hledger.Web.Import: insert :: forall record (m :: Type -> Type). (PersistStoreWrite backend, MonadIO m, PersistRecordBackend record backend) => record -> ReaderT backend m (Key record)
+ Hledger.Web.Import: insert :: forall record (m :: Type -> Type). (PersistStoreWrite backend, MonadIO m, PersistRecordBackend record backend, SafeToInsert record) => record -> ReaderT backend m (Key record)
- Hledger.Web.Import: insert400 :: forall (m :: Type -> Type) backend val. (MonadIO m, PersistUniqueWrite backend, PersistRecordBackend val backend) => val -> ReaderT backend m (Key val)
+ Hledger.Web.Import: insert400 :: forall (m :: Type -> Type) backend val. (MonadIO m, PersistUniqueWrite backend, PersistRecordBackend val backend, SafeToInsert val) => val -> ReaderT backend m (Key val)
- Hledger.Web.Import: insert400_ :: forall (m :: Type -> Type) backend val. (MonadIO m, PersistUniqueWrite backend, PersistRecordBackend val backend) => val -> ReaderT backend m ()
+ Hledger.Web.Import: insert400_ :: forall (m :: Type -> Type) backend val. (MonadIO m, PersistUniqueWrite backend, PersistRecordBackend val backend, SafeToInsert val) => val -> ReaderT backend m ()
- Hledger.Web.Import: insertBy :: forall record backend (m :: Type -> Type). (MonadIO m, PersistUniqueWrite backend, PersistRecordBackend record backend, AtLeastOneUniqueKey record) => record -> ReaderT backend m (Either (Entity record) (Key record))
+ Hledger.Web.Import: insertBy :: forall record backend (m :: Type -> Type). (MonadIO m, PersistUniqueWrite backend, PersistRecordBackend record backend, AtLeastOneUniqueKey record, SafeToInsert record) => record -> ReaderT backend m (Either (Entity record) (Key record))
- Hledger.Web.Import: insertEntity :: forall e backend (m :: Type -> Type). (PersistStoreWrite backend, PersistRecordBackend e backend, MonadIO m) => e -> ReaderT backend m (Entity e)
+ Hledger.Web.Import: insertEntity :: forall e backend (m :: Type -> Type). (PersistStoreWrite backend, PersistRecordBackend e backend, SafeToInsert e, MonadIO m, HasCallStack) => e -> ReaderT backend m (Entity e)
- Hledger.Web.Import: insertMany :: forall record (m :: Type -> Type). (PersistStoreWrite backend, MonadIO m, PersistRecordBackend record backend) => [record] -> ReaderT backend m [Key record]
+ Hledger.Web.Import: insertMany :: forall record (m :: Type -> Type). (PersistStoreWrite backend, MonadIO m, PersistRecordBackend record backend, SafeToInsert record) => [record] -> ReaderT backend m [Key record]
- Hledger.Web.Import: insertMany_ :: forall record (m :: Type -> Type). (PersistStoreWrite backend, MonadIO m, PersistRecordBackend record backend) => [record] -> ReaderT backend m ()
+ Hledger.Web.Import: insertMany_ :: forall record (m :: Type -> Type). (PersistStoreWrite backend, MonadIO m, PersistRecordBackend record backend, SafeToInsert record) => [record] -> ReaderT backend m ()
- Hledger.Web.Import: insertRecord :: forall record backend (m :: Type -> Type). (PersistEntityBackend record ~ BaseBackend backend, PersistEntity record, MonadIO m, PersistStoreWrite backend) => record -> ReaderT backend m record
+ Hledger.Web.Import: insertRecord :: forall record backend (m :: Type -> Type). (PersistEntityBackend record ~ BaseBackend backend, PersistEntity record, MonadIO m, PersistStoreWrite backend, SafeToInsert record, HasCallStack) => record -> ReaderT backend m record
- Hledger.Web.Import: insertUnique :: forall record (m :: Type -> Type). (PersistUniqueWrite backend, MonadIO m, PersistRecordBackend record backend) => record -> ReaderT backend m (Maybe (Key record))
+ Hledger.Web.Import: insertUnique :: forall record (m :: Type -> Type). (PersistUniqueWrite backend, MonadIO m, PersistRecordBackend record backend, SafeToInsert record) => record -> ReaderT backend m (Maybe (Key record))
- Hledger.Web.Import: insertUniqueEntity :: forall record backend (m :: Type -> Type). (MonadIO m, PersistRecordBackend record backend, PersistUniqueWrite backend) => record -> ReaderT backend m (Maybe (Entity record))
+ Hledger.Web.Import: insertUniqueEntity :: forall record backend (m :: Type -> Type). (MonadIO m, PersistRecordBackend record backend, PersistUniqueWrite backend, SafeToInsert record) => record -> ReaderT backend m (Maybe (Entity record))
- Hledger.Web.Import: insert_ :: forall record (m :: Type -> Type). (PersistStoreWrite backend, MonadIO m, PersistRecordBackend record backend) => record -> ReaderT backend m ()
+ Hledger.Web.Import: insert_ :: forall record (m :: Type -> Type). (PersistStoreWrite backend, MonadIO m, PersistRecordBackend record backend, SafeToInsert record) => record -> ReaderT backend m ()
- Hledger.Web.Import: parseTime :: Text -> Either FormMessage TimeOfDay
+ Hledger.Web.Import: parseTime :: ParseTime t => TimeLocale -> String -> String -> Maybe t
- Hledger.Web.Import: putMany :: forall record (m :: Type -> Type). (PersistUniqueWrite backend, MonadIO m, PersistRecordBackend record backend) => [record] -> ReaderT backend m ()
+ Hledger.Web.Import: putMany :: forall record (m :: Type -> Type). (PersistUniqueWrite backend, MonadIO m, PersistRecordBackend record backend, SafeToInsert record) => [record] -> ReaderT backend m ()
- Hledger.Web.Import: toPersistFields :: PersistEntity record => record -> [SomePersistField]
+ Hledger.Web.Import: toPersistFields :: PersistEntity record => record -> [PersistValue]
- Hledger.Web.Import: upsert :: forall record (m :: Type -> Type). (PersistUniqueWrite backend, MonadIO m, PersistRecordBackend record backend, OnlyOneUniqueKey record) => record -> [Update record] -> ReaderT backend m (Entity record)
+ Hledger.Web.Import: upsert :: forall record (m :: Type -> Type). (PersistUniqueWrite backend, MonadIO m, PersistRecordBackend record backend, OnlyOneUniqueKey record, SafeToInsert record) => record -> [Update record] -> ReaderT backend m (Entity record)
- Hledger.Web.Import: upsertBy :: forall record (m :: Type -> Type). (PersistUniqueWrite backend, MonadIO m, PersistRecordBackend record backend) => Unique record -> record -> [Update record] -> ReaderT backend m (Entity record)
+ Hledger.Web.Import: upsertBy :: forall record (m :: Type -> Type). (PersistUniqueWrite backend, MonadIO m, PersistRecordBackend record backend, SafeToInsert record) => Unique record -> record -> [Update record] -> ReaderT backend m (Entity record)
- Hledger.Web.Widget.Common: writeJournalTextIfValidAndChanged :: MonadHandler m => FilePath -> Text -> m (Either String ())
+ Hledger.Web.Widget.Common: writeJournalTextIfValidAndChanged :: MonadHandler m => FilePath -> Text -> ExceptT String m ()

Files

CHANGES.md view
@@ -9,6 +9,18 @@ User-visible changes in hledger-web. See also the hledger changelog. +# 1.26 2022-06-04++Fixes++- Don't add link URLs when printing.++Improvements++- Now builds with GHC 9.2.++- Uses hledger 1.26.+ # 1.25 2022-03-04  - Uses hledger 1.25.
Hledger/Web/Foundation.hs view
@@ -17,6 +17,7 @@  import Control.Applicative ((<|>)) import Control.Monad (join, when)+-- import Control.Monad.Except (runExceptT)  -- now re-exported by Hledger import qualified Data.ByteString.Char8 as BC import Data.Traversable (for) import Data.IORef (IORef, readIORef, writeIORef)@@ -256,16 +257,16 @@ -- ui message. getCurrentJournal :: IORef Journal -> CliOpts -> Day -> Handler (Journal, Maybe String) getCurrentJournal jref opts d = do-  -- XXX put this inside atomicModifyIORef' for thread safety-  j <- liftIO (readIORef jref)-  (ej, changed) <- liftIO $ journalReloadIfChanged opts d j   -- re-apply any initial filter specified at startup   let initq = _rsQuery $ reportspec_ opts-  case (changed, filterJournalTransactions initq <$> ej) of-    (False, _) -> return (j, Nothing)-    (True, Right j') -> do-      liftIO $ writeIORef jref j'-      return (j',Nothing)-    (True, Left e) -> do+  -- XXX put this inside atomicModifyIORef' for thread safety+  j <- liftIO (readIORef jref)+  ej <- liftIO . runExceptT $ journalReloadIfChanged opts d j+  case ej of+    Left e -> do       setMessage "error while reading journal"       return (j, Just e)+    Right (j', True) -> do+      liftIO . writeIORef jref $ filterJournalTransactions initq j'+      return (j',Nothing)+    Right (_, False) -> return (j, Nothing)
Hledger/Web/Handler/EditR.hs view
@@ -10,6 +10,7 @@   , postEditR   ) where +import Control.Monad.Except (runExceptT) import Hledger.Web.Import import Hledger.Web.Widget.Common        (fromFormSuccess, helplink, journalFile404, writeJournalTextIfValidAndChanged)@@ -36,7 +37,7 @@   (f', txt) <- journalFile404 f j   ((res, view), enctype) <- runFormPost (editForm f' txt)   newtxt <- fromFormSuccess (showForm view enctype) res-  writeJournalTextIfValidAndChanged f newtxt >>= \case+  runExceptT (writeJournalTextIfValidAndChanged f newtxt) >>= \case     Left e -> do       setMessage $ "Failed to load journal: " <> toHtml e       showForm view enctype
Hledger/Web/Handler/UploadR.hs view
@@ -9,6 +9,7 @@   , postUploadR   ) where +import Control.Monad.Except (runExceptT) import qualified Data.ByteString.Lazy as BL import Data.Conduit (connect) import Data.Conduit.Binary (sinkLbs)@@ -52,7 +53,7 @@         "where the transcoding should be handled by the browser."       showForm view enctype     Right newtxt -> return newtxt-  writeJournalTextIfValidAndChanged f newtxt >>= \case+  runExceptT (writeJournalTextIfValidAndChanged f newtxt) >>= \case     Left e -> do       setMessage $ "Failed to load journal: " <> toHtml e       showForm view enctype
Hledger/Web/Import.hs view
@@ -4,7 +4,7 @@  import           Prelude              as Import hiding (head, init, last,                                                  readFile, tail, writeFile)-import           Yesod                as Import hiding (Route (..))+import           Yesod                as Import hiding (Route (..), parseTime)  import           Control.Monad        as Import import           Data.Bifunctor       as Import@@ -15,7 +15,7 @@ import           Data.List            as Import (unfoldr) import           Data.Maybe           as Import import           Data.Text            as Import (Text)-import           Data.Time            as Import hiding (parseTime)+import           Data.Time            as Import import           Data.Traversable     as Import import           Data.Void            as Import (Void) import           Text.Blaze           as Import (Markup)
Hledger/Web/Test.hs view
@@ -4,7 +4,6 @@   hledgerWebTest ) where -import Control.Monad.Except (runExceptT) import qualified Data.Text as T import Test.Hspec (hspec) import Yesod.Default.Config
Hledger/Web/Widget/Common.hs view
@@ -19,6 +19,7 @@   , replaceInacct   ) where +import Control.Monad.Except (ExceptT, mapExceptT) import Data.Foldable (find, for_) import Data.List (elemIndex) import Data.Text (Text)@@ -59,17 +60,15 @@ -- The file will be written (if changed) with the current system's native -- line endings (see writeFileWithBackupIfChanged). ---writeJournalTextIfValidAndChanged :: MonadHandler m => FilePath -> Text -> m (Either String ())-writeJournalTextIfValidAndChanged f t = do+writeJournalTextIfValidAndChanged :: MonadHandler m => FilePath -> Text -> ExceptT String m ()+writeJournalTextIfValidAndChanged f t = mapExceptT liftIO $ do   -- Ensure unix line endings, since both readJournal (cf   -- formatdirectivep, #1194) writeFileWithBackupIfChanged require them.   -- XXX klunky. Any equivalent of "hSetNewlineMode h universalNewlineMode" for form posts ?   let t' = T.replace "\r" "" t-  liftIO (readJournal definputopts (Just f) t') >>= \case-    Left e -> return (Left e)-    Right _ -> do-      _ <- liftIO (writeFileWithBackupIfChanged f t')-      return (Right ())+  j <- readJournal definputopts (Just f) t'+  _ <- liftIO $ j `seq` writeFileWithBackupIfChanged f t'  -- Only write backup if the journal didn't error+  return ()  -- | Link to a topic in the manual. helplink :: Text -> Text -> HtmlUrl r
hledger-web.1 view
@@ -1,12 +1,12 @@ -.TH "HLEDGER-WEB" "1" "March 2022" "hledger-web-1.25 " "hledger User Manuals"+.TH "HLEDGER-WEB" "1" "June 2022" "hledger-web-1.26 " "hledger User Manuals"    .SH NAME .PP hledger-web is a web interface (WUI) for the hledger accounting tool.-This manual is for hledger-web 1.25.+This manual is for hledger-web 1.26. .SH SYNOPSIS .PP \f[C]hledger-web [OPTIONS]\f[R]
hledger-web.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           hledger-web-version:        1.25+version:        1.26 synopsis:       Web-based user interface for the hledger accounting system description:    A simple web-based user interface for the hledger accounting system,                 providing a more modern UI than the command-line or terminal interfaces.@@ -150,8 +150,8 @@       Paths_hledger_web   hs-source-dirs:       ./-  ghc-options: -Wall -fwarn-tabs -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates -Wredundant-constraints-  cpp-options: -DVERSION="1.25"+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns+  cpp-options: -DVERSION="1.26"   build-depends:       Decimal >=0.5.1     , aeson >=1@@ -171,8 +171,8 @@     , extra >=1.6.3     , filepath     , hjsmin-    , hledger ==1.25.*-    , hledger-lib ==1.25.*+    , hledger ==1.26.*+    , hledger-lib ==1.26.*     , hspec     , http-client     , http-conduit@@ -211,8 +211,8 @@       Paths_hledger_web   hs-source-dirs:       app-  ghc-options: -Wall -fwarn-tabs -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates -Wredundant-constraints-  cpp-options: -DVERSION="1.25"+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns+  cpp-options: -DVERSION="1.26"   build-depends:       base     , hledger-web@@ -231,8 +231,8 @@   main-is: test.hs   hs-source-dirs:       test-  ghc-options: -Wall -fwarn-tabs -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates -Wredundant-constraints-  cpp-options: -DVERSION="1.25"+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns+  cpp-options: -DVERSION="1.26"   build-depends:       base     , hledger
hledger-web.info view
@@ -12,7 +12,7 @@ **************  hledger-web is a web interface (WUI) for the hledger accounting tool.-This manual is for hledger-web 1.25.+This manual is for hledger-web 1.26.     'hledger-web [OPTIONS]' 'hledger web -- [OPTIONS]'
hledger-web.txt view
@@ -5,7 +5,7 @@  NAME        hledger-web  is  a web interface (WUI) for the hledger accounting tool.-       This manual is for hledger-web 1.25.+       This manual is for hledger-web 1.26.  SYNOPSIS        hledger-web [OPTIONS]@@ -585,4 +585,4 @@   -hledger-web-1.25                  March 2022                    HLEDGER-WEB(1)+hledger-web-1.26                   June 2022                    HLEDGER-WEB(1)
static/hledger.css view
@@ -1,6 +1,14 @@ /* hledger web ui styles */  /*------------------------------------------------------------------------------------------*/+/* 0. revert some things */++/* don't let bootstrap add link URLs when printing */+@media print {+  a[href]:after { content: none !important; }+}++/*------------------------------------------------------------------------------------------*/ /* 1. colours */  /* green */