{-# LANGUAGE ApplicativeDo #-} module Handler.Common ( inventoryListing , itemForm , referenceListing , referenceForm , kinds , InventoryState(..) , ReferenceState(..) , FormState(..) , HasFormState(..) , stockSort, referenceSort , humanId, dayFormat ) where import Import hiding ((\\)) import qualified Data.Text as Text import qualified Data.ByteString.Char8 as CBS import Data.Set (Set) import qualified Data.Set as Set import Control.Lens import Handler.Common.Types import Text.Julius (RawJS(..)) import Database.Persist.Sql (fromSqlKey) import qualified Web.Hashids as HID import Data.List ((\\)) import Data.List.NonEmpty (NonEmpty) import Data.Semigroup hiding (First(..)) import Data.Monoid (First(..)) import Data.Time.Calendar humanId :: ItemId -> Text humanId = Text.pack . CBS.unpack . HID.encode ctx . fromIntegral . fromSqlKey where ctx = HID.createHashidsContext "ItemId" 3 $ (['0'..'9'] ++ ['a'..'z']) \\ ['0', 'l', 'v', '2'] dayFormat :: Day -> String dayFormat = formatTime defaultTimeLocale "%e. %b %y" data DayFormConfig = DayFormConfig { dfNever :: Bool , dfUnknown :: Bool , dfKnown :: Bool } itemForm :: Maybe Item -- ^ Update existing item or insert new? -> Html -> MForm Handler (FormResult (WithType Item), Widget) itemForm proto identView = do today <- utctDay <$> liftIO getCurrentTime t <- lift . runDB $ maybe (return Nothing) (fmap (Just . kindType) . getType) proto let kt kWidget tWidget = [whamlet|