lambdacms-media 0.2.0 → 0.3.0
raw patch · 10 files changed
+154/−120 lines, 10 filesdep ~lambdacms-core
Dependency ranges changed: lambdacms-core
Files
- LambdaCms/Media.hs +1/−0
- LambdaCms/Media/Foundation.hs +4/−1
- LambdaCms/Media/Handler/Media.hs +9/−9
- LambdaCms/Media/Import.hs +2/−11
- LambdaCms/Media/Message.hs +64/−63
- README.md +40/−10
- lambdacms-media.cabal +3/−3
- templates/edit.hamlet +12/−9
- templates/index.hamlet +6/−14
- templates/index_item.hamlet +13/−0
LambdaCms/Media.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -fno-warn-orphans #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-}
LambdaCms/Media/Foundation.hs view
@@ -6,10 +6,10 @@ {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE ViewPatterns #-}+{-# OPTIONS_GHC -fno-warn-orphans #-} module LambdaCms.Media.Foundation where -import Data.Monoid ((<>)) import Data.Text (Text, unpack) import qualified Data.Text as T import System.FilePath ((</>))@@ -22,10 +22,13 @@ import qualified LambdaCms.Media.Message as Msg import LambdaCms.Media.Models + data MediaAdmin = MediaAdmin mkYesodSubData "MediaAdmin" $(parseRoutesFile "config/routes") +-- This instance requires OPTIONS_GHC -fno-warn-orphans+-- TODO: Can we avoid surpressing orphan warnings? instance LambdaCmsMedia master => RenderMessage master MediaMessage where renderMessage = renderMediaMessage
LambdaCms/Media/Handler/Media.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE FlexibleContexts #-} module LambdaCms.Media.Handler.Media ( getMediaAdminR@@ -14,7 +15,6 @@ , patchMediaAdminRenameR ) where -import Data.Maybe (fromJust, isJust) import Data.Text (pack, unpack) import qualified Data.Text as T (concat, split) import Data.Time (getCurrentTime, utctDay)@@ -23,8 +23,8 @@ import qualified LambdaCms.Media.Message as Msg import System.Directory import System.FilePath-import Text.Lucius (luciusFile) + getMediaAdminR :: MediaHandler Html getMediaAdminNewR :: MediaHandler Html postMediaAdminNewR :: MediaHandler Html@@ -35,8 +35,8 @@ getMediaAdminR = lift $ do can <- getCan- y <- getYesod- let sr = unpack $ staticRoot y+ -- Following line needs +XFlexibleContexts in GHC 7.10++ let indexItem file mroute = $(widgetFile "index_item") (files :: [Entity Media]) <- runDB $ selectList [] [] adminLayout $ do setTitleI Msg.MediaIndex@@ -52,11 +52,11 @@ postMediaAdminNewR = do ((results, fWidget), enctype) <- lift $ runFormPost uploadForm case results of- FormSuccess (file, name, label, description) -> do- ct <- liftIO getCurrentTime- (location, ctype) <- upload file (unpack name)- _ <- lift . runDB . insert $ Media location ctype label description ct- lift . setMessageI $ Msg.SaveSuccess label+ FormSuccess (fileF, nameF, labelF, descriptionF) -> do+ now <- liftIO getCurrentTime+ (location, ctype) <- upload fileF (unpack nameF)+ _ <- lift . runDB . insert $ Media location ctype labelF descriptionF now+ lift . setMessageI $ Msg.SaveSuccess labelF redirect MediaAdminR _ -> lift $ do can <- getCan
LambdaCms/Media/Import.hs view
@@ -7,10 +7,9 @@ import Prelude as Import hiding (head, init, last, readFile, tail, writeFile)-import Yesod as Import hiding (Route (..))+import Yesod as Import hiding (Route(..)) import Yesod.Form.Bootstrap3 as Import -import Control.Applicative as Import (pure, (<$>), (<*), (<*>)) import Data.Text as Import (Text) import Text.Hamlet as Import (hamletFile) @@ -19,12 +18,4 @@ import LambdaCms.Media.Foundation as Import import LambdaCms.Media.Models as Import -#if __GLASGOW_HASKELL__ >= 704-import Data.Monoid as Import (Monoid (mappend, mempty, mconcat),- (<>))-#else-import Data.Monoid as Import (Monoid (mappend, mempty, mconcat))-infixr 5 <>-(<>) :: Monoid m => m -> m -> m-(<>) = mappend-#endif+import Data.Monoid as Import ((<>))
LambdaCms/Media/Message.hs view
@@ -8,9 +8,10 @@ , dutchMessage ) where -import Data.Monoid (mappend)+import Data.Monoid as Import ((<>)) import Data.Text (Text) + data MediaMessage = Back | Delete@@ -48,67 +49,67 @@ defaultMessage = englishMessage englishMessage :: MediaMessage -> Text-englishMessage Back = "Back"-englishMessage Delete = "Remove"-englishMessage Save = "Save"-englishMessage Upload = "Upload"-englishMessage Rename = "Rename"-englishMessage AddMedia = "Add media"-englishMessage NoMediaFound = "No media found."-englishMessage CantDisplayFileType = "Can't display file"-englishMessage UnknownFileType = "Unknown file type"-englishMessage MediaIndex = "Media overview"-englishMessage NewMedia = "New media file"-englishMessage (EditMedia label) = label-englishMessage Information = "File information"-englishMessage Preview = "Preview"-englishMessage Location = "File"-englishMessage NewFilename = "New filename"-englishMessage ChangeMediaSettings = "Change media settings"-englishMessage ChangeFilename = "Change filename"-englishMessage Label = "Label"-englishMessage Description = "Description"-englishMessage UploadedOn = "Uploaded on"-englishMessage Filename = "Filename"-englishMessage FileContentType = "Content type"-englishMessage FileLocation = "File location"-englishMessage MenuMedia = "Media"-englishMessage (SaveSuccess label) = "Successfully created: " `mappend` label-englishMessage (UpdateSuccess label) = "Successfully updated: " `mappend` label-englishMessage (DeleteSuccess label) = "Successfully deleted: " `mappend` label-englishMessage (DeleteFail label) = "Failed to delete: " `mappend` label-englishMessage RenameSuccess = "Successfully renamed file"-englishMessage RenameFail = "Failed to rename file"+englishMessage Back = "Back"+englishMessage Delete = "Remove"+englishMessage Save = "Save"+englishMessage Upload = "Upload"+englishMessage Rename = "Rename"+englishMessage AddMedia = "Upload media"+englishMessage NoMediaFound = "No media found."+englishMessage CantDisplayFileType = "Can't display file"+englishMessage UnknownFileType = "Unknown file type"+englishMessage MediaIndex = "Media overview"+englishMessage NewMedia = "New media file"+englishMessage (EditMedia labelM) = labelM+englishMessage Information = "File information"+englishMessage Preview = "Preview"+englishMessage Location = "File"+englishMessage NewFilename = "New filename"+englishMessage ChangeMediaSettings = "Change media settings"+englishMessage ChangeFilename = "Change filename"+englishMessage Label = "Label"+englishMessage Description = "Description"+englishMessage UploadedOn = "Uploaded on"+englishMessage Filename = "Filename"+englishMessage FileContentType = "Content type"+englishMessage FileLocation = "File location"+englishMessage MenuMedia = "Media"+englishMessage (SaveSuccess labelM) = "Successfully created: " <> labelM+englishMessage (UpdateSuccess labelM) = "Successfully updated: " <> labelM+englishMessage (DeleteSuccess labelM) = "Successfully deleted: " <> labelM+englishMessage (DeleteFail labelM) = "Failed to delete: " <> labelM+englishMessage RenameSuccess = "Successfully renamed file"+englishMessage RenameFail = "Failed to rename file" dutchMessage :: MediaMessage -> Text-dutchMessage Back = "Terug"-dutchMessage Delete = "Verwijderen"-dutchMessage Save = "Opslaan"-dutchMessage Upload = "Uploaden"-dutchMessage Rename = "Hernoemen"-dutchMessage AddMedia = "Media toevoegen"-dutchMessage NoMediaFound = "Geen media gevonden."-dutchMessage CantDisplayFileType = "Kan bestand niet weergeven"-dutchMessage UnknownFileType = "Onbekend bestandstype"-dutchMessage MediaIndex = "Media overzicht"-dutchMessage NewMedia = "Nieuw mediabestand"-dutchMessage (EditMedia label) = label-dutchMessage Information = "Bestandsinformatie"-dutchMessage Preview = "Voorvertoning"-dutchMessage Location = "Bestand"-dutchMessage NewFilename = "Nieuwe bestandsnaam"-dutchMessage ChangeMediaSettings = "Pas media instellingen aan"-dutchMessage ChangeFilename = "Bestandsnaam wijzigen"-dutchMessage Label = "Label"-dutchMessage Description = "Beschrijving"-dutchMessage UploadedOn = "Geüpload op"-dutchMessage Filename = "Bestandsnaam"-dutchMessage FileContentType = "Inhoudstype"-dutchMessage FileLocation = "Bestandslocatie"-dutchMessage MenuMedia = "Media"-dutchMessage (SaveSuccess label) = "Succesvol aangemaakt: " `mappend` label-dutchMessage (UpdateSuccess label) = "Succesvol geüpdate: " `mappend` label-dutchMessage (DeleteSuccess label) = "Succesvol verwijderd: " `mappend` label-dutchMessage (DeleteFail label) = "Verwijderen mislukt voor: " `mappend` label-dutchMessage RenameSuccess = "Bestand succesvol hernoemd"-dutchMessage RenameFail = "Hernoemen van bestand mislukt"+dutchMessage Back = "Terug"+dutchMessage Delete = "Verwijderen"+dutchMessage Save = "Opslaan"+dutchMessage Upload = "Uploaden"+dutchMessage Rename = "Hernoemen"+dutchMessage AddMedia = "Media toevoegen"+dutchMessage NoMediaFound = "Geen media gevonden."+dutchMessage CantDisplayFileType = "Kan bestand niet weergeven"+dutchMessage UnknownFileType = "Onbekend bestandstype"+dutchMessage MediaIndex = "Media overzicht"+dutchMessage NewMedia = "Nieuw mediabestand"+dutchMessage (EditMedia labelM) = labelM+dutchMessage Information = "Bestandsinformatie"+dutchMessage Preview = "Voorvertoning"+dutchMessage Location = "Bestand"+dutchMessage NewFilename = "Nieuwe bestandsnaam"+dutchMessage ChangeMediaSettings = "Pas media instellingen aan"+dutchMessage ChangeFilename = "Bestandsnaam wijzigen"+dutchMessage Label = "Label"+dutchMessage Description = "Beschrijving"+dutchMessage UploadedOn = "Geüpload op"+dutchMessage Filename = "Bestandsnaam"+dutchMessage FileContentType = "Inhoudstype"+dutchMessage FileLocation = "Bestandslocatie"+dutchMessage MenuMedia = "Media"+dutchMessage (SaveSuccess labelM) = "Succesvol aangemaakt: " <> labelM+dutchMessage (UpdateSuccess labelM) = "Succesvol geüpdate: " <> labelM+dutchMessage (DeleteSuccess labelM) = "Succesvol verwijderd: " <> labelM+dutchMessage (DeleteFail labelM) = "Verwijderen mislukt voor: " <> labelM+dutchMessage RenameSuccess = "Bestand succesvol hernoemd"+dutchMessage RenameFail = "Hernoemen van bestand mislukt"
README.md view
@@ -6,7 +6,7 @@ **NOTE:** At this point the functionality provided by this extension is very basic. Pull request adding features are most welcome. -# Installing+### Installing LambdaCms extensions come as plain Haskell packages and need to be added to the project's `.cabal` file like any other package dependency.@@ -18,7 +18,7 @@ line to `build-depends`: ```- , lambdacms-media+ , lambdacms-media >= 0.2.0 && < 0.3 ``` The media extension's admin section needs to be mounted in the base app's@@ -31,37 +31,37 @@ To `Application.hs` add `import LambdaCms.Media` and the following line: ```haskell-[...]+... let getLambdaCms = CoreAdmin getLambdaCmsMedia = MediaAdmin -- add this line mkFoundation appConnPool = App {..}-[...]+... ``` The procede by including the `migrateLambdaCmsMedia` function to `Application.hs` as shown in this snippet: ```haskell-[...]+... runLoggingT (runSqlPool (mapM_ runMigration [migrateAll, migrateLambdaCmsCore, migrateLambdaCmsMedia]) pool) (messageLoggerSource theFoundation appLogger)-[...]+... ``` To `Foundation.hs` also add `import LambdaCms.Media` and the following two lines: ```haskell-[...]+... , getLambdaCms :: CoreAdmin , getLambdaCmsMedia :: MediaAdmin -- add this line }-[...]+... adminMenu = (defaultCoreAdminMenu CoreAdminR) ++ (defaultMediaAdminMenu MediaAdminR) -- add this line renderLanguages _ = ["en", "nl"]-[...]+... ``` The last line hooks the media admin section into the admin menu.@@ -80,8 +80,38 @@ `yesod devel` to test drive the freshly installed extension. +### Using media in another LambdaCms extension -# License+A common usecase would be to use the "media" that are managed using the+`lambdacms-media` extension in other extensions. For example: to add an+image to a blog post.++First off all the `lambdacms-media` package needs to become a package+dependency of that particular extension's package.++Then we can add an `imageId` to the `Post` model.++```+Post+ title Text+ body Text+ imageId MediaId Maybe+```++To make it all work we need to put a constraint on the type class+defined in the `Foundation.hs`:++```haskell+...+class LambdaCmsMedia master => MysitePostSub master where+...+```++After this the `attachedMaybeMedia` function may be used in the+handler functions of the blog post extension.+++### License All code in this repository is released under the MIT license, as specified in the [LICENSE file](https://github.com/lambdacms/lambdacms-core/blob/master/LICENSE).
lambdacms-media.cabal view
@@ -1,5 +1,5 @@ name: lambdacms-media-version: 0.2.0+version: 0.3.0 license: MIT license-file: LICENSE author: Mats Rietdijk, Cies Breijs@@ -14,7 +14,7 @@ category: Web build-type: Simple cabal-version: >= 1.18-tested-with: GHC >= 7.6+tested-with: GHC >= 7.10 extra-source-files: README.md , CHANGES.md , templates/*.hamlet@@ -40,7 +40,7 @@ build-depends: base >= 4.3 && < 5 , yesod , yesod-form- , lambdacms-core >= 0.0.7.3 && < 0.2+ , lambdacms-core >= 0.2 && < 0.3 , persistent , text , time
templates/edit.hamlet view
@@ -9,7 +9,7 @@ $maybe r <- can (mediaR $ MediaAdminEditR fileId) "DELETE" <form .form-inline .display-inline method=POST action=@{r}> <input name="_method" type="hidden" value="DELETE" />- <button .btn .btn-danger type=submit>+ <button .btn .btn-danger .btn-xs type=submit> <span .glyphicon .glyphicon-remove> _{Msg.Delete} <div .row>@@ -47,15 +47,18 @@ _{Msg.CantDisplayFileType} $else _{Msg.UnknownFileType}+ <div .row> <div .col-sm-12 .col-md-9 .col-lg-6> $maybe r <- can (mediaR $ MediaAdminEditR fileId) "PATCH"- <h2>_{Msg.ChangeMediaSettings}- <form role=form method=POST action=@{r} enctype=#{enctype}>- <input name="_method" type="hidden" value="PATCH" />- ^{fWidget}+ <div .form-toggle-wrapper>+ <h2 .form-toggle data-expanded=false>_{Msg.ChangeMediaSettings}+ <form role=form method=POST action=@{r} enctype=#{enctype}>+ <input name="_method" type="hidden" value="PATCH" />+ ^{fWidget} $maybe r <- can (mediaR $ MediaAdminRenameR fileId) "PATCH"- <h2>_{Msg.ChangeFilename}- <form role=form method=POST action=@{r} enctype=#{rEnctype}>- <input name="_method" type="hidden" value="PATCH" />- ^{rfWidget}+ <div .form-toggle-wrapper>+ <h2 .form-toggle data-expanded=false>_{Msg.ChangeFilename}+ <form role=form method=POST action=@{r} enctype=#{rEnctype}>+ <input name="_method" type="hidden" value="PATCH" />+ ^{rfWidget}
templates/index.hamlet view
@@ -7,7 +7,7 @@ <div .page-header> <h1>_{Msg.MediaIndex} $maybe r <- can (mediaR MediaAdminNewR) "GET"- <a .btn .btn-primary href=@{r}>+ <a .btn .btn-primary .btn-xs href=@{r}> <span .glyphicon .glyphicon-plus> _{Msg.AddMedia} <div .row>@@ -19,16 +19,8 @@ $forall (Entity fileId file) <- files <div .col-xs-6 .col-md-3 .col-lg-2> $with mroute <- can (mediaR $ MediaAdminEditR fileId) "GET"- <div .panel .panel-default :isJust mroute:onclick="document.location.href='@{fromJust mroute}'">- <div .panel-body .gallery-panel-body>- $if isImageFile file- ^{mediaImg file ["img-responsive", "img-rounded"] []}- $elseif isApplicationFile file- _{Msg.CantDisplayFileType}- $else- _{Msg.UnknownFileType}- <div .panel-footer>- $maybe r <- mroute- <a href=@{r}>#{mediaLabel file}- $nothing- #{mediaLabel file}+ $maybe r <- mroute+ <a href=@{r}>+ ^{indexItem file mroute}+ $nothing+ ^{indexItem file mroute}
+ templates/index_item.hamlet view
@@ -0,0 +1,13 @@+<div .panel .panel-default>+ <div .panel-body .gallery-panel-body>+ $if isImageFile file+ ^{mediaImg file ["img-responsive", "img-rounded"] []}+ $elseif isApplicationFile file+ _{Msg.CantDisplayFileType}+ $else+ _{Msg.UnknownFileType}+ <div .panel-footer>+ $maybe r <- mroute+ <a href=@{r}>#{mediaLabel file}+ $nothing+ #{mediaLabel file}