diff options
| author | Gregor Kleen <gkleen@yggdrasil.li> | 2017-03-16 01:19:07 +0100 |
|---|---|---|
| committer | Gregor Kleen <gkleen@yggdrasil.li> | 2017-03-16 01:19:07 +0100 |
| commit | 3bfe0bdcb79b398a387e202c5150b5e6fd230d3a (patch) | |
| tree | 8384b49048e84969a3a3440ed309b9c6e6b779de /Handler | |
| parent | 3ed9ec8ca70afb556f75d4e087043f4c67f50974 (diff) | |
| download | bar-3bfe0bdcb79b398a387e202c5150b5e6fd230d3a.tar bar-3bfe0bdcb79b398a387e202c5150b5e6fd230d3a.tar.gz bar-3bfe0bdcb79b398a387e202c5150b5e6fd230d3a.tar.bz2 bar-3bfe0bdcb79b398a387e202c5150b5e6fd230d3a.tar.xz bar-3bfe0bdcb79b398a387e202c5150b5e6fd230d3a.zip | |
More complicated date handling
Diffstat (limited to 'Handler')
| -rw-r--r-- | Handler/Common.hs | 100 | ||||
| -rw-r--r-- | Handler/List.hs | 20 | ||||
| -rw-r--r-- | Handler/OpenItem.hs | 2 |
3 files changed, 96 insertions, 26 deletions
diff --git a/Handler/Common.hs b/Handler/Common.hs index a1ae34b..990732d 100644 --- a/Handler/Common.hs +++ b/Handler/Common.hs | |||
| @@ -28,9 +28,19 @@ import Handler.Common.Types | |||
| 28 | 28 | ||
| 29 | import Text.Julius (RawJS(..)) | 29 | import Text.Julius (RawJS(..)) |
| 30 | 30 | ||
| 31 | import Data.List.NonEmpty (NonEmpty) | ||
| 32 | import Data.Semigroup hiding (First(..)) | ||
| 33 | import Data.Monoid (First(..)) | ||
| 34 | |||
| 31 | dayFormat :: Day -> String | 35 | dayFormat :: Day -> String |
| 32 | dayFormat = formatTime defaultTimeLocale "%e. %b %y" | 36 | dayFormat = formatTime defaultTimeLocale "%e. %b %y" |
| 33 | 37 | ||
| 38 | data DayFormConfig = DayFormConfig | ||
| 39 | { dfNever :: Bool | ||
| 40 | , dfUnknown :: Bool | ||
| 41 | , dfKnown :: Bool | ||
| 42 | } | ||
| 43 | |||
| 34 | itemForm :: Maybe Item -- ^ Update existing item or insert new? | 44 | itemForm :: Maybe Item -- ^ Update existing item or insert new? |
| 35 | -> Html -> MForm Handler (FormResult (WithType Item), Widget) | 45 | -> Html -> MForm Handler (FormResult (WithType Item), Widget) |
| 36 | itemForm proto identView = do | 46 | itemForm proto identView = do |
| @@ -41,12 +51,12 @@ itemForm proto identView = do | |||
| 41 | let kt kWidget tWidget = | 51 | let kt kWidget tWidget = |
| 42 | [whamlet| | 52 | [whamlet| |
| 43 | <div .td>^{kWidget} | 53 | <div .td>^{kWidget} |
| 44 | <div .td>^{tWidget} | 54 | <div .td>^{tWidget} |
| 45 | |] | 55 | |] |
| 46 | ((kindRes, typeRes), typedKindWidget) <- typedKindField kt ((itemKind <$> proto), t) | 56 | ((kindRes, typeRes), typedKindWidget) <- typedKindField kt ((itemKind <$> proto), t) |
| 47 | (boughtRes, boughtWidget) <- dayForm (maybe (Just $ Just today) Just $ fmap itemBought proto) "Unknown" | 57 | (boughtRes, boughtWidget) <- dayForm (Just . fromMaybe (DateKnown today) $ itemBought <$> proto) $ DayFormConfig False True True |
| 48 | (expiresRes, expiresWidget) <- dayForm (fmap itemExpires proto) "Never" | 58 | (expiresRes, expiresWidget) <- dayForm (itemExpires <$> proto) $ DayFormConfig True False True |
| 49 | (openedRes, openedWidget) <- dayForm (fmap itemOpened proto) "Never" | 59 | (openedRes, openedWidget) <- dayForm (itemOpened <$> proto) $ DayFormConfig True True True |
| 50 | 60 | ||
| 51 | let itemRes = do | 61 | let itemRes = do |
| 52 | itemKind <- kindRes | 62 | itemKind <- kindRes |
| @@ -66,33 +76,79 @@ itemForm proto identView = do | |||
| 66 | <div .td>^{openedWidget} | 76 | <div .td>^{openedWidget} |
| 67 | |] | 77 | |] |
| 68 | where | 78 | where |
| 69 | dayForm :: Maybe (Maybe Day) -> String -> MForm Handler (FormResult (Maybe Day), Widget) | 79 | dayForm :: Maybe ItemDate -> DayFormConfig -> MForm Handler (FormResult ItemDate, Widget) |
| 70 | dayForm proto label = do | 80 | dayForm proto DayFormConfig{..} = do |
| 71 | today <- utctDay <$> liftIO getCurrentTime | 81 | today <- utctDay <$> liftIO getCurrentTime |
| 72 | 82 | ||
| 73 | checkboxId <- ("check" <>) . show . hashUnique <$> liftIO newUnique | 83 | let mWhen = bool (Nothing <$) (fmap Just) |
| 84 | |||
| 85 | neverBoxId <- ("check" <>) . show . hashUnique <$> liftIO newUnique | ||
| 86 | unknownBoxId <- ("check" <>) . show . hashUnique <$> liftIO newUnique | ||
| 87 | groupId <- ("dateGroup" <>) . show . hashUnique <$> liftIO newUnique | ||
| 74 | 88 | ||
| 75 | (fmap (fromMaybe False) -> isNothingRes, isNothingView) <- | 89 | dNever <- mWhen dfNever $ |
| 76 | mopt checkBoxField ("" { fsId = Just $ Text.pack checkboxId }) . Just . Just . fromMaybe True $ fmap isNothing proto | 90 | mopt checkBoxField ("" { fsId = Just $ Text.pack neverBoxId }) . Just . Just . fromMaybe True $ fmap isNever proto |
| 77 | (dayRes, dayView) <- | 91 | dUnknown <- mWhen dfUnknown $ |
| 78 | mreq dayField "" . Just . fromMaybe today $ join proto | 92 | mopt checkBoxField ("" { fsId = Just $ Text.pack unknownBoxId }) . Just . Just . fromMaybe False $ fmap isUnknown proto |
| 93 | dDay <- mWhen dfKnown $ | ||
| 94 | mopt dayField "" . Just . Just $ case proto of | ||
| 95 | Just (DateKnown d) -> d | ||
| 96 | _ -> today | ||
| 79 | 97 | ||
| 80 | let res = (bool Just (const Nothing) <$> isNothingRes) <*> dayRes | 98 | let res = resFromMaybe . fromMaybe FormMissing . fmap (fmap getFirst) $ mconcat |
| 99 | [ fmap (fmap (First . bool Nothing (Just DateNever) . fromMaybe False) . fst) dNever | ||
| 100 | , fmap (fmap (First . bool Nothing (Just DateUnknown) . fromMaybe False) . fst) dUnknown | ||
| 101 | , fmap (fmap (First . fmap DateKnown) . fst) dDay | ||
| 102 | ] | ||
| 103 | resFromMaybe (FormSuccess Nothing) = FormFailure ["Missing required information"] | ||
| 104 | resFromMaybe (FormSuccess (Just x)) = FormSuccess x | ||
| 105 | resFromMaybe FormMissing = FormMissing | ||
| 106 | resFromMaybe (FormFailure es) = FormFailure es | ||
| 81 | return . (res, ) $ do | 107 | return . (res, ) $ do |
| 108 | toWidget $ | ||
| 109 | [julius| | ||
| 110 | $(function () { | ||
| 111 | var updateInput = function() { | ||
| 112 | $('##{rawJS groupId} :input').filter(':not(:checkbox)').prop("disabled", $('##{rawJS groupId} :checkbox').filter(':checked').length > 0); | ||
| 113 | }; | ||
| 114 | |||
| 115 | $('##{rawJS groupId} :checkbox').change(function() { | ||
| 116 | if (this.checked) { | ||
| 117 | $('##{rawJS groupId} :checkbox').not(this).prop('checked', false); | ||
| 118 | } | ||
| 119 | updateInput(); | ||
| 120 | }); | ||
| 121 | |||
| 122 | updateInput(); | ||
| 123 | }); | ||
| 124 | |] | ||
| 125 | let width = length $ (filter id [ isJust dNever, isJust dUnknown ] :: [Bool]) | ||
| 82 | [whamlet| | 126 | [whamlet| |
| 83 | $newline never | 127 | $newline never |
| 84 | <div .table> | 128 | <table ##{groupId} .dayField> |
| 85 | <div .tr> | 129 | <tr> |
| 86 | <label for=#{checkboxId} .checkbox .td> | 130 | $maybe (_, isNeverView) <- dNever |
| 87 | ^{fvInput isNothingView} | 131 | <td> |
| 88 | <span> | 132 | <label for=#{neverBoxId} .checkbox> |
| 89 | #{label} | 133 | ^{fvInput isNeverView} |
| 90 | <div .tr> | 134 | <span> |
| 91 | <div .td .dayInput>^{fvInput dayView} | 135 | Never |
| 136 | $maybe (_, isUnknownView) <- dUnknown | ||
| 137 | <td> | ||
| 138 | <label for=#{unknownBoxId} .checkbox> | ||
| 139 | ^{fvInput isUnknownView} | ||
| 140 | <span> | ||
| 141 | Unknown | ||
| 142 | $maybe (_, dayView) <- dDay | ||
| 143 | <tr> | ||
| 144 | <td .dayInput :width > 0:colspan=#{width}> | ||
| 145 | ^{fvInput dayView} | ||
| 92 | |] | 146 | |] |
| 93 | 147 | ||
| 94 | inventoryListing :: InventoryState -> Widget | 148 | inventoryListing :: InventoryState -> Widget |
| 95 | inventoryListing InventoryState{ invFormState = formState, ..} = $(widgetFile "inventoryListing") | 149 | inventoryListing InventoryState{ invFormState = formState, ..} = do |
| 150 | today <- liftIO $ utctDay <$> getCurrentTime | ||
| 151 | $(widgetFile "inventoryListing") | ||
| 96 | 152 | ||
| 97 | referenceForm :: Maybe Reference -- ^ Update existing item or insert new? | 153 | referenceForm :: Maybe Reference -- ^ Update existing item or insert new? |
| 98 | -> Html -> MForm Handler (FormResult (WithType Reference), Widget) | 154 | -> Html -> MForm Handler (FormResult (WithType Reference), Widget) |
| @@ -188,7 +244,7 @@ kinds = do | |||
| 188 | stock <- runDB $ selectList [] [] | 244 | stock <- runDB $ selectList [] [] |
| 189 | reference <- runDB $ selectList [] [] | 245 | reference <- runDB $ selectList [] [] |
| 190 | 246 | ||
| 191 | return . Set.fromList $ concat | 247 | return . Set.fromList $ (concat :: [[a]] -> [a]) |
| 192 | [ [ itemKind | Entity _ Item{..} <- stock ] | 248 | [ [ itemKind | Entity _ Item{..} <- stock ] |
| 193 | , [ referenceKind | Entity _ Reference{..} <- reference ] | 249 | , [ referenceKind | Entity _ Reference{..} <- reference ] |
| 194 | ] | 250 | ] |
diff --git a/Handler/List.hs b/Handler/List.hs index 70f323a..4209651 100644 --- a/Handler/List.hs +++ b/Handler/List.hs | |||
| @@ -19,9 +19,23 @@ import Database.Persist.Sql (Single(..), rawSql) | |||
| 19 | import Thermoprint.Client | 19 | import Thermoprint.Client |
| 20 | 20 | ||
| 21 | list :: Handler (Set (WithType Text)) | 21 | list :: Handler (Set (WithType Text)) |
| 22 | list = do | 22 | list = runDB $ do |
| 23 | (map (uncurry WithType . bimap unSingle unSingle) -> kinds) <- runDB $ rawSql "select reference.kind, kind.type from reference,kind where (not exists (select * from item where COALESCE(item.expires >= CURRENT_DATE, TRUE) and (item.norm_kind = reference.norm_kind))) and (reference.norm_kind = kind.norm_kind)" [] | 23 | today <- liftIO $ utctDay <$> getCurrentTime |
| 24 | return $ Set.fromList kinds | 24 | |
| 25 | items <- map entityVal <$> selectList [] [] | ||
| 26 | references <- Set.fromList <$> (withTypes . fmap entityVal =<< selectList [] []) | ||
| 27 | |||
| 28 | let | ||
| 29 | references' = Set.filter (isNothing . flip find items . matches) references | ||
| 30 | matches (Reference{..} `WithType` _) Item{..} | ||
| 31 | | today `isBefore` itemExpires = itemNormKind == referenceNormKind | ||
| 32 | | otherwise = False | ||
| 33 | |||
| 34 | isBefore _ DateNever = True | ||
| 35 | isBefore _ DateUnknown = False | ||
| 36 | isBefore d1 (DateKnown d2) = d1 < d2 | ||
| 37 | |||
| 38 | return $ Set.map (fmap referenceKind) references' | ||
| 25 | 39 | ||
| 26 | mkPrintout :: Set (WithType Text) -> Printout | 40 | mkPrintout :: Set (WithType Text) -> Printout |
| 27 | mkPrintout list = Printout ps | 41 | mkPrintout list = Printout ps |
diff --git a/Handler/OpenItem.hs b/Handler/OpenItem.hs index 468c6ec..3b1dfeb 100644 --- a/Handler/OpenItem.hs +++ b/Handler/OpenItem.hs | |||
| @@ -5,7 +5,7 @@ import Import | |||
| 5 | postOpenItemR :: ItemId -> Handler TypedContent | 5 | postOpenItemR :: ItemId -> Handler TypedContent |
| 6 | postOpenItemR itemId = do | 6 | postOpenItemR itemId = do |
| 7 | today <- utctDay <$> liftIO getCurrentTime | 7 | today <- utctDay <$> liftIO getCurrentTime |
| 8 | result <- fmap (Entity itemId) . runDB $ updateGet itemId [ ItemOpened =. Just today | 8 | result <- fmap (Entity itemId) . runDB $ updateGet itemId [ ItemOpened =. DateKnown today |
| 9 | ] | 9 | ] |
| 10 | selectRep $ do | 10 | selectRep $ do |
| 11 | provideJson result | 11 | provideJson result |
