import { ObjectID } from 'bson' ;
import DOMPurify from 'dompurify' ;
const filesize = require ( 'filesize' ) ;
const prettyMilliseconds = require ( 'pretty-ms' ) ;
Template . attachmentsGalery . events ( {
'click .js-add-attachment' : Popup . open ( 'cardAttachments' ) ,
// If we let this event bubble, FlowRouter will handle it and empty the page
// content, see #101.
'click .js-download' ( event ) {
event . stopPropagation ( ) ;
} ,
'click .js-open-attachment-menu' : Popup . open ( 'attachmentActions' ) ,
} ) ;
Template . attachmentsGalery . helpers ( {
isBoardAdmin ( ) {
return Meteor . user ( ) . isBoardAdmin ( ) ;
} ,
fileSize ( size ) {
const ret = filesize ( size ) ;
return ret ;
} ,
sanitize ( value ) {
return DOMPurify . sanitize ( value ) ;
} ,
} ) ;
Template . cardAttachmentsPopup . onCreated ( function ( ) {
this . uploads = new ReactiveVar ( [ ] ) ;
} ) ;
Template . cardAttachmentsPopup . helpers ( {
getEstimateTime ( upload ) {
const ret = prettyMilliseconds ( upload . estimateTime . get ( ) ) ;
return ret ;
} ,
getEstimateSpeed ( upload ) {
const ret = filesize ( upload . estimateSpeed . get ( ) , { round : 0 } ) + "/s" ;
return ret ;
} ,
uploads ( ) {
return Template . instance ( ) . uploads . get ( ) ;
}
} ) ;
Renaissance
_,,ad8888888888bba,_
,ad88888I888888888888888ba,
,88888888I88888888888888888888a,
,d888888888I8888888888888888888888b,
d88888PP"""" ""YY88888888888888888888b,
,d88"'__,,--------,,,,.;ZZZY8888888888888,
,8IIl'" ;;l"ZZZIII8888888888,
,I88l;' ;lZZZZZ888III8888888,
,II88Zl;. ;llZZZZZ888888I888888,
,II888Zl;. .;;;;;lllZZZ888888I8888b
,II8888Z;; `;;;;;''llZZ8888888I8888,
II88888Z;' .;lZZZ8888888I888b
II88888Z; _,aaa, .,aaaaa,__.l;llZZZ88888888I888
II88888IZZZZZZZZZ, .ZZZZZZZZZZZZZZ;llZZ88888888I888,
II88888IZZ<'(@@>Z| |ZZZ<'(@@>ZZZZ;;llZZ888888888I88I
,II88888; `""" ;| |ZZ; `""" ;;llZ8888888888I888
II888888l `;; .;llZZ8888888888I888,
,II888888Z; ;;; .;;llZZZ8888888888I888I
III888888Zl; .., `;; ,;;lllZZZ88888888888I888
II88888888Z;;...;(_ _) ,;;;llZZZZ88888888888I888,
II88888888Zl;;;;;' `--'Z;. .,;;;;llZZZZ88888888888I888b
]I888888888Z;;;;' ";llllll;..;;;lllZZZZ88888888888I8888,
II888888888Zl.;;"Y88bd888P";;,..;lllZZZZZ88888888888I8888I
II8888888888Zl;.; `"PPP";;;,..;lllZZZZZZZ88888888888I88888
II888888888888Zl;;. `;;;l;;;;lllZZZZZZZZW88888888888I88888
`II8888888888888Zl;. ,;;lllZZZZZZZZWMZ88888888888I88888
II8888888888888888ZbaalllZZZZZZZZZWWMZZZ8888888888I888888,
`II88888888888888888b"WWZZZZZWWWMMZZZZZZI888888888I888888b
`II88888888888888888;ZZMMMMMMZZZZZZZZllI888888888I8888888
`II8888888888888888 `;lZZZZZZZZZZZlllll888888888I8888888,
II8888888888888888, `;lllZZZZllllll;;.Y88888888I8888888b,
,II8888888888888888b .;;lllllll;;;.;..88888888I88888888b,
II888888888888888PZI;. .`;;;.;;;..; ...88888888I8888888888,
II888888888888PZ;;';;. ;. .;. .;. .. Y8888888I88888888888b,
,II888888888PZ;;' `8888888I8888888888888b,
II888888888' 888888I8888888888888888
,II888888888 ,888888I8888888888888888
,d88888888888 d888888I8888888888ZZZZZZ
,ad888888888888I 8888888I8888ZZZZZZZZZZZZ
888888888888888' 888888IZZZZZZZZZZZZZZZZZ
8888888888P'8P' Y888ZZZZZZZZZZZZZZZZZZZZ
888888888, " ,ZZZZZZZZZZZZZZZZZZZZZZZ
8888888888, ,ZZZZZZZZZZZZZZZZZZZZZZZZZZ
888888888888a, _ ,ZZZZZZZZZZZZZZZZZZZZ88888888
888888888888888ba,_d' ,ZZZZZZZZZZZZZZZZZ8888888888888
8888888888888888888888bbbaaa,,,______,ZZZZZZZZZZZZZZZ88888888888888888
88888888888888888888888888888888888ZZZZZZZZZZZZZZZ88888888888888888888
8888888888888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888888
888888888888888888888888888888888ZZZZZZZZZZZZZZ88888888888888888888888
8888888888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888888888
88888888888888888888888888888ZZZZZZZZZZZZZZ888888888888888888888888888
8888888888888888888888888888ZZZZZZZZZZZZZZ88888888888888888 Normand 8
88888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888 Veilleux 8
8888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888888888888888
11 years ago
Template . cardAttachmentsPopup . events ( {
'change .js-attach-file' ( event , templateInstance ) {
const card = this ;
const files = event . currentTarget . files ;
if ( files ) {
let uploads = [ ] ;
for ( const file of files ) {
const fileId = new ObjectID ( ) . toString ( ) ;
// If filename is not same as sanitized filename, has XSS, then cancel upload
if ( file . name !== DOMPurify . sanitize ( file . name ) ) {
return false ;
}
const config = {
file : file ,
fileId : fileId ,
meta : Utils . getCommonAttachmentMetaFrom ( card ) ,
chunkSize : 'dynamic' ,
} ;
config . meta . fileId = fileId ;
const uploader = Attachments . insert (
config ,
false ,
) ;
uploader . on ( 'start' , function ( ) {
uploads . push ( this ) ;
templateInstance . uploads . set ( uploads ) ;
} ) ;
uploader . on ( 'uploaded' , ( error , fileRef ) => {
if ( ! error ) {
if ( fileRef . isImage ) {
card . setCover ( fileRef . _id ) ;
}
}
} ) ;
uploader . on ( 'end' , ( error , fileRef ) => {
uploads = uploads . filter ( _upload => _upload . config . fileId != fileRef . _id ) ;
templateInstance . uploads . set ( uploads ) ;
if ( uploads . length == 0 ) {
Popup . back ( ) ;
}
} ) ;
uploader . start ( ) ;
}
}
Renaissance
_,,ad8888888888bba,_
,ad88888I888888888888888ba,
,88888888I88888888888888888888a,
,d888888888I8888888888888888888888b,
d88888PP"""" ""YY88888888888888888888b,
,d88"'__,,--------,,,,.;ZZZY8888888888888,
,8IIl'" ;;l"ZZZIII8888888888,
,I88l;' ;lZZZZZ888III8888888,
,II88Zl;. ;llZZZZZ888888I888888,
,II888Zl;. .;;;;;lllZZZ888888I8888b
,II8888Z;; `;;;;;''llZZ8888888I8888,
II88888Z;' .;lZZZ8888888I888b
II88888Z; _,aaa, .,aaaaa,__.l;llZZZ88888888I888
II88888IZZZZZZZZZ, .ZZZZZZZZZZZZZZ;llZZ88888888I888,
II88888IZZ<'(@@>Z| |ZZZ<'(@@>ZZZZ;;llZZ888888888I88I
,II88888; `""" ;| |ZZ; `""" ;;llZ8888888888I888
II888888l `;; .;llZZ8888888888I888,
,II888888Z; ;;; .;;llZZZ8888888888I888I
III888888Zl; .., `;; ,;;lllZZZ88888888888I888
II88888888Z;;...;(_ _) ,;;;llZZZZ88888888888I888,
II88888888Zl;;;;;' `--'Z;. .,;;;;llZZZZ88888888888I888b
]I888888888Z;;;;' ";llllll;..;;;lllZZZZ88888888888I8888,
II888888888Zl.;;"Y88bd888P";;,..;lllZZZZZ88888888888I8888I
II8888888888Zl;.; `"PPP";;;,..;lllZZZZZZZ88888888888I88888
II888888888888Zl;;. `;;;l;;;;lllZZZZZZZZW88888888888I88888
`II8888888888888Zl;. ,;;lllZZZZZZZZWMZ88888888888I88888
II8888888888888888ZbaalllZZZZZZZZZWWMZZZ8888888888I888888,
`II88888888888888888b"WWZZZZZWWWMMZZZZZZI888888888I888888b
`II88888888888888888;ZZMMMMMMZZZZZZZZllI888888888I8888888
`II8888888888888888 `;lZZZZZZZZZZZlllll888888888I8888888,
II8888888888888888, `;lllZZZZllllll;;.Y88888888I8888888b,
,II8888888888888888b .;;lllllll;;;.;..88888888I88888888b,
II888888888888888PZI;. .`;;;.;;;..; ...88888888I8888888888,
II888888888888PZ;;';;. ;. .;. .;. .. Y8888888I88888888888b,
,II888888888PZ;;' `8888888I8888888888888b,
II888888888' 888888I8888888888888888
,II888888888 ,888888I8888888888888888
,d88888888888 d888888I8888888888ZZZZZZ
,ad888888888888I 8888888I8888ZZZZZZZZZZZZ
888888888888888' 888888IZZZZZZZZZZZZZZZZZ
8888888888P'8P' Y888ZZZZZZZZZZZZZZZZZZZZ
888888888, " ,ZZZZZZZZZZZZZZZZZZZZZZZ
8888888888, ,ZZZZZZZZZZZZZZZZZZZZZZZZZZ
888888888888a, _ ,ZZZZZZZZZZZZZZZZZZZZ88888888
888888888888888ba,_d' ,ZZZZZZZZZZZZZZZZZ8888888888888
8888888888888888888888bbbaaa,,,______,ZZZZZZZZZZZZZZZ88888888888888888
88888888888888888888888888888888888ZZZZZZZZZZZZZZZ88888888888888888888
8888888888888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888888
888888888888888888888888888888888ZZZZZZZZZZZZZZ88888888888888888888888
8888888888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888888888
88888888888888888888888888888ZZZZZZZZZZZZZZ888888888888888888888888888
8888888888888888888888888888ZZZZZZZZZZZZZZ88888888888888888 Normand 8
88888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888 Veilleux 8
8888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888888888888888
11 years ago
} ,
'click .js-computer-upload' ( event , templateInstance ) {
templateInstance . find ( '.js-attach-file' ) . click ( ) ;
event . preventDefault ( ) ;
} ,
'click .js-upload-clipboard-image' : Popup . open ( 'previewClipboardImage' ) ,
} ) ;
const MAX _IMAGE _PIXEL = Utils . MAX _IMAGE _PIXEL ;
const COMPRESS _RATIO = Utils . IMAGE _COMPRESS _RATIO ;
let pastedResults = null ;
Template . previewClipboardImagePopup . onRendered ( ( ) => {
// we can paste image from clipboard
const handle = results => {
if ( results . dataURL . startsWith ( 'data:image/' ) ) {
const direct = results => {
$ ( 'img.preview-clipboard-image' ) . attr ( 'src' , results . dataURL ) ;
pastedResults = results ;
} ;
if ( MAX _IMAGE _PIXEL ) {
// if has size limitation on image we shrink it before uploading
Utils . shrinkImage ( {
dataurl : results . dataURL ,
maxSize : MAX _IMAGE _PIXEL ,
ratio : COMPRESS _RATIO ,
callback ( changed ) {
if ( changed !== false && ! ! changed ) {
results . dataURL = changed ;
}
direct ( results ) ;
} ,
} ) ;
} else {
direct ( results ) ;
}
}
} ;
$ ( document . body ) . pasteImageReader ( handle ) ;
// we can also drag & drop image file to it
$ ( document . body ) . dropImageReader ( handle ) ;
} ) ;
Template . previewClipboardImagePopup . events ( {
'click .js-upload-pasted-image' ( ) {
const card = this ;
if ( pastedResults && pastedResults . file ) {
const file = pastedResults . file ;
window . oPasted = pastedResults ;
const fileId = new ObjectID ( ) . toString ( ) ;
const config = {
file ,
fileId : fileId ,
meta : Utils . getCommonAttachmentMetaFrom ( card ) ,
fileName : file . name || file . type . replace ( 'image/' , 'clipboard.' ) ,
chunkSize : 'dynamic' ,
} ;
config . meta . fileId = fileId ;
const uploader = Attachments . insert (
config ,
false ,
) ;
uploader . on ( 'uploaded' , ( error , fileRef ) => {
if ( ! error ) {
if ( fileRef . isImage ) {
card . setCover ( fileRef . _id ) ;
}
}
} ) ;
uploader . on ( 'end' , ( error , fileRef ) => {
pastedResults = null ;
$ ( document . body ) . pasteImageReader ( ( ) => { } ) ;
Popup . back ( ) ;
} ) ;
uploader . start ( ) ;
}
} ,
Renaissance
_,,ad8888888888bba,_
,ad88888I888888888888888ba,
,88888888I88888888888888888888a,
,d888888888I8888888888888888888888b,
d88888PP"""" ""YY88888888888888888888b,
,d88"'__,,--------,,,,.;ZZZY8888888888888,
,8IIl'" ;;l"ZZZIII8888888888,
,I88l;' ;lZZZZZ888III8888888,
,II88Zl;. ;llZZZZZ888888I888888,
,II888Zl;. .;;;;;lllZZZ888888I8888b
,II8888Z;; `;;;;;''llZZ8888888I8888,
II88888Z;' .;lZZZ8888888I888b
II88888Z; _,aaa, .,aaaaa,__.l;llZZZ88888888I888
II88888IZZZZZZZZZ, .ZZZZZZZZZZZZZZ;llZZ88888888I888,
II88888IZZ<'(@@>Z| |ZZZ<'(@@>ZZZZ;;llZZ888888888I88I
,II88888; `""" ;| |ZZ; `""" ;;llZ8888888888I888
II888888l `;; .;llZZ8888888888I888,
,II888888Z; ;;; .;;llZZZ8888888888I888I
III888888Zl; .., `;; ,;;lllZZZ88888888888I888
II88888888Z;;...;(_ _) ,;;;llZZZZ88888888888I888,
II88888888Zl;;;;;' `--'Z;. .,;;;;llZZZZ88888888888I888b
]I888888888Z;;;;' ";llllll;..;;;lllZZZZ88888888888I8888,
II888888888Zl.;;"Y88bd888P";;,..;lllZZZZZ88888888888I8888I
II8888888888Zl;.; `"PPP";;;,..;lllZZZZZZZ88888888888I88888
II888888888888Zl;;. `;;;l;;;;lllZZZZZZZZW88888888888I88888
`II8888888888888Zl;. ,;;lllZZZZZZZZWMZ88888888888I88888
II8888888888888888ZbaalllZZZZZZZZZWWMZZZ8888888888I888888,
`II88888888888888888b"WWZZZZZWWWMMZZZZZZI888888888I888888b
`II88888888888888888;ZZMMMMMMZZZZZZZZllI888888888I8888888
`II8888888888888888 `;lZZZZZZZZZZZlllll888888888I8888888,
II8888888888888888, `;lllZZZZllllll;;.Y88888888I8888888b,
,II8888888888888888b .;;lllllll;;;.;..88888888I88888888b,
II888888888888888PZI;. .`;;;.;;;..; ...88888888I8888888888,
II888888888888PZ;;';;. ;. .;. .;. .. Y8888888I88888888888b,
,II888888888PZ;;' `8888888I8888888888888b,
II888888888' 888888I8888888888888888
,II888888888 ,888888I8888888888888888
,d88888888888 d888888I8888888888ZZZZZZ
,ad888888888888I 8888888I8888ZZZZZZZZZZZZ
888888888888888' 888888IZZZZZZZZZZZZZZZZZ
8888888888P'8P' Y888ZZZZZZZZZZZZZZZZZZZZ
888888888, " ,ZZZZZZZZZZZZZZZZZZZZZZZ
8888888888, ,ZZZZZZZZZZZZZZZZZZZZZZZZZZ
888888888888a, _ ,ZZZZZZZZZZZZZZZZZZZZ88888888
888888888888888ba,_d' ,ZZZZZZZZZZZZZZZZZ8888888888888
8888888888888888888888bbbaaa,,,______,ZZZZZZZZZZZZZZZ88888888888888888
88888888888888888888888888888888888ZZZZZZZZZZZZZZZ88888888888888888888
8888888888888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888888
888888888888888888888888888888888ZZZZZZZZZZZZZZ88888888888888888888888
8888888888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888888888
88888888888888888888888888888ZZZZZZZZZZZZZZ888888888888888888888888888
8888888888888888888888888888ZZZZZZZZZZZZZZ88888888888888888 Normand 8
88888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888 Veilleux 8
8888888888888888888888888ZZZZZZZZZZZZZZ8888888888888888888888888888888
11 years ago
} ) ;
BlazeComponent . extendComponent ( {
isCover ( ) {
const ret = Cards . findOne ( this . data ( ) . meta . cardId ) . coverId == this . data ( ) . _id ;
return ret ;
} ,
isBackgroundImage ( ) {
//const currentBoard = Boards.findOne(Session.get('currentBoard'));
//return currentBoard.backgroundImageURL === $(".attachment-thumbnail-img").attr("src");
return false ;
} ,
events ( ) {
return [
{
'click .js-rename' : Popup . open ( 'attachmentRename' ) ,
'click .js-confirm-delete' : Popup . afterConfirm ( 'attachmentDelete' , function ( ) {
Attachments . remove ( this . _id ) ;
Popup . back ( 2 ) ;
} ) ,
'click .js-add-cover' ( ) {
Cards . findOne ( this . data ( ) . meta . cardId ) . setCover ( this . data ( ) . _id ) ;
Popup . back ( ) ;
} ,
'click .js-remove-cover' ( ) {
Cards . findOne ( this . data ( ) . meta . cardId ) . unsetCover ( ) ;
Popup . back ( ) ;
} ,
'click .js-add-background-image' ( ) {
Utils . setBackgroundImage ( $ ( ".attachment-thumbnail-img" ) . attr ( "src" ) ) ;
Popup . back ( ) ;
event . preventDefault ( ) ;
} ,
'click .js-remove-background-image' ( ) {
const currentBoard = Boards . findOne ( Session . get ( 'currentBoard' ) ) ;
currentBoard . setBackgroundImageURL ( "" ) ;
Utils . setBackgroundImage ( ) ;
Popup . back ( ) ;
Utils . reload ( ) ;
event . preventDefault ( ) ;
} ,
'click .js-move-storage-fs' ( ) {
Meteor . call ( 'moveAttachmentToStorage' , this . data ( ) . _id , "fs" ) ;
Popup . back ( ) ;
} ,
'click .js-move-storage-gridfs' ( ) {
Meteor . call ( 'moveAttachmentToStorage' , this . data ( ) . _id , "gridfs" ) ;
Popup . back ( ) ;
} ,
'click .js-move-storage-s3' ( ) {
Meteor . call ( 'moveAttachmentToStorage' , this . data ( ) . _id , "s3" ) ;
Popup . back ( ) ;
} ,
}
]
}
} ) . register ( 'attachmentActionsPopup' ) ;
BlazeComponent . extendComponent ( {
getNameWithoutExtension ( ) {
const ret = this . data ( ) . name . replace ( new RegExp ( "\." + this . data ( ) . extension + "$" ) , "" ) ;
return ret ;
} ,
events ( ) {
return [
{
'keydown input.js-edit-attachment-name' ( evt ) {
// enter = save
if ( evt . keyCode === 13 ) {
this . find ( 'button[type=submit]' ) . click ( ) ;
}
} ,
'click button.js-submit-edit-attachment-name' ( event ) {
// save button pressed
event . preventDefault ( ) ;
const name = this . $ ( '.js-edit-attachment-name' ) [ 0 ]
. value
. trim ( ) + this . data ( ) . extensionWithDot ;
if ( name === DOMPurify . sanitize ( name ) ) {
Meteor . call ( 'renameAttachment' , this . data ( ) . _id , name ) ;
}
Popup . back ( 2 ) ;
} ,
}
]
}
} ) . register ( 'attachmentRenamePopup' ) ;