angular-file-drop
Version:
83 lines (68 loc) • 1.97 kB
text/coffeescript
app = angular.module 'ngFileDrop', []
app.directive 'dropZone', ->
restrict: 'A'
link: (scope, element, attrs) ->
element = $(element[0])
outputType = attrs.outputType || 'dataURI'
dragClassName = attrs.dragClass || 'dragging'
$("body").append '<input type=file style="display: none" class="__dropZoneInput">'
element[0].addEventListener 'dragover', (event) ->
event.preventDefault()
event.stopPropagation()
element.addClass dragClassName
element[0].addEventListener 'dragleave', (event) ->
event.preventDefault()
event.stopPropagation()
element.removeClass dragClassName
element[0].addEventListener 'drop', (e) ->
event.preventDefault()
event.stopPropagation()
element.removeClass dragClassName
files = e.dataTransfer.files
handleFiles files
$(".__dropZoneInput").on 'change', ->
files = @files
handleFiles files
element.click ->
$(".__dropZoneInput").click()
handleFiles = (files) ->
reader = new FileReader
if outputType == 'dataURI'
reader.readAsDataURL files[0]
else if outputType == 'ArrayBuffer'
reader.readAsArrayBuffer files[0]
else if outputType == 'File'
scope.$apply ->
scope.file = files[0]
reader.onload = (res) ->
scope.$apply ->
scope.file = res.target.result
count = files.length
scope.$apply ->
scope.files = []
for file in files
reader = new FileReader
if outputType == 'dataURI'
reader.readAsDataURL file
else if outputType == 'ArrayBuffer'
reader.readAsArrayBuffer file
else if outputType == 'File'
scope.$apply ->
scope.files.push file
count--
if count == 0
scope.$apply ->
do scope.drop
reader.onload = (res) ->
scope.$apply ->
scope.files.push res.target.result
count--
if count == 0
scope.$apply ->
do scope.drop
scope:
file: '=file'
files: '=files'
drop: '=drop'