add: clearer prompts, more validation, use . to end as well

This commit is contained in:
Simon Michael 2011-09-23 03:51:45 +00:00
parent d4a3a8c3a0
commit 6ddf394119
2 changed files with 19 additions and 11 deletions

View File

@ -51,10 +51,10 @@ add :: CliOpts -> Journal -> IO ()
add opts j
| f == "-" = return ()
| otherwise = do
hPrintf stderr "Adding transactions to journal file \"%s\".\n" f
hPutStrLn stderr $
"Enter one or more transactions, which will be added to your journal file.\n"
++"To complete a transaction, enter . when prompted for an account.\n"
++"To quit, press control-d or control-c."
"To complete a transaction, enter . (period) at an account prompt.\n"
++"To stop adding transactions, enter . at a date prompt, or control-d/control-c."
today <- getCurrentDay
getAndAddTransactions j opts today
`catch` (\e -> unless (isEOFError e) $ ioError e)
@ -75,10 +75,12 @@ getTransaction :: Journal -> CliOpts -> Day
-> IO (Transaction,Day)
getTransaction j opts defaultDate = do
today <- getCurrentDay
datestr <- runInteractionDefault $ askFor "date"
datestr <- runInteractionDefault $ askFor "date, or . to end"
(Just $ showDate defaultDate)
(Just $ \s -> null s ||
isRight (parse (smartdate >> many spacenonewline >> eof) "" $ lowercase s))
(Just $ \s -> null s
|| s == "."
|| isRight (parse (smartdate >> many spacenonewline >> eof) "" $ lowercase s))
when (datestr == ".") $ ioError $ mkIOError eofErrorType "" Nothing Nothing
description <- runInteractionDefault $ askFor "description" (Just "") Nothing
let historymatches = transactionsSimilarTo j (patterns_ $ reportopts_ opts) description
bestmatch | null historymatches = Nothing
@ -117,9 +119,15 @@ getPostings st enteredps = do
| otherwise = Nothing
where Just ps = historicalps
defaultaccount = maybe Nothing (Just . showacctname) bestmatch
account <- runInteraction j $ askFor (printf "account %d" n) defaultaccount (Just accept)
ordot | null enteredps || length enteredrealps == 1 = ""
| otherwise = ", or . to record"
account <- runInteraction j $ askFor (printf "account %d%s" n ordot) defaultaccount (Just accept)
if account=="."
then return enteredps
then
if null enteredps
then do hPutStrLn stderr $ "\nPlease enter some postings first."
getPostings st enteredps
else return enteredps
else do
let defaultacctused = Just account == defaultaccount
historicalps' = if defaultacctused then historicalps else Nothing

View File

@ -5,14 +5,14 @@
rm -f t$$.j; bin/hledger -f t$$.j add; rm -f t$$.j
<<<
2009/1/32
>>> /date .*: date .*/
>>> /date, or \. to end.*: date, or \. to end.*/
>>>=0
# 2. should accept a blank date
rm -f t$$.j; bin/hledger -f t$$.j add; rm -f t$$.j
<<<
>>> /date .*: description/
>>> /date,.*: description/
>>>=0
##############################################################################
@ -28,7 +28,7 @@ a
b
.
>>> /^date \[.*\]: description \[\]: account 1: amount 1: account 2: amount 2 \[-1000.0\]: account 3: date \[.*\]: $/
>>> /^date, or \. to end \[.*\]: description \[\]: account 1: amount 1: account 2: amount 2 \[-1000.0\]: account 3, or \. to record: date, or \. to end \[.*\]: $/
>>>=0
# 4. default commodity with greater precision