ecm_pictures2_backend 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +37 -0
- data/Rakefile +21 -0
- data/app/assets/javascripts/ecm/pictures/backend/application/camera.coffee +39 -0
- data/app/assets/javascripts/ecm/pictures/backend/application.js +14 -0
- data/app/assets/javascripts/ecm/pictures/backend/vendor/webcam.min.js +2 -0
- data/app/assets/javascripts/ecm_pictures_backend.js +1 -0
- data/app/assets/stylesheets/ecm/pictures/backend/application/thumbnails_selected.css +16 -0
- data/app/assets/stylesheets/ecm/pictures/backend/application.css +14 -0
- data/app/assets/stylesheets/ecm_pictures_backend.css +3 -0
- data/app/controllers/ecm/pictures/backend/application_controller.rb +8 -0
- data/app/controllers/ecm/pictures/backend/home_controller.rb +6 -0
- data/app/controllers/ecm/pictures/backend/picture_galleries_controller.rb +13 -0
- data/app/controllers/ecm/pictures/backend/pictures_controller.rb +31 -0
- data/app/helpers/ecm/pictures/backend/application_helper.rb +8 -0
- data/app/policies/ecm/pictures/backend/engine_policy.rb +4 -0
- data/app/policies/ecm/pictures/picture_gallery_policy.rb +4 -0
- data/app/policies/ecm/pictures/picture_policy.rb +4 -0
- data/app/views/ecm/pictures/backend/picture_galleries/_form.html.haml +16 -0
- data/app/views/ecm/pictures/backend/picture_galleries/_show.haml +11 -0
- data/app/views/ecm/pictures/backend/picture_galleries/_show_extras.haml +2 -0
- data/app/views/ecm/pictures/backend/picture_galleries/_table.html.haml +6 -0
- data/app/views/ecm/pictures/backend/pictures/_form.html.haml +26 -0
- data/app/views/ecm/pictures/backend/pictures/_show.html.haml +14 -0
- data/app/views/ecm/pictures/backend/pictures/_table.html.haml +7 -0
- data/app/views/layouts/ecm/pictures/backend/application.html.erb +14 -0
- data/config/locales/de.yml +6 -0
- data/config/rbac.yml +40 -0
- data/config/routes.rb +6 -0
- data/lib/ecm/pictures/backend/configuration.rb +24 -0
- data/lib/ecm/pictures/backend/engine.rb +14 -0
- data/lib/ecm/pictures/backend/version.rb +7 -0
- data/lib/ecm/pictures/backend.rb +9 -0
- data/lib/ecm_pictures2_backend.rb +10 -0
- data/lib/generators/ecm/pictures/backend/install/install_generator.rb +33 -0
- data/lib/generators/ecm/pictures/backend/install/templates/initializer.rb +26 -0
- data/lib/generators/ecm/pictures/backend/install/templates/routes.source +4 -0
- data/lib/tasks/ecm/pictures/backend_tasks.rake +4 -0
- metadata +279 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7816402187850039bd201ccef238ddaba7ad1fcc
|
4
|
+
data.tar.gz: 8e6abde6636e277c054474d464f64880315b3e32
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6bd92263931aa6d247d3e26682520d0438a3ca252232e51075355c1671df6190487920cb6cd9224e7984696c994981cf55f34eb061a27278ecb425f50ad2121f
|
7
|
+
data.tar.gz: e47d78a1d1ec9ad3ea375648e410a93d6145d63a3d016543fe63bf904d4b5da1a3ddc64fac3c43fcaca531438d29b2a6fa428301a92120e583be5969afbbbb07
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2015 Roberto Vasquez Angel
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
= ECM Pictures 2 Backend
|
2
|
+
|
3
|
+
= Prerequisites
|
4
|
+
|
5
|
+
Install ecm_pictures2
|
6
|
+
|
7
|
+
= Installation
|
8
|
+
|
9
|
+
Add it to your Gemfile:
|
10
|
+
|
11
|
+
# Gemfile
|
12
|
+
gem 'route_translator'
|
13
|
+
gem 'itsf_backend'
|
14
|
+
gem 'ecm_pictures2_backend'
|
15
|
+
|
16
|
+
Generate the initializer, backend controller and routes:
|
17
|
+
|
18
|
+
rails g itsf:backend:install
|
19
|
+
rails g ecm:pictures:backend:install
|
20
|
+
|
21
|
+
Register the backend in the ITSF Backend configuration:
|
22
|
+
|
23
|
+
# config/initializers/itsf_backend.rb
|
24
|
+
Itsf::Backend.configure do |config|
|
25
|
+
config.backend_engines = [
|
26
|
+
Ecm::Pictures::Backend::Engine
|
27
|
+
]
|
28
|
+
end
|
29
|
+
|
30
|
+
= How to run specs
|
31
|
+
|
32
|
+
gem install bundler
|
33
|
+
bundle
|
34
|
+
cd spec/dummy && rake db:migrate RAILS_ENV=test && cd ../..
|
35
|
+
guard
|
36
|
+
|
37
|
+
This project rocks and uses MIT-LICENSE.
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Ecm::Pictures2::Backend'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
Bundler::GemHelper.install_tasks
|
19
|
+
|
20
|
+
require 'rails/dummy/tasks'
|
21
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
remove_overlays = (elements) ->
|
2
|
+
$(elements).removeClass('selected')
|
3
|
+
|
4
|
+
add_overlay = (element) ->
|
5
|
+
element.parent().toggleClass('selected')
|
6
|
+
|
7
|
+
take_snapshot = ->
|
8
|
+
Webcam.snap (data_uri) ->
|
9
|
+
$('#snapshots').append('<div class="col-xs-12 col-sm-6 col-md-4 col-lg-2"><img class="img-responsive thumbnail" data-onclick-copy-data-to="#ecm_pictures_picture_image_base64" src="'+data_uri+'"/><span class="glyphicon glyphicon-ok overlay" /></div>')
|
10
|
+
|
11
|
+
$ ->
|
12
|
+
$('[data-camera-toggle=true]').each (index) ->
|
13
|
+
button = $(@)
|
14
|
+
button.on 'click', ->
|
15
|
+
camera_container = $(@).data('camera-target')
|
16
|
+
$(camera_container).css('width', '640px')
|
17
|
+
$(camera_container).css('height', '480px')
|
18
|
+
Webcam.attach(camera_container)
|
19
|
+
false
|
20
|
+
|
21
|
+
$ ->
|
22
|
+
$('[data-capture-picture=true]').each (index) ->
|
23
|
+
button = $(@)
|
24
|
+
button.on 'click', ->
|
25
|
+
take_snapshot()
|
26
|
+
false
|
27
|
+
|
28
|
+
$ ->
|
29
|
+
$('#snapshots').on 'click', '[data-onclick-copy-data-to]', (e) ->
|
30
|
+
source = $(@)
|
31
|
+
source.on 'click', ->
|
32
|
+
target_id = $(@).attr('data-onclick-copy-data-to')
|
33
|
+
target = $(target_id)
|
34
|
+
# raw_image_data = source.attr('src').replace(/^data\:image\/\w+\;base64\,/, '')
|
35
|
+
raw_image_data = source.attr('src')
|
36
|
+
target.val(raw_image_data)
|
37
|
+
remove_overlays($(@).parent().parent().find('.selected'))
|
38
|
+
add_overlay($(@))
|
39
|
+
e.preventDefault
|
@@ -0,0 +1,14 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require_tree ./vendor
|
14
|
+
//= require_tree ./application
|
@@ -0,0 +1,2 @@
|
|
1
|
+
// WebcamJS v1.0.6 - http://github.com/jhuckaby/webcamjs - MIT Licensed
|
2
|
+
(function(e){var Webcam={version:"1.0.6",protocol:location.protocol.match(/https/i)?"https":"http",swfURL:"",loaded:false,live:false,userMedia:true,params:{width:0,height:0,dest_width:0,dest_height:0,image_format:"jpeg",jpeg_quality:90,force_flash:false,flip_horiz:false,fps:30,upload_name:"webcam",constraints:null},hooks:{},init:function(){var t=this;this.mediaDevices=navigator.mediaDevices&&navigator.mediaDevices.getUserMedia?navigator.mediaDevices:navigator.mozGetUserMedia||navigator.webkitGetUserMedia?{getUserMedia:function(e){return new Promise(function(t,a){(navigator.mozGetUserMedia||navigator.webkitGetUserMedia).call(navigator,e,t,a)})}}:null;e.URL=e.URL||e.webkitURL||e.mozURL||e.msURL;this.userMedia=this.userMedia&&!!this.mediaDevices&&!!e.URL;if(navigator.userAgent.match(/Firefox\D+(\d+)/)){if(parseInt(RegExp.$1,10)<21)this.userMedia=null}if(this.userMedia){e.addEventListener("beforeunload",function(e){t.reset()})}},attach:function(t){if(typeof t=="string"){t=document.getElementById(t)||document.querySelector(t)}if(!t){return this.dispatch("error","Could not locate DOM element to attach to.")}this.container=t;t.innerHTML="";var a=document.createElement("div");t.appendChild(a);this.peg=a;if(!this.params.width)this.params.width=t.offsetWidth;if(!this.params.height)this.params.height=t.offsetHeight;if(!this.params.dest_width)this.params.dest_width=this.params.width;if(!this.params.dest_height)this.params.dest_height=this.params.height;if(this.params.force_flash)this.userMedia=null;if(typeof this.params.fps!=="number")this.params.fps=30;var i=this.params.width/this.params.dest_width;var s=this.params.height/this.params.dest_height;if(this.userMedia){var r=document.createElement("video");r.setAttribute("autoplay","autoplay");r.style.width=""+this.params.dest_width+"px";r.style.height=""+this.params.dest_height+"px";if(i!=1||s!=1){t.style.overflow="hidden";r.style.webkitTransformOrigin="0px 0px";r.style.mozTransformOrigin="0px 0px";r.style.msTransformOrigin="0px 0px";r.style.oTransformOrigin="0px 0px";r.style.transformOrigin="0px 0px";r.style.webkitTransform="scaleX("+i+") scaleY("+s+")";r.style.mozTransform="scaleX("+i+") scaleY("+s+")";r.style.msTransform="scaleX("+i+") scaleY("+s+")";r.style.oTransform="scaleX("+i+") scaleY("+s+")";r.style.transform="scaleX("+i+") scaleY("+s+")"}t.appendChild(r);this.video=r;var o=this;this.mediaDevices.getUserMedia({audio:false,video:this.params.constraints||{mandatory:{minWidth:this.params.dest_width,minHeight:this.params.dest_height}}}).then(function(t){r.src=e.URL.createObjectURL(t)||t;o.stream=t;o.loaded=true;o.live=true;o.dispatch("load");o.dispatch("live");o.flip()}).catch(function(e){return o.dispatch("error","Could not access webcam: "+e.name+": "+e.message,e)})}else{e.Webcam=Webcam;var h=document.createElement("div");h.innerHTML=this.getSWFHTML();t.appendChild(h)}if(this.params.crop_width&&this.params.crop_height){var n=Math.floor(this.params.crop_width*i);var l=Math.floor(this.params.crop_height*s);t.style.width=""+n+"px";t.style.height=""+l+"px";t.style.overflow="hidden";t.scrollLeft=Math.floor(this.params.width/2-n/2);t.scrollTop=Math.floor(this.params.height/2-l/2)}else{t.style.width=""+this.params.width+"px";t.style.height=""+this.params.height+"px"}},reset:function(){if(this.preview_active)this.unfreeze();this.unflip();if(this.userMedia){if(this.stream){if(this.stream.getVideoTracks){var e=this.stream.getVideoTracks();if(e&&e[0]&&e[0].stop)e[0].stop()}else if(this.stream.stop){this.stream.stop()}}delete this.stream;delete this.video}if(this.userMedia!==true){this.getMovie()._releaseCamera()}if(this.container){this.container.innerHTML="";delete this.container}this.loaded=false;this.live=false},set:function(){if(arguments.length==1){for(var e in arguments[0]){this.params[e]=arguments[0][e]}}else{this.params[arguments[0]]=arguments[1]}},on:function(e,t){e=e.replace(/^on/i,"").toLowerCase();if(!this.hooks[e])this.hooks[e]=[];this.hooks[e].push(t)},off:function(e,t){e=e.replace(/^on/i,"").toLowerCase();if(this.hooks[e]){if(t){var a=this.hooks[e].indexOf(t);if(a>-1)this.hooks[e].splice(a,1)}else{this.hooks[e]=[]}}},dispatch:function(){var t=arguments[0].replace(/^on/i,"").toLowerCase();var a=Array.prototype.slice.call(arguments,1);if(this.hooks[t]&&this.hooks[t].length){for(var i=0,s=this.hooks[t].length;i<s;i++){var r=this.hooks[t][i];if(typeof r=="function"){r.apply(this,a)}else if(typeof r=="object"&&r.length==2){r[0][r[1]].apply(r[0],a)}else if(e[r]){e[r].apply(e,a)}}return true}else if(t=="error"){alert("Webcam.js Error: "+a[0])}return false},setSWFLocation:function(e){this.swfURL=e},detectFlash:function(){var t="Shockwave Flash",a="ShockwaveFlash.ShockwaveFlash",i="application/x-shockwave-flash",s=e,r=navigator,o=false;if(typeof r.plugins!=="undefined"&&typeof r.plugins[t]==="object"){var h=r.plugins[t].description;if(h&&(typeof r.mimeTypes!=="undefined"&&r.mimeTypes[i]&&r.mimeTypes[i].enabledPlugin)){o=true}}else if(typeof s.ActiveXObject!=="undefined"){try{var n=new ActiveXObject(a);if(n){var l=n.GetVariable("$version");if(l)o=true}}catch(c){}}return o},getSWFHTML:function(){var t="";if(location.protocol.match(/file/)){this.dispatch("error","Flash does not work from local disk. Please run from a web server.");return'<h3 style="color:red">ERROR: the Webcam.js Flash fallback does not work from local disk. Please run it from a web server.</h3>'}if(!this.detectFlash()){this.dispatch("error","Adobe Flash Player not found. Please install from get.adobe.com/flashplayer and try again.");return'<h3 style="color:red">ERROR: No Adobe Flash Player detected. Webcam.js relies on Flash for browsers that do not support getUserMedia (like yours).</h3>'}if(!this.swfURL){var a="";var i=document.getElementsByTagName("script");for(var s=0,r=i.length;s<r;s++){var o=i[s].getAttribute("src");if(o&&o.match(/\/webcam(\.min)?\.js/)){a=o.replace(/\/webcam(\.min)?\.js.*$/,"");s=r}}if(a)this.swfURL=a+"/webcam.swf";else this.swfURL="webcam.swf"}if(e.localStorage&&!localStorage.getItem("visited")){this.params.new_user=1;localStorage.setItem("visited",1)}var h="";for(var n in this.params){if(h)h+="&";h+=n+"="+escape(this.params[n])}t+='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" type="application/x-shockwave-flash" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+this.params.width+'" height="'+this.params.height+'" id="webcam_movie_obj" align="middle"><param name="wmode" value="opaque" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+this.swfURL+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+h+'"/><embed id="webcam_movie_embed" src="'+this.swfURL+'" wmode="opaque" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+this.params.width+'" height="'+this.params.height+'" name="webcam_movie_embed" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+h+'"></embed></object>';return t},getMovie:function(){if(!this.loaded)return this.dispatch("error","Flash Movie is not loaded yet");var e=document.getElementById("webcam_movie_obj");if(!e||!e._snap)e=document.getElementById("webcam_movie_embed");if(!e)this.dispatch("error","Cannot locate Flash movie in DOM");return e},freeze:function(){var e=this;var t=this.params;if(this.preview_active)this.unfreeze();var a=this.params.width/this.params.dest_width;var i=this.params.height/this.params.dest_height;this.unflip();var s=t.crop_width||t.dest_width;var r=t.crop_height||t.dest_height;var o=document.createElement("canvas");o.width=s;o.height=r;var h=o.getContext("2d");this.preview_canvas=o;this.preview_context=h;if(a!=1||i!=1){o.style.webkitTransformOrigin="0px 0px";o.style.mozTransformOrigin="0px 0px";o.style.msTransformOrigin="0px 0px";o.style.oTransformOrigin="0px 0px";o.style.transformOrigin="0px 0px";o.style.webkitTransform="scaleX("+a+") scaleY("+i+")";o.style.mozTransform="scaleX("+a+") scaleY("+i+")";o.style.msTransform="scaleX("+a+") scaleY("+i+")";o.style.oTransform="scaleX("+a+") scaleY("+i+")";o.style.transform="scaleX("+a+") scaleY("+i+")"}this.snap(function(){o.style.position="relative";o.style.left=""+e.container.scrollLeft+"px";o.style.top=""+e.container.scrollTop+"px";e.container.insertBefore(o,e.peg);e.container.style.overflow="hidden";e.preview_active=true},o)},unfreeze:function(){if(this.preview_active){this.container.removeChild(this.preview_canvas);delete this.preview_context;delete this.preview_canvas;this.preview_active=false;this.flip()}},flip:function(){if(this.params.flip_horiz){var e=this.container.style;e.webkitTransform="scaleX(-1)";e.mozTransform="scaleX(-1)";e.msTransform="scaleX(-1)";e.oTransform="scaleX(-1)";e.transform="scaleX(-1)";e.filter="FlipH";e.msFilter="FlipH"}},unflip:function(){if(this.params.flip_horiz){var e=this.container.style;e.webkitTransform="scaleX(1)";e.mozTransform="scaleX(1)";e.msTransform="scaleX(1)";e.oTransform="scaleX(1)";e.transform="scaleX(1)";e.filter="";e.msFilter=""}},savePreview:function(e,t){var a=this.params;var i=this.preview_canvas;var s=this.preview_context;if(t){var r=t.getContext("2d");r.drawImage(i,0,0)}e(t?null:i.toDataURL("image/"+a.image_format,a.jpeg_quality/100),i,s);this.unfreeze()},snap:function(e,t){var a=this;var i=this.params;if(!this.loaded)return this.dispatch("error","Webcam is not loaded yet");if(!e)return this.dispatch("error","Please provide a callback function or canvas to snap()");if(this.preview_active){this.savePreview(e,t);return null}var s=document.createElement("canvas");s.width=this.params.dest_width;s.height=this.params.dest_height;var r=s.getContext("2d");if(this.params.flip_horiz){r.translate(i.dest_width,0);r.scale(-1,1)}var o=function(){if(this.src&&this.width&&this.height){r.drawImage(this,0,0,i.dest_width,i.dest_height)}if(i.crop_width&&i.crop_height){var a=document.createElement("canvas");a.width=i.crop_width;a.height=i.crop_height;var o=a.getContext("2d");o.drawImage(s,Math.floor(i.dest_width/2-i.crop_width/2),Math.floor(i.dest_height/2-i.crop_height/2),i.crop_width,i.crop_height,0,0,i.crop_width,i.crop_height);r=o;s=a}if(t){var h=t.getContext("2d");h.drawImage(s,0,0)}e(t?null:s.toDataURL("image/"+i.image_format,i.jpeg_quality/100),s,r)};if(this.userMedia){r.drawImage(this.video,0,0,this.params.dest_width,this.params.dest_height);o()}else{var h=this.getMovie()._snap();var n=new Image;n.onload=o;n.src="data:image/"+this.params.image_format+";base64,"+h}return null},configure:function(e){if(!e)e="camera";this.getMovie()._configure(e)},flashNotify:function(e,t){switch(e){case"flashLoadComplete":this.loaded=true;this.dispatch("load");break;case"cameraLive":this.live=true;this.dispatch("live");this.flip();break;case"error":this.dispatch("error",t);break;default:break}},b64ToUint6:function(e){return e>64&&e<91?e-65:e>96&&e<123?e-71:e>47&&e<58?e+4:e===43?62:e===47?63:0},base64DecToArr:function(e,t){var a=e.replace(/[^A-Za-z0-9\+\/]/g,""),i=a.length,s=t?Math.ceil((i*3+1>>2)/t)*t:i*3+1>>2,r=new Uint8Array(s);for(var o,h,n=0,l=0,c=0;c<i;c++){h=c&3;n|=this.b64ToUint6(a.charCodeAt(c))<<18-6*h;if(h===3||i-c===1){for(o=0;o<3&&l<s;o++,l++){r[l]=n>>>(16>>>o&24)&255}n=0}}return r},upload:function(e,t,a){var i=this.params.upload_name||"webcam";var s="";if(e.match(/^data\:image\/(\w+)/))s=RegExp.$1;else throw"Cannot locate image format in Data URI";var r=e.replace(/^data\:image\/\w+\;base64\,/,"");var o=new XMLHttpRequest;o.open("POST",t,true);if(o.upload&&o.upload.addEventListener){o.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=e.loaded/e.total;Webcam.dispatch("uploadProgress",t,e)}},false)}var h=this;o.onload=function(){if(a)a.apply(h,[o.status,o.responseText,o.statusText]);Webcam.dispatch("uploadComplete",o.status,o.responseText,o.statusText)};var n=new Blob([this.base64DecToArr(r)],{type:"image/"+s});var l=new FormData;l.append(i,n,i+"."+s.replace(/e/,""));o.send(l)}};Webcam.init();if(typeof define==="function"&&define.amd){define(function(){return Webcam})}else if(typeof module==="object"&&module.exports){module.exports=Webcam}else{e.Webcam=Webcam}})(window);
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require ecm/pictures/backend/application
|
@@ -0,0 +1,16 @@
|
|
1
|
+
!div.selected > .thumbnail {
|
2
|
+
display: relative;
|
3
|
+
}
|
4
|
+
|
5
|
+
.glyphicon.overlay {
|
6
|
+
position: absolute;
|
7
|
+
top: 15px;
|
8
|
+
left: 30px;
|
9
|
+
font-size: 20px;
|
10
|
+
color: green;
|
11
|
+
display: none;
|
12
|
+
}
|
13
|
+
|
14
|
+
div.selected > .glyphicon.overlay {
|
15
|
+
display: inline-block;
|
16
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
+
* files in this directory. It is generally better to create a new file per style scope.
|
11
|
+
*
|
12
|
+
*= require_tree ./application
|
13
|
+
*= require_self
|
14
|
+
*/
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Ecm::Pictures::Backend::PictureGalleriesController < Itsf::Backend::Resource::BaseController
|
2
|
+
def self.resource_class
|
3
|
+
Ecm::Pictures::PictureGallery
|
4
|
+
end
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def permitted_params
|
9
|
+
params
|
10
|
+
.require(:ecm_pictures_picture_gallery)
|
11
|
+
.permit(:name, :markup_language, :description, :link_images, :tag_list, picture_images: [])
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Ecm::Pictures::Backend::PicturesController < Itsf::Backend::Resource::BaseController
|
2
|
+
def self.resource_class
|
3
|
+
Ecm::Pictures::Picture
|
4
|
+
end
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def request_includes_base64_image?
|
9
|
+
params[:ecm_pictures_picture].has_key?(:image_base64) && params[:ecm_pictures_picture][:image_base64].present?
|
10
|
+
end
|
11
|
+
|
12
|
+
def extract_base64
|
13
|
+
encoded_image = params[:ecm_pictures_picture].delete(:image_base64)
|
14
|
+
decoded_image = Base64.decode64(encoded_image.gsub(/^data\:image\/\w+\;base64\,/, '')).force_encoding('UTF-8')
|
15
|
+
content_type = encoded_image.split(";").first.split(":").last
|
16
|
+
basename = "image"
|
17
|
+
extension = ".jpg"
|
18
|
+
|
19
|
+
image = Tempfile.new([basename, extension])
|
20
|
+
image.write decoded_image
|
21
|
+
image.rewind
|
22
|
+
image
|
23
|
+
end
|
24
|
+
|
25
|
+
def permitted_params
|
26
|
+
permitted_params = params
|
27
|
+
.require(:ecm_pictures_picture)
|
28
|
+
.permit(:picture_gallery_id, :name, :markup_language, :description, :image, :tag_list)
|
29
|
+
permitted_params.merge(image: extract_base64) if request_includes_base64_image?
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
.well
|
2
|
+
= form.input :name
|
3
|
+
|
4
|
+
.well
|
5
|
+
= form.input :markup_language, collection: Ecm::Pictures::markup_languages
|
6
|
+
= form.input :description, input_html: { 'data-add-editor': true, 'data-editor-syntax': :textile }
|
7
|
+
|
8
|
+
.well
|
9
|
+
= form.input :link_images
|
10
|
+
|
11
|
+
.well
|
12
|
+
= form.input :picture_images, as: :file, input_html: { multiple: 'multiple' }
|
13
|
+
|
14
|
+
- if form.object.respond_to?(:tag_list)
|
15
|
+
.well
|
16
|
+
= form.input :tag_list, input_html: { value: form.object.tag_list.to_s }
|
@@ -0,0 +1,11 @@
|
|
1
|
+
= table.row :name
|
2
|
+
= table.row :description
|
3
|
+
= table.row :link_images?
|
4
|
+
= table.row :pictures_count
|
5
|
+
= table.row :position
|
6
|
+
= table.row :markup_language
|
7
|
+
= table.row :markup_language
|
8
|
+
= table.row :created_at
|
9
|
+
= table.row :updated_at
|
10
|
+
= table.row(:tenant, as: :association) if table.resource.respond_to?(:tenant)
|
11
|
+
= table.row(:tag_list) if table.resource.respond_to?(:tag_list)
|
@@ -0,0 +1,6 @@
|
|
1
|
+
= table.column :name, class: 'truncate-chars truncate-chars-30'
|
2
|
+
= table.column :description, class: 'truncate-chars truncate-chars-30'
|
3
|
+
= table.column :link_images
|
4
|
+
= table.column :pictures_count do |picture_gallery|
|
5
|
+
%span.label.label-default= picture_gallery.pictures_count
|
6
|
+
= table.timestamps
|
@@ -0,0 +1,26 @@
|
|
1
|
+
.well
|
2
|
+
= form.association :picture_gallery
|
3
|
+
|
4
|
+
.well
|
5
|
+
= form.input :name
|
6
|
+
|
7
|
+
.well
|
8
|
+
= form.input :markup_language, collection: Ecm::Pictures::markup_languages
|
9
|
+
= form.input :description, input_html: { 'data-add-editor': true, 'data-editor-syntax': :textile }
|
10
|
+
|
11
|
+
.well
|
12
|
+
= form.input :image
|
13
|
+
= image_tag(form.object.image.url(:default_thumb)) if form.object.image.present?
|
14
|
+
|
15
|
+
- if Ecm::Pictures::Backend::Configuration.enable_html5_camera_support
|
16
|
+
%input{ name: 'ecm_pictures_picture[image_base64]', type: 'hidden', id: 'ecm_pictures_picture_image_base64', value: '' }
|
17
|
+
.well
|
18
|
+
.bottom-margin-1
|
19
|
+
= link_to(t('.enable_camera'), '#', class: 'btn btn-primary', data: { 'camera-toggle': true, 'camera-target': '#camera' })
|
20
|
+
= link_to(t('.capture_picture'), '#', class: 'btn btn-primary', data: { 'capture-picture': true, 'camera-target': '#camera' })
|
21
|
+
#camera.bottom-margin-1
|
22
|
+
#snapshots.row
|
23
|
+
|
24
|
+
- if form.object.respond_to?(:tag_list)
|
25
|
+
.well
|
26
|
+
= form.input :tag_list, input_html: { value: form.object.tag_list.to_s }
|
@@ -0,0 +1,14 @@
|
|
1
|
+
= table.row :image, as: :image
|
2
|
+
= table.row :id
|
3
|
+
= table.row :picture_gallery, as: :association
|
4
|
+
= table.row :name
|
5
|
+
= table.row :description, as: :text, syntax: table.resource.markup_language
|
6
|
+
= table.row :image_file_name
|
7
|
+
= table.row :image_file_size
|
8
|
+
= table.row :image_content_type
|
9
|
+
= table.row :image_updated_at
|
10
|
+
= table.row :image_fingerprint
|
11
|
+
- if table.resource.respond_to?(:tag_list)
|
12
|
+
= table.row :tag_list
|
13
|
+
= table.row :created_at
|
14
|
+
= table.row :updated_at
|
@@ -0,0 +1,7 @@
|
|
1
|
+
= table.association :picture_gallery
|
2
|
+
= table.column(:preview_picture) do |picture|
|
3
|
+
%img.img-responsive.bottom-margin-2{ src: picture.image.url(:default_thumb) }
|
4
|
+
= table.column :name, class: 'truncate-chars truncate-chars-30'
|
5
|
+
= table.column :description, class: 'truncate-chars truncate-chars-30'
|
6
|
+
= table.column(:image_file_size) { |picture| number_to_human_size(picture.image_file_size) }
|
7
|
+
= table.timestamps
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Backend</title>
|
5
|
+
<%= stylesheet_link_tag "ecm/pictures/backend/application", media: "all" %>
|
6
|
+
<%= javascript_include_tag "ecm/pictures/backend/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
data/config/rbac.yml
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
defaults:
|
2
|
+
permissions:
|
3
|
+
- ecm/pictures/backend/engine
|
4
|
+
- ecm/pictures/picture_gallery/index
|
5
|
+
- ecm/pictures/picture_gallery/show
|
6
|
+
- ecm/pictures/picture_gallery/new
|
7
|
+
- ecm/pictures/picture_gallery/create
|
8
|
+
- ecm/pictures/picture_gallery/edit
|
9
|
+
- ecm/pictures/picture_gallery/update
|
10
|
+
- ecm/pictures/picture_gallery/destroy
|
11
|
+
- ecm/pictures/picture/index
|
12
|
+
- ecm/pictures/picture/show
|
13
|
+
- ecm/pictures/picture/new
|
14
|
+
- ecm/pictures/picture/create
|
15
|
+
- ecm/pictures/picture/edit
|
16
|
+
- ecm/pictures/picture/update
|
17
|
+
- ecm/pictures/picture/destroy
|
18
|
+
roles:
|
19
|
+
ecm/pictures/administrator:
|
20
|
+
- ecm/pictures/backend/engine
|
21
|
+
- ecm/pictures/picture_gallery/index
|
22
|
+
- ecm/pictures/picture_gallery/show
|
23
|
+
- ecm/pictures/picture_gallery/new
|
24
|
+
- ecm/pictures/picture_gallery/create
|
25
|
+
- ecm/pictures/picture_gallery/edit
|
26
|
+
- ecm/pictures/picture_gallery/update
|
27
|
+
- ecm/pictures/picture_gallery/destroy
|
28
|
+
- ecm/pictures/picture/index
|
29
|
+
- ecm/pictures/picture/show
|
30
|
+
- ecm/pictures/picture/new
|
31
|
+
- ecm/pictures/picture/create
|
32
|
+
- ecm/pictures/picture/edit
|
33
|
+
- ecm/pictures/picture/update
|
34
|
+
- ecm/pictures/picture/destroy
|
35
|
+
ecm/pictures/reviewer:
|
36
|
+
- ecm/pictures/backend/engine
|
37
|
+
- ecm/pictures/picture_gallery/index
|
38
|
+
- ecm/pictures/picture_gallery/show
|
39
|
+
- ecm/pictures/picture/index
|
40
|
+
- ecm/pictures/picture/show
|
data/config/routes.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'active_support/core_ext/module/delegation'
|
2
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
3
|
+
|
4
|
+
module Ecm
|
5
|
+
module Pictures
|
6
|
+
module Backend
|
7
|
+
module Configuration
|
8
|
+
def configure
|
9
|
+
yield self
|
10
|
+
end
|
11
|
+
|
12
|
+
mattr_accessor :registered_controllers do
|
13
|
+
-> {[]}
|
14
|
+
end
|
15
|
+
|
16
|
+
mattr_accessor :registered_services do
|
17
|
+
-> {[]}
|
18
|
+
end
|
19
|
+
|
20
|
+
mattr_accessor(:enable_html5_camera_support) { true }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Ecm
|
2
|
+
module Pictures
|
3
|
+
module Backend
|
4
|
+
class Engine < ::Rails::Engine
|
5
|
+
isolate_namespace Ecm::Pictures::Backend
|
6
|
+
|
7
|
+
initializer "ecm_pictures_backend.asset_pipeline" do |app|
|
8
|
+
app.config.assets.precompile << 'ecm_pictures_backend.js'
|
9
|
+
app.config.assets.precompile << 'ecm_pictures_backend.css'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Ecm
|
2
|
+
module Pictures
|
3
|
+
module Backend
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
6
|
+
desc 'Generates the intializer'
|
7
|
+
|
8
|
+
source_root File.expand_path('../templates', __FILE__)
|
9
|
+
|
10
|
+
def generate_initializer
|
11
|
+
copy_file 'initializer.rb', 'config/initializers/ecm_pictures_backend.rb'
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_routes
|
15
|
+
route File.read(File.join(File.expand_path('../templates', __FILE__), 'routes.source'))
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_to_itsf_backend
|
19
|
+
insert_into_itsf_backend_config(Ecm::Pictures::Backend::Engine)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def insert_into_itsf_backend_config(engine_name)
|
25
|
+
inject_into_file 'config/initializers/001_itsf_backend.rb', after: "config.backend_engines = %w(\n" do
|
26
|
+
" #{engine_name}\n"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Ecm::Pictures::Backend.configure do |config|
|
2
|
+
# Set the resources, that will be shown in the backend menu.
|
3
|
+
#
|
4
|
+
# Default: config.registered_controllers = -> {[
|
5
|
+
# Ecm::Pictures::Backend::PictureGalleriesController,
|
6
|
+
# Ecm::Pictures::Backend::PicturesController
|
7
|
+
# ]}
|
8
|
+
#
|
9
|
+
config.registered_controllers = -> {[
|
10
|
+
Ecm::Pictures::Backend::PictureGalleriesController,
|
11
|
+
Ecm::Pictures::Backend::PicturesController
|
12
|
+
]}
|
13
|
+
|
14
|
+
# Set the services, that will be shown in the backend menu.
|
15
|
+
#
|
16
|
+
# Default: config.registered_services = -> {[]}
|
17
|
+
#
|
18
|
+
config.registered_services = -> {[]}
|
19
|
+
|
20
|
+
# Enables HTML 5 camera support for taking pictures inside the
|
21
|
+
# picture new action.
|
22
|
+
#
|
23
|
+
# Default: config.enable_html5_camera_support = false
|
24
|
+
#
|
25
|
+
config.enable_html5_camera_support = false
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,279 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ecm_pictures2_backend
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Roberto Vasquez Angel
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-02-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ecm_news2
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: itsf_backend
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jpeg_camera
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rails-i18n
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: route_translator
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: coffee-rails
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: jquery-rails
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: therubyracer
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rails-dummy
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: sqlite3
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: i18n-debug
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: guard-bundler
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: guard-rails
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
description: Provides a ITSF Backend based Backend for ECM Pictures 2
|
210
|
+
email:
|
211
|
+
- roberto@vasquez-angel.de
|
212
|
+
executables: []
|
213
|
+
extensions: []
|
214
|
+
extra_rdoc_files: []
|
215
|
+
files:
|
216
|
+
- MIT-LICENSE
|
217
|
+
- README.rdoc
|
218
|
+
- Rakefile
|
219
|
+
- app/assets/javascripts/ecm/pictures/backend/application.js
|
220
|
+
- app/assets/javascripts/ecm/pictures/backend/application/camera.coffee
|
221
|
+
- app/assets/javascripts/ecm/pictures/backend/vendor/webcam.min.js
|
222
|
+
- app/assets/javascripts/ecm_pictures_backend.js
|
223
|
+
- app/assets/stylesheets/ecm/pictures/backend/application.css
|
224
|
+
- app/assets/stylesheets/ecm/pictures/backend/application/thumbnails_selected.css
|
225
|
+
- app/assets/stylesheets/ecm_pictures_backend.css
|
226
|
+
- app/controllers/ecm/pictures/backend/application_controller.rb
|
227
|
+
- app/controllers/ecm/pictures/backend/home_controller.rb
|
228
|
+
- app/controllers/ecm/pictures/backend/picture_galleries_controller.rb
|
229
|
+
- app/controllers/ecm/pictures/backend/pictures_controller.rb
|
230
|
+
- app/helpers/ecm/pictures/backend/application_helper.rb
|
231
|
+
- app/policies/ecm/pictures/backend/engine_policy.rb
|
232
|
+
- app/policies/ecm/pictures/picture_gallery_policy.rb
|
233
|
+
- app/policies/ecm/pictures/picture_policy.rb
|
234
|
+
- app/views/ecm/pictures/backend/picture_galleries/_form.html.haml
|
235
|
+
- app/views/ecm/pictures/backend/picture_galleries/_show.haml
|
236
|
+
- app/views/ecm/pictures/backend/picture_galleries/_show_extras.haml
|
237
|
+
- app/views/ecm/pictures/backend/picture_galleries/_table.html.haml
|
238
|
+
- app/views/ecm/pictures/backend/pictures/_form.html.haml
|
239
|
+
- app/views/ecm/pictures/backend/pictures/_show.html.haml
|
240
|
+
- app/views/ecm/pictures/backend/pictures/_table.html.haml
|
241
|
+
- app/views/layouts/ecm/pictures/backend/application.html.erb
|
242
|
+
- config/locales/de.yml
|
243
|
+
- config/rbac.yml
|
244
|
+
- config/routes.rb
|
245
|
+
- lib/ecm/pictures/backend.rb
|
246
|
+
- lib/ecm/pictures/backend/configuration.rb
|
247
|
+
- lib/ecm/pictures/backend/engine.rb
|
248
|
+
- lib/ecm/pictures/backend/version.rb
|
249
|
+
- lib/ecm_pictures2_backend.rb
|
250
|
+
- lib/generators/ecm/pictures/backend/install/install_generator.rb
|
251
|
+
- lib/generators/ecm/pictures/backend/install/templates/initializer.rb
|
252
|
+
- lib/generators/ecm/pictures/backend/install/templates/routes.source
|
253
|
+
- lib/tasks/ecm/pictures/backend_tasks.rake
|
254
|
+
homepage: https://github.com/robotex82/ecm_news2_backend
|
255
|
+
licenses:
|
256
|
+
- MIT
|
257
|
+
metadata: {}
|
258
|
+
post_install_message:
|
259
|
+
rdoc_options: []
|
260
|
+
require_paths:
|
261
|
+
- lib
|
262
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
263
|
+
requirements:
|
264
|
+
- - ">="
|
265
|
+
- !ruby/object:Gem::Version
|
266
|
+
version: '0'
|
267
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
268
|
+
requirements:
|
269
|
+
- - ">="
|
270
|
+
- !ruby/object:Gem::Version
|
271
|
+
version: '0'
|
272
|
+
requirements: []
|
273
|
+
rubyforge_project:
|
274
|
+
rubygems_version: 2.4.8
|
275
|
+
signing_key:
|
276
|
+
specification_version: 4
|
277
|
+
summary: Backend Module for ECM Pictures 2
|
278
|
+
test_files: []
|
279
|
+
has_rdoc:
|