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 +12/−0
- Hledger/Web/Foundation.hs +10/−9
- Hledger/Web/Handler/EditR.hs +2/−1
- Hledger/Web/Handler/UploadR.hs +2/−1
- Hledger/Web/Import.hs +2/−2
- Hledger/Web/Test.hs +0/−1
- Hledger/Web/Widget/Common.hs +6/−7
- hledger-web.1 +2/−2
- hledger-web.cabal +9/−9
- hledger-web.info +1/−1
- hledger-web.txt +2/−2
- static/hledger.css +8/−0
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 */