fassets_core 0.2.0 → 0.3.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.
- data/README.md +17 -2
- data/app/assets/javascripts/fassets_core/add_asset_box.js +34 -35
- data/app/assets/javascripts/fassets_core/application.js.erb +2 -0
- data/app/assets/javascripts/fassets_core/edit_box.js +16 -17
- data/app/assets/javascripts/fassets_core/facets.js.erb +6 -7
- data/app/assets/javascripts/fassets_core/index.js +20 -0
- data/app/assets/stylesheets/fassets_core/add_asset_box.css.scss +12 -12
- data/app/assets/stylesheets/fassets_core/edit_box.css.scss +1 -2
- data/app/assets/stylesheets/fassets_core/forms.css.scss +5 -0
- data/app/assets/stylesheets/fassets_core/index.css +15 -0
- data/app/assets/stylesheets/fassets_core/labels.css.scss +16 -1
- data/app/assets/stylesheets/fassets_core/master.css.scss +4 -0
- data/app/controllers/assets_controller.rb +7 -37
- data/app/controllers/labels_controller.rb +17 -8
- data/app/models/asset.rb +10 -15
- data/app/views/assets/new.html.haml +18 -17
- data/app/views/catalogs/_facet.html.haml +1 -1
- data/app/views/labels/_sidebar.html.haml +15 -15
- data/app/views/layouts/fassets_core/application.html.haml +7 -5
- data/app/views/shared/_flash_messages.html.haml +6 -0
- data/config/routes.rb +3 -4
- data/lib/acts_as_asset.rb +1 -8
- data/lib/fassets_core/test_helper/acts_as_asset.rb +46 -0
- data/lib/fassets_core/test_helper/every_assets_controller.rb +2 -2
- data/lib/fassets_core/test_helper.rb +1 -1
- data/lib/fassets_core/version.rb +1 -1
- data/lib/fassets_core.rb +1 -0
- metadata +24 -7
- data/lib/authenticated_system.rb +0 -187
- data/lib/authenticated_test_helper.rb +0 -20
- data/lib/template_manager.rb +0 -27
data/README.md
CHANGED
@@ -7,8 +7,7 @@ This project rocks and uses MIT-LICENSE.
|
|
7
7
|
To use this plugin in your rails project, you need to add the gem to your applications `Gemfile`:
|
8
8
|
|
9
9
|
```
|
10
|
-
|
11
|
-
gem 'fassets_core', :git => "git://github.com/fassets/fassets_core.git"
|
10
|
+
gem 'fassets_core'
|
12
11
|
```
|
13
12
|
|
14
13
|
After that, run the `bundle` command to install all new dependencies.
|
@@ -20,3 +19,19 @@ bundle exec rake fassets_core_engine:install:migrations
|
|
20
19
|
bundle exec rake db:migrate
|
21
20
|
```
|
22
21
|
|
22
|
+
# Run tests
|
23
|
+
|
24
|
+
In order to run the tests for the first time, you need to do the following in a clean repository:
|
25
|
+
|
26
|
+
```
|
27
|
+
bundle
|
28
|
+
RAILS_ENV=test rake db:migrate
|
29
|
+
bundle exec guard
|
30
|
+
```
|
31
|
+
|
32
|
+
After the initial setup, it is okay to just start guard:
|
33
|
+
|
34
|
+
```
|
35
|
+
bundle exec guard
|
36
|
+
```
|
37
|
+
|
@@ -11,8 +11,6 @@ $(document).ready(function(){
|
|
11
11
|
$.fancybox.showActivity();
|
12
12
|
var f_width = $(window).width()*0.8;
|
13
13
|
var f_height = $(window).height()*0.8;
|
14
|
-
$("#add_asset_content").css("left",$("#catalog_list").width()+10);
|
15
|
-
$("#add_asset_content").css("width",$("#fancybox-content").width()-$("#catalog_list").width()-30-$("#facets").width());
|
16
14
|
$.ajaxSetup({cache: false});
|
17
15
|
$.get('/assets/new', { content_only: true }, function(data) {
|
18
16
|
$.fancybox({
|
@@ -23,7 +21,6 @@ $(document).ready(function(){
|
|
23
21
|
height: f_height,
|
24
22
|
onComplete: function(){
|
25
23
|
$("#fancybox-content").data("box-type","add_asset");
|
26
|
-
adjust_links();
|
27
24
|
$.fancybox.resize();
|
28
25
|
}
|
29
26
|
});
|
@@ -43,40 +40,42 @@ $(document).ready(function(){
|
|
43
40
|
}
|
44
41
|
break;
|
45
42
|
}
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
reload_tray();
|
66
|
-
$.fancybox.resize();;
|
67
|
-
$.fancybox.hideActivity();
|
68
|
-
});
|
69
|
-
$("#fancybox-content .asset_submit_button").click(function(event){
|
70
|
-
event.preventDefault();
|
71
|
-
$.fancybox.showActivity();
|
72
|
-
//var token = encodeURIComponent(AUTH_TOKEN)
|
73
|
-
var asset_type = $(event.target).data("asset-type");
|
74
|
-
reload_tray();
|
75
|
-
$.fancybox.hideActivity();
|
43
|
+
});
|
44
|
+
$(document).ajaxComplete(function() {
|
45
|
+
adjust_links();
|
46
|
+
});
|
47
|
+
var adjust_links = function() {
|
48
|
+
$("#add_asset_sidebar li.asset_type").click(function(event){
|
49
|
+
event.preventDefault();
|
50
|
+
$.fancybox.showActivity();
|
51
|
+
asset_type = $(event.target).data("asset-type");
|
52
|
+
$("div.fassets_core.new").load("/assets/new", {type: asset_type, content_only: true });
|
53
|
+
$.fancybox.resize();
|
54
|
+
$.fancybox.hideActivity();
|
55
|
+
});
|
56
|
+
$("#fancybox-content .asset_create_button").click(function(event){
|
57
|
+
event.preventDefault();
|
58
|
+
$.fancybox.showActivity();
|
59
|
+
var action = $("#add_asset_content form").attr("action");
|
60
|
+
$.post(action, $("#add_asset_content form").serialize(), function(data){
|
61
|
+
$("#fancybox-content #add_asset_content").load(data[0].edit_box_url+"?type="+data[0].content_type);
|
76
62
|
});
|
77
|
-
|
78
|
-
|
63
|
+
reload_tray();
|
64
|
+
$.fancybox.resize();;
|
65
|
+
$.fancybox.hideActivity();
|
66
|
+
});
|
67
|
+
$("#fancybox-content .asset_submit_button").click(function(event){
|
68
|
+
event.preventDefault();
|
69
|
+
$.fancybox.showActivity();
|
70
|
+
//var token = encodeURIComponent(AUTH_TOKEN)
|
71
|
+
var asset_type = $(event.target).data("asset-type");
|
72
|
+
reload_tray();
|
73
|
+
$.fancybox.hideActivity();
|
74
|
+
});
|
75
|
+
$("form.edit_classification input[type=submit][value=Save]").hide();
|
76
|
+
};
|
79
77
|
|
78
|
+
adjust_links();
|
80
79
|
$("#new_asset_link").click(function(event){
|
81
80
|
event.preventDefault();
|
82
81
|
show_asset_box();
|
@@ -4,24 +4,23 @@ $(document).ready(function(){
|
|
4
4
|
$.fancybox.showActivity();
|
5
5
|
var f_width = $(window).width()*0.8;
|
6
6
|
var f_height = $(window).height()*0.8;
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
}
|
20
|
-
|
21
|
-
|
22
|
-
}
|
23
|
-
});
|
7
|
+
$.ajaxSetup({cache: false});
|
8
|
+
$.get('/assets/'+asset_id+'/edit', { content_only: true }, function(data) {
|
9
|
+
$.fancybox({
|
10
|
+
content: data,
|
11
|
+
padding: 0,
|
12
|
+
autoDimensions: false,
|
13
|
+
width: f_width,
|
14
|
+
height: f_height,
|
15
|
+
onComplete: function(){
|
16
|
+
$("#fancybox-content").data("box-type","edit_asset");
|
17
|
+
adjust_links();
|
18
|
+
$.fancybox.resize();
|
19
|
+
}
|
20
|
+
});
|
21
|
+
});
|
24
22
|
};
|
23
|
+
|
25
24
|
$("body .edit_button").live("click",function(event){
|
26
25
|
event.preventDefault();
|
27
26
|
show_edit_box(event);
|
@@ -2,13 +2,10 @@ $(function(){
|
|
2
2
|
//Sortable Labels
|
3
3
|
$('#labels').sortable({
|
4
4
|
axis: 'y',
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
$('#labels .handle').unbind('click', noEventPropagation);
|
10
|
-
},
|
11
|
-
update:function(){
|
5
|
+
handle: ".handle",
|
6
|
+
update: function(e, ui){
|
7
|
+
url = $("ol#labels").data('update_url')
|
8
|
+
$.post(url, $(this).sortable('serialize'))
|
12
9
|
}
|
13
10
|
});
|
14
11
|
|
@@ -24,6 +21,8 @@ $(function(){
|
|
24
21
|
});
|
25
22
|
// hide the submit button if JS is enabled (form can be submited by checking the boxes)
|
26
23
|
$("form.edit_classification input[type=submit][value=Save]").hide();
|
24
|
+
|
25
|
+
$('.best_in_place').best_in_place();
|
27
26
|
});
|
28
27
|
|
29
28
|
/*$.ajax({
|
@@ -0,0 +1,20 @@
|
|
1
|
+
//= require jquery
|
2
|
+
//= require jquery_ujs
|
3
|
+
//= require jquery-ui
|
4
|
+
//= require jquery.collapsiblePanel-0.2.0
|
5
|
+
//= require fancybox
|
6
|
+
//= require jquery.purr
|
7
|
+
//= require best_in_place
|
8
|
+
//= require_self
|
9
|
+
//= require ./add_asset_box
|
10
|
+
//= require ./assets
|
11
|
+
//= require ./catalog_box
|
12
|
+
//= require ./catalogs
|
13
|
+
//= require ./classification
|
14
|
+
//= require ./edit_box
|
15
|
+
//= require ./facets
|
16
|
+
//= require ./tray
|
17
|
+
|
18
|
+
$.ajaxSetup({ 'beforeSend': function(xhr) {
|
19
|
+
xhr.setRequestHeader("Accept", "text/javascript,text/html");
|
20
|
+
}});
|
@@ -1,12 +1,15 @@
|
|
1
1
|
#add_asset_sidebar {
|
2
2
|
position: absolute;
|
3
|
-
|
4
|
-
top: 0px;
|
3
|
+
width: 200px;
|
5
4
|
height: 100%;
|
6
|
-
min-width: 150px;
|
7
5
|
font-size: 1em;
|
8
|
-
|
6
|
+
margin-right: 1em;
|
9
7
|
background: silver;
|
8
|
+
|
9
|
+
ul {
|
10
|
+
list-style: none;
|
11
|
+
}
|
12
|
+
|
10
13
|
.asset_type {
|
11
14
|
margin-top: .5em;
|
12
15
|
padding: .5em .0em .5em .5em;
|
@@ -28,20 +31,17 @@
|
|
28
31
|
}
|
29
32
|
}
|
30
33
|
}
|
31
|
-
|
32
|
-
position: absolute;
|
33
|
-
height: 100%;
|
34
|
-
}
|
34
|
+
|
35
35
|
#fancybox-content h1 {
|
36
36
|
border-top: none;
|
37
37
|
background-color: white;
|
38
38
|
}
|
39
39
|
#add_asset_content {
|
40
40
|
position: relative;
|
41
|
-
|
42
|
-
|
43
|
-
left:
|
44
|
-
|
41
|
+
height: 100%;
|
42
|
+
margin-left: 200px;
|
43
|
+
padding-left: 1em;
|
44
|
+
overflow-y: auto;
|
45
45
|
}
|
46
46
|
#sidebar.box{
|
47
47
|
float: right;
|
@@ -1,6 +1,5 @@
|
|
1
1
|
#fancybox-content #main {
|
2
2
|
margin-top: 10px;
|
3
|
-
margin-left: 10px;
|
4
3
|
height: 95%;
|
5
4
|
}
|
6
5
|
#fancybox-content #sidebar{
|
@@ -21,7 +20,7 @@
|
|
21
20
|
color: white;
|
22
21
|
text-shadow: 1px 1px #777777;
|
23
22
|
padding: .5em;
|
24
|
-
float: left;
|
23
|
+
float: left;
|
25
24
|
}
|
26
25
|
#action {
|
27
26
|
float: left;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
*= require fancybox
|
3
|
+
*= require ./add_asset_box
|
4
|
+
*= require ./assets
|
5
|
+
*= require ./catalog_box
|
6
|
+
*= require ./collapsible
|
7
|
+
*= require ./edit_box
|
8
|
+
*= require ./facet
|
9
|
+
*= require ./filter
|
10
|
+
*= require ./forms
|
11
|
+
*= require ./labels
|
12
|
+
*= require ./master
|
13
|
+
*= require ./sidebar
|
14
|
+
*= require ./tray
|
15
|
+
*/
|
@@ -1,4 +1,4 @@
|
|
1
|
-
.fassets_core {
|
1
|
+
.fassets_core .labels {
|
2
2
|
.collapsible {
|
3
3
|
text-align: left;
|
4
4
|
}
|
@@ -10,4 +10,19 @@
|
|
10
10
|
ul {
|
11
11
|
margin: 0;
|
12
12
|
}
|
13
|
+
|
14
|
+
span.best_in_place {
|
15
|
+
display: inline;
|
16
|
+
}
|
17
|
+
form {
|
18
|
+
display: inline;
|
19
|
+
|
20
|
+
div {
|
21
|
+
display: inline;
|
22
|
+
}
|
23
|
+
|
24
|
+
input {
|
25
|
+
display: inline;
|
26
|
+
}
|
27
|
+
}
|
13
28
|
}
|
@@ -26,7 +26,6 @@ class AssetsController < FassetsCore::ApplicationController
|
|
26
26
|
if @content.save
|
27
27
|
@classification = Classification.new(:catalog_id => params["classification"]["catalog_id"],:asset_id => @content.asset.id)
|
28
28
|
@classification.save
|
29
|
-
create_content_labeling(@content.asset.id, params["classification"]["catalog_id"])
|
30
29
|
flash[:notice] = "Created new asset!"
|
31
30
|
format.js { render :json => @content.to_jq_upload.merge({:status => :ok}).to_json }
|
32
31
|
format.html { redirect_to edit_asset_content_path(@content) }
|
@@ -43,7 +42,7 @@ class AssetsController < FassetsCore::ApplicationController
|
|
43
42
|
render :template => 'assets/show'
|
44
43
|
end
|
45
44
|
def edit
|
46
|
-
render :template => 'assets/edit', :
|
45
|
+
render :template => 'assets/edit', :layout => !(params["content_only"])
|
47
46
|
end
|
48
47
|
def update
|
49
48
|
if @content.update_attributes(content_params) and @content.asset.update_attributes(params["asset"])
|
@@ -73,43 +72,14 @@ class AssetsController < FassetsCore::ApplicationController
|
|
73
72
|
params[field_name]
|
74
73
|
end
|
75
74
|
def find_content
|
76
|
-
if
|
77
|
-
|
78
|
-
|
79
|
-
|
75
|
+
if self.respond_to?(:content_model)
|
76
|
+
@content = content_model.find(params[:id])
|
77
|
+
elsif !params[:asset_id].nil?
|
78
|
+
asset = Asset.find(params[:asset_id])
|
79
|
+
@content = asset.content
|
80
80
|
end
|
81
|
-
content_id = Asset.find(params[:id]).content_id
|
82
|
-
@content = self.content_model.find(content_id)
|
83
81
|
rescue ActiveRecord::RecordNotFound => e
|
84
|
-
flash[:error] =
|
82
|
+
flash[:error] = e.message
|
85
83
|
redirect_to main_app.root_url
|
86
84
|
end
|
87
|
-
def create_content_labeling(asset_id,catalog_id)
|
88
|
-
asset = Asset.find(asset_id)
|
89
|
-
content_facet = Facet.where(:catalog_id => catalog_id, :caption => "Content Type").first
|
90
|
-
return if content_facet.nil?
|
91
|
-
content_facet.labels.each do |label|
|
92
|
-
if asset.content_type == "FileAsset"
|
93
|
-
if label.caption.downcase == asset.content.media_type
|
94
|
-
labeling = Labeling.new(:classification_id => @classification.id, :label_id => label.id)
|
95
|
-
labeling.save
|
96
|
-
end
|
97
|
-
elsif asset.content_type == "Url"
|
98
|
-
if label.caption == "Url"
|
99
|
-
labeling = Labeling.new(:classification_id => @classification.id, :label_id => label.id)
|
100
|
-
labeling.save
|
101
|
-
end
|
102
|
-
elsif asset.content_type == "Code"
|
103
|
-
if label.caption == "Code"
|
104
|
-
labeling = Labeling.new(:classification_id => @classification.id, :label_id => label.id)
|
105
|
-
labeling.save
|
106
|
-
end
|
107
|
-
elsif asset.content_type == "FassetsPresentations::Presentation"
|
108
|
-
if label.caption == "Presentation"
|
109
|
-
labeling = Labeling.new(:classification_id => @classification.id, :label_id => label.id)
|
110
|
-
labeling.save
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
85
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
class LabelsController < FassetsCore::ApplicationController
|
2
2
|
before_filter :authenticate_user!
|
3
3
|
before_filter :find_label, :except => [:create, :sort]
|
4
|
+
respond_to :html, :json
|
4
5
|
def create
|
5
6
|
@label = Label.new(params[:label])
|
6
7
|
@label.facet_id = params[:facet_id]
|
@@ -12,19 +13,27 @@ class LabelsController < FassetsCore::ApplicationController
|
|
12
13
|
flash[:error] = "Label could not be created! Caption cannot be empty!"
|
13
14
|
else
|
14
15
|
flash[:error] = "Label could not be created!"
|
15
|
-
end
|
16
|
+
end
|
16
17
|
redirect_to :back
|
17
18
|
end
|
18
19
|
end
|
19
20
|
def update
|
20
|
-
if params[:label][:caption].blank?
|
21
|
-
flash[:error] = "Label could not be updated! Caption cannot be empty!"
|
22
|
-
redirect_to :back
|
23
|
-
return
|
24
|
-
end
|
25
21
|
@label.update_attributes(params[:label])
|
26
|
-
|
27
|
-
|
22
|
+
respond_to do |format|
|
23
|
+
if @label.save
|
24
|
+
format.html do
|
25
|
+
flash[:notice] = "Label was successfully updated."
|
26
|
+
redirect_to edit_catalog_facet_path(params[:catalog_id], params[:facet_id])
|
27
|
+
end
|
28
|
+
format.json { respond_with_bip(@label) }
|
29
|
+
else
|
30
|
+
format.html do
|
31
|
+
flash[:error] = "Label could not be updated! Caption cannot be empty!"
|
32
|
+
redirect_to :back
|
33
|
+
end
|
34
|
+
format.json { respond_with_bip(@label) }
|
35
|
+
end
|
36
|
+
end
|
28
37
|
end
|
29
38
|
def sort
|
30
39
|
params[:label].each_with_index do |id, position|
|
data/app/models/asset.rb
CHANGED
@@ -10,13 +10,6 @@ class Asset < ActiveRecord::Base
|
|
10
10
|
|
11
11
|
after_create :put_on_tray
|
12
12
|
|
13
|
-
def publish=(test)
|
14
|
-
end
|
15
|
-
def published=(test)
|
16
|
-
end
|
17
|
-
def published
|
18
|
-
1
|
19
|
-
end
|
20
13
|
def self.filter(filter)
|
21
14
|
options = {:select => "assets.*", :order => "name"}
|
22
15
|
unless filter.empty?
|
@@ -27,18 +20,19 @@ class Asset < ActiveRecord::Base
|
|
27
20
|
all options
|
28
21
|
end
|
29
22
|
|
23
|
+
# FIXME: is this used somewhere? should be removed right after the release of 0.3.0 to test if something breaks
|
30
24
|
def self.count_for_labels(filter)
|
31
25
|
options = {:include => [:labelings], :group => "label_id"}
|
32
26
|
unless filter.empty?
|
33
27
|
options[:conditions] = "assets.id IN(
|
34
|
-
SELECT DISTINCT assets.id
|
35
|
-
FROM assets
|
36
|
-
LEFT OUTER JOIN classifications ON (assets.id = classifications.asset_id)
|
37
|
-
LEFT OUTER JOIN labelings ON (labelings.classification_id=classifications.id)
|
38
|
-
WHERE (#{filter.to_condition})
|
39
|
-
GROUP BY assets.id
|
28
|
+
SELECT DISTINCT assets.id
|
29
|
+
FROM assets
|
30
|
+
LEFT OUTER JOIN classifications ON (assets.id = classifications.asset_id)
|
31
|
+
LEFT OUTER JOIN labelings ON (labelings.classification_id=classifications.id)
|
32
|
+
WHERE (#{filter.to_condition})
|
33
|
+
GROUP BY assets.id
|
40
34
|
HAVING COUNT(label_id)=#{filter.size})"
|
41
|
-
|
35
|
+
filter.to_condition
|
42
36
|
end
|
43
37
|
count options
|
44
38
|
end
|
@@ -46,7 +40,8 @@ class Asset < ActiveRecord::Base
|
|
46
40
|
def put_on_tray
|
47
41
|
return if user.nil?
|
48
42
|
|
49
|
-
|
43
|
+
p = user.tray_positions.maximum(:position) || 0
|
44
|
+
tray_positions.create(:user_id => user.id, :asset_id => id, :position => p + 1)
|
50
45
|
end
|
51
46
|
end
|
52
47
|
|
@@ -4,22 +4,23 @@
|
|
4
4
|
#name
|
5
5
|
New
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
.fassets_core.new
|
8
|
+
-unless @asset_types.nil?
|
9
|
+
#add_asset_sidebar
|
10
|
+
=render :partial => "add_asset_sidebar"
|
10
11
|
|
11
|
-
-unless @content.nil?
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
-unless @content.nil?
|
13
|
+
#add_asset_content
|
14
|
+
#main.fassets_core
|
15
|
+
=form_for @content, :url => asset_content_path(@content),:html => {:multipart => true} do |f|
|
16
|
+
=render :partial => "shared/error", :locals => {:target => @content}
|
17
|
+
=fields_for "asset" do |asset|
|
18
|
+
%p
|
19
|
+
%label{:for => 'name'} Name:
|
20
|
+
=asset.text_field :name
|
21
|
+
#name_warning
|
17
22
|
%p
|
18
|
-
%label{:for => '
|
19
|
-
=
|
20
|
-
|
21
|
-
|
22
|
-
%label{:for => 'catalog_id'} Catalog:
|
23
|
-
=select("classification", "catalog_id", Catalog.all.inject([]){|m,c| m << [c.title, c.id]})
|
24
|
-
=render :partial => @content.class.to_s.underscore.pluralize + "/form", :locals => {:new => true}, :object => f
|
25
|
-
=submit_tag "Create", :class => "asset_create_button"
|
23
|
+
%label{:for => 'catalog_id'} Catalog:
|
24
|
+
=select("classification", "catalog_id", Catalog.all.inject([]){|m,c| m << [c.title, c.id]})
|
25
|
+
=render :partial => @content.class.to_s.underscore.pluralize + "/form", :locals => {:new => true}, :object => f
|
26
|
+
=submit_tag "Create", :class => "asset_create_button"
|
@@ -5,7 +5,7 @@
|
|
5
5
|
=link_to image_tag("fassets_core/edit.png"), edit_catalog_facet_path(@catalog, facet)
|
6
6
|
%span.handle=image_tag("fassets_core/drag.png")
|
7
7
|
%ul{:class => "#{facet.color}_lite"}
|
8
|
-
-facet.
|
8
|
+
-facet.ordered_labels.each do |label|
|
9
9
|
-if @counts[label.id] && !@filter.include?(label.id)
|
10
10
|
%li.label
|
11
11
|
=link_to label.caption, catalog_path(@catalog, :filter => @filter.to_query_include(label.id))
|
@@ -1,22 +1,22 @@
|
|
1
|
-
.
|
2
|
-
%h2.title New Label
|
3
|
-
=form_for [@catalog, @facet, Label.new], :url => catalog_facet_labels_path(@catalog,@facet) do |f|
|
4
|
-
=render :partial => "labels/form", :object => f
|
5
|
-
=submit_tag "Create"
|
6
|
-
|
7
|
-
.collapsible
|
1
|
+
.labels
|
8
2
|
%h2.title Labels
|
9
|
-
|
3
|
+
.collapsible
|
4
|
+
%h2.title New Label
|
5
|
+
=form_for [@catalog, @facet, Label.new] do |f|
|
6
|
+
=render :partial => "labels/form", :object => f
|
7
|
+
=submit_tag "Create"
|
8
|
+
|
9
|
+
%ol.collection{:class => @facet.label_order == 'position' ? "sortable" : nil,
|
10
|
+
:id => "labels",
|
11
|
+
:data => {:update_url => sort_catalog_facet_labels_path(@catalog, @facet)}}
|
10
12
|
-@facet.ordered_labels.each do |label|
|
11
13
|
%li{:id => "label_#{label.id}"}
|
12
|
-
|
13
|
-
|
14
|
-
=
|
15
|
-
=render :partial => "labels/form", :object => f
|
16
|
-
=submit_tag "Save"
|
17
|
-
=button_to "Drop", catalog_facet_label_path(@catalog, @facet, label),
|
14
|
+
%span.content
|
15
|
+
=best_in_place label, :caption, :path => catalog_facet_label_path(@catalog, @facet, label)
|
16
|
+
=button_to "Delete", catalog_facet_label_path(@catalog, @facet, label),
|
18
17
|
:confirm => 'Are you sure?',
|
19
18
|
:method => "delete",
|
20
19
|
:remote => true,
|
21
20
|
:disable_with => 'loading...'
|
22
|
-
|
21
|
+
- if @facet.label_order == 'position'
|
22
|
+
%span.handle= image_tag "fassets_core/drag.png"
|
@@ -4,11 +4,13 @@
|
|
4
4
|
=yield :core_head
|
5
5
|
|
6
6
|
- content_for :catalogs_selector do
|
7
|
-
=
|
8
|
-
:
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
%select{ :onchange => "javascript:window.location= this.value"}
|
8
|
+
%option{ :value => "/" }= "Catalogs..."
|
9
|
+
=Catalog.all.each do |c|
|
10
|
+
- if params[:id].to_i == c.id
|
11
|
+
%option{ :value => '/catalogs/' + c.id.to_s, :selected => 'selected'}= c.title
|
12
|
+
- else
|
13
|
+
%option{ :value => '/catalogs/' + c.id.to_s}= c.title
|
12
14
|
|
13
15
|
- content_for :tray do
|
14
16
|
=render :partial => "shared/tray"
|
data/config/routes.rb
CHANGED
@@ -3,10 +3,10 @@ Rails.application.routes.draw do
|
|
3
3
|
resources :facets do
|
4
4
|
collection do
|
5
5
|
post :sort
|
6
|
-
end
|
6
|
+
end
|
7
7
|
resources :labels do
|
8
8
|
collection do
|
9
|
-
|
9
|
+
post :sort
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -24,11 +24,10 @@ Rails.application.routes.draw do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
match 'asset/:id/preview' => 'Assets#preview'
|
27
|
-
match 'asset/:id/edit' => 'Assets#edit'
|
28
27
|
match 'asset/:id/classifications' => 'Assets#classifications'
|
29
28
|
match 'catalog_box' => 'Catalogs#catalog_box'
|
30
29
|
match 'box_content' => 'Catalogs#box_content'
|
31
30
|
match 'box_facet' => 'Catalogs#box_facet'
|
32
|
-
match '
|
31
|
+
match 'assets/:asset_id/edit' => 'assets#edit'
|
33
32
|
match 'assets/new' => 'assets#new'
|
34
33
|
end
|
data/lib/acts_as_asset.rb
CHANGED
@@ -2,7 +2,7 @@ module ActiveRecord
|
|
2
2
|
module Acts
|
3
3
|
module Asset
|
4
4
|
def self.included(base)
|
5
|
-
base.extend(ClassMethods)
|
5
|
+
base.extend(ClassMethods)
|
6
6
|
end
|
7
7
|
module ClassMethods
|
8
8
|
def acts_as_asset
|
@@ -15,19 +15,12 @@ module ActiveRecord
|
|
15
15
|
def name
|
16
16
|
asset.name
|
17
17
|
end
|
18
|
-
def class_underscore
|
19
|
-
self.class.to_s.underscore
|
20
|
-
end
|
21
18
|
def media_type
|
22
19
|
"generic"
|
23
20
|
end
|
24
21
|
def icon
|
25
22
|
"/images/#{media_type}.png"
|
26
23
|
end
|
27
|
-
protected
|
28
|
-
def put_on_tray
|
29
|
-
tray_positions.create(:user_id => self.user_id)
|
30
|
-
end
|
31
24
|
end
|
32
25
|
end
|
33
26
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "rspec"
|
2
|
+
|
3
|
+
shared_examples_for "ActsAsAsset" do
|
4
|
+
before(:each) do
|
5
|
+
begin
|
6
|
+
@the_asset = Asset.create!(:name => "Test Asset", :content => asset)
|
7
|
+
rescue NameError
|
8
|
+
raise "May be you need to define an asset! Use \"let(:asset){ #your code here }\" in your specs."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "associations for the model" do
|
13
|
+
it "should have an asset object" do
|
14
|
+
asset.asset.should == @the_asset
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should destroy the asset model when deleted" do
|
18
|
+
asset.destroy
|
19
|
+
begin
|
20
|
+
@the_asset.reload
|
21
|
+
raise "RecordNotFound exception should have been raised!"
|
22
|
+
rescue ActiveRecord::RecordNotFound
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should be possible to set the name for an asset through the object itself" do
|
27
|
+
asset.asset.name="New name"
|
28
|
+
asset.save!
|
29
|
+
@the_asset.reload.name.should == "New name"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "instance methods for the model" do
|
34
|
+
it "should provide a name method" do
|
35
|
+
asset.name.should == "Test Asset"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should provide a media type" do
|
39
|
+
asset.media_type.should_not be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should provide an icon" do
|
43
|
+
asset.icon.should_not be_nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -79,13 +79,13 @@ shared_examples_for "Every AssetsController" do
|
|
79
79
|
it "should redirect to root with error message on error" do
|
80
80
|
get 'show', additional_request_params.merge({ :id => asset.id })
|
81
81
|
response.should redirect_to(root_path)
|
82
|
-
request.flash[:error].should =~ /
|
82
|
+
request.flash[:error].should =~ /^Couldn't find/
|
83
83
|
end
|
84
84
|
|
85
85
|
it "should delete the asset and show a notice" do
|
86
86
|
delete "destroy", additional_request_params.merge({ :id => asset.id })
|
87
87
|
response.should redirect_to(root_path)
|
88
|
-
request.flash[:error].should =~ /
|
88
|
+
request.flash[:error].should =~ /^Couldn't find/
|
89
89
|
end
|
90
90
|
|
91
91
|
describe "create asset" do
|
data/lib/fassets_core/version.rb
CHANGED
data/lib/fassets_core.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fassets_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-10-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -108,6 +108,22 @@ dependencies:
|
|
108
108
|
- - ! '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: best_in_place
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :runtime
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
111
127
|
- !ruby/object:Gem::Dependency
|
112
128
|
name: devise
|
113
129
|
requirement: !ruby/object:Gem::Requirement
|
@@ -231,6 +247,7 @@ files:
|
|
231
247
|
- app/views/facets/edit.html.haml
|
232
248
|
- app/views/facets/_form.html.haml
|
233
249
|
- app/views/shared/_asset_form.html.haml
|
250
|
+
- app/views/shared/_flash_messages.html.haml
|
234
251
|
- app/views/shared/_clipboard.html.haml
|
235
252
|
- app/views/shared/_classification.html.haml
|
236
253
|
- app/views/shared/_error.html.haml
|
@@ -261,6 +278,7 @@ files:
|
|
261
278
|
- app/assets/stylesheets/fassets_core/facet.css.scss
|
262
279
|
- app/assets/stylesheets/fassets_core/forms.css.scss
|
263
280
|
- app/assets/stylesheets/fassets_core/application.css
|
281
|
+
- app/assets/stylesheets/fassets_core/index.css
|
264
282
|
- app/assets/stylesheets/fassets_core/add_asset_box.css.scss
|
265
283
|
- app/assets/stylesheets/fassets_core/tray.css.scss
|
266
284
|
- app/assets/stylesheets/fassets_core/edit_box.css.scss
|
@@ -273,6 +291,7 @@ files:
|
|
273
291
|
- app/assets/stylesheets/fassets_core/sidebar.css.scss
|
274
292
|
- app/assets/javascripts/fassets_core/assets.js
|
275
293
|
- app/assets/javascripts/fassets_core/tray.js
|
294
|
+
- app/assets/javascripts/fassets_core/index.js
|
276
295
|
- app/assets/javascripts/fassets_core/catalog_box.js
|
277
296
|
- app/assets/javascripts/fassets_core/add_asset_box.js
|
278
297
|
- app/assets/javascripts/fassets_core/application.js.erb
|
@@ -308,13 +327,11 @@ files:
|
|
308
327
|
- lib/fassets_core/version.rb
|
309
328
|
- lib/fassets_core/engine.rb
|
310
329
|
- lib/fassets_core/plugins.rb
|
330
|
+
- lib/fassets_core/test_helper/acts_as_asset.rb
|
311
331
|
- lib/fassets_core/test_helper/every_assets_controller.rb
|
312
332
|
- lib/fassets_core/test_helper/every_authenticated_controller.rb
|
313
333
|
- lib/fassets_core/test_helper.rb
|
314
|
-
- lib/authenticated_system.rb
|
315
334
|
- lib/fassets_core.rb
|
316
|
-
- lib/authenticated_test_helper.rb
|
317
|
-
- lib/template_manager.rb
|
318
335
|
- lib/tasks/cucumber.rake
|
319
336
|
- lib/tasks/fassets-core_tasks.rake
|
320
337
|
- MIT-LICENSE
|
@@ -384,7 +401,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
384
401
|
version: '0'
|
385
402
|
segments:
|
386
403
|
- 0
|
387
|
-
hash: -
|
404
|
+
hash: -1017598728477094860
|
388
405
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
389
406
|
none: false
|
390
407
|
requirements:
|
@@ -393,7 +410,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
393
410
|
version: '0'
|
394
411
|
segments:
|
395
412
|
- 0
|
396
|
-
hash: -
|
413
|
+
hash: -1017598728477094860
|
397
414
|
requirements: []
|
398
415
|
rubyforge_project:
|
399
416
|
rubygems_version: 1.8.24
|
data/lib/authenticated_system.rb
DELETED
@@ -1,187 +0,0 @@
|
|
1
|
-
module AuthenticatedSystem
|
2
|
-
protected
|
3
|
-
# Returns true or false if the user is logged in.
|
4
|
-
# Preloads @current_user with the user model if they're logged in.
|
5
|
-
def logged_in?
|
6
|
-
!!current_user
|
7
|
-
end
|
8
|
-
|
9
|
-
# Accesses the current user from the session.
|
10
|
-
# Future calls avoid the database because nil is not equal to false.
|
11
|
-
def current_user
|
12
|
-
@current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie) unless @current_user == false
|
13
|
-
end
|
14
|
-
|
15
|
-
# Store the given user id in the session.
|
16
|
-
def current_user=(new_user)
|
17
|
-
session[:user_id] = new_user ? new_user.id : nil
|
18
|
-
@current_user = new_user || false
|
19
|
-
end
|
20
|
-
|
21
|
-
# Check if the user is authorized
|
22
|
-
#
|
23
|
-
# Override this method in your controllers if you want to restrict access
|
24
|
-
# to only a few actions or if you want to check if the user
|
25
|
-
# has the correct rights.
|
26
|
-
#
|
27
|
-
# Example:
|
28
|
-
#
|
29
|
-
# # only allow nonbobs
|
30
|
-
# def authorized?
|
31
|
-
# current_user.login != "bob"
|
32
|
-
# end
|
33
|
-
#
|
34
|
-
def authorized?(action=nil, resource=nil, *args)
|
35
|
-
user_signed_in??
|
36
|
-
end
|
37
|
-
|
38
|
-
# Filter method to enforce a login requirement.
|
39
|
-
#
|
40
|
-
# To require logins for all actions, use this in your controllers:
|
41
|
-
#
|
42
|
-
# before_filter :login_required
|
43
|
-
#
|
44
|
-
# To require logins for specific actions, use this in your controllers:
|
45
|
-
#
|
46
|
-
# before_filter :login_required, :only => [ :edit, :update ]
|
47
|
-
#
|
48
|
-
# To skip this in a subclassed controller:
|
49
|
-
#
|
50
|
-
# skip_before_filter :login_required
|
51
|
-
#
|
52
|
-
def login_required
|
53
|
-
authorized? || access_denied
|
54
|
-
end
|
55
|
-
|
56
|
-
# Redirect as appropriate when an access request fails.
|
57
|
-
#
|
58
|
-
# The default action is to redirect to the login screen.
|
59
|
-
#
|
60
|
-
# Override this method in your controllers if you want to have special
|
61
|
-
# behavior in case the user is not authorized
|
62
|
-
# to access the requested action. For example, a popup window might
|
63
|
-
# simply close itself.
|
64
|
-
def access_denied
|
65
|
-
respond_to do |format|
|
66
|
-
format.html do
|
67
|
-
store_location
|
68
|
-
redirect_to new_session_path
|
69
|
-
end
|
70
|
-
# format.any doesn't work in rails version < http://dev.rubyonrails.org/changeset/8987
|
71
|
-
# you may want to change format.any to e.g. format.any(:js, :xml)
|
72
|
-
format.any do
|
73
|
-
request_http_basic_authentication 'Web Password'
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# Store the URI of the current request in the session.
|
79
|
-
#
|
80
|
-
# We can return to this location by calling #redirect_back_or_default.
|
81
|
-
def store_location
|
82
|
-
session[:return_to] = request.request_uri
|
83
|
-
end
|
84
|
-
|
85
|
-
# Redirect to the URI stored by the most recent store_location call or
|
86
|
-
# to the passed default. Set an appropriately modified
|
87
|
-
# after_filter :store_location, :only => [:index, :new, :show, :edit]
|
88
|
-
# for any controller you want to be bounce-backable.
|
89
|
-
def redirect_back_or_default(default)
|
90
|
-
redirect_to(session[:return_to] || default)
|
91
|
-
session[:return_to] = nil
|
92
|
-
end
|
93
|
-
|
94
|
-
# Inclusion hook to make #current_user and #logged_in?
|
95
|
-
# available as ActionView helper methods.
|
96
|
-
def self.included(base)
|
97
|
-
base.send :helper_method, :current_user, :user_signed_in?, :authorized? if base.respond_to? :helper_method
|
98
|
-
end
|
99
|
-
|
100
|
-
#
|
101
|
-
# Login
|
102
|
-
#
|
103
|
-
|
104
|
-
# Called from #current_user. First attempt to login by the user id stored in the session.
|
105
|
-
def login_from_session
|
106
|
-
self.current_user = User.find_by_id(session[:user_id]) if session[:user_id]
|
107
|
-
end
|
108
|
-
|
109
|
-
# Called from #current_user. Now, attempt to login by basic authentication information.
|
110
|
-
def login_from_basic_auth
|
111
|
-
authenticate_with_http_basic do |login, password|
|
112
|
-
self.current_user = User.authenticate(login, password)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
#
|
117
|
-
# Logout
|
118
|
-
#
|
119
|
-
|
120
|
-
# Called from #current_user. Finaly, attempt to login by an expiring token in the cookie.
|
121
|
-
# for the paranoid: we _should_ be storing user_token = hash(cookie_token, request IP)
|
122
|
-
def login_from_cookie
|
123
|
-
user = cookies[:auth_token] && User.find_by_remember_token(cookies[:auth_token])
|
124
|
-
if user && user.remember_token?
|
125
|
-
self.current_user = user
|
126
|
-
handle_remember_cookie! false # freshen cookie token (keeping date)
|
127
|
-
self.current_user
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
# This is ususally what you want; resetting the session willy-nilly wreaks
|
132
|
-
# havoc with forgery protection, and is only strictly necessary on login.
|
133
|
-
# However, **all session state variables should be unset here**.
|
134
|
-
def logout_keeping_session!
|
135
|
-
# Kill server-side auth cookie
|
136
|
-
@current_user.forget_me if @current_user.is_a? User
|
137
|
-
@current_user = false # not logged in, and don't do it for me
|
138
|
-
kill_remember_cookie! # Kill client-side auth cookie
|
139
|
-
session[:user_id] = nil # keeps the session but kill our variable
|
140
|
-
# explicitly kill any other session variables you set
|
141
|
-
end
|
142
|
-
|
143
|
-
# The session should only be reset at the tail end of a form POST --
|
144
|
-
# otherwise the request forgery protection fails. It's only really necessary
|
145
|
-
# when you cross quarantine (logged-out to logged-in).
|
146
|
-
def logout_killing_session!
|
147
|
-
logout_keeping_session!
|
148
|
-
reset_session
|
149
|
-
end
|
150
|
-
|
151
|
-
#
|
152
|
-
# Remember_me Tokens
|
153
|
-
#
|
154
|
-
# Cookies shouldn't be allowed to persist past their freshness date,
|
155
|
-
# and they should be changed at each login
|
156
|
-
|
157
|
-
# Cookies shouldn't be allowed to persist past their freshness date,
|
158
|
-
# and they should be changed at each login
|
159
|
-
|
160
|
-
def valid_remember_cookie?
|
161
|
-
return nil unless @current_user
|
162
|
-
(@current_user.remember_token?) &&
|
163
|
-
(cookies[:auth_token] == @current_user.remember_token)
|
164
|
-
end
|
165
|
-
|
166
|
-
# Refresh the cookie auth token if it exists, create it otherwise
|
167
|
-
def handle_remember_cookie! new_cookie_flag
|
168
|
-
return unless @current_user
|
169
|
-
case
|
170
|
-
when valid_remember_cookie? then @current_user.refresh_token # keeping same expiry date
|
171
|
-
when new_cookie_flag then @current_user.remember_me
|
172
|
-
else @current_user.forget_me
|
173
|
-
end
|
174
|
-
send_remember_cookie!
|
175
|
-
end
|
176
|
-
|
177
|
-
def kill_remember_cookie!
|
178
|
-
cookies.delete :auth_token
|
179
|
-
end
|
180
|
-
|
181
|
-
def send_remember_cookie!
|
182
|
-
cookies[:auth_token] = {
|
183
|
-
:value => @current_user.remember_token,
|
184
|
-
:expires => @current_user.remember_token_expires_at }
|
185
|
-
end
|
186
|
-
|
187
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module AuthenticatedTestHelper
|
2
|
-
# Sets the current user in the session from the user fixtures.
|
3
|
-
def login_as(user)
|
4
|
-
@request.session[:user_id] = user ? users(user).id : nil
|
5
|
-
end
|
6
|
-
|
7
|
-
def authorize_as(user)
|
8
|
-
@request.env["HTTP_AUTHORIZATION"] = user ? ActionController::HttpAuthentication::Basic.encode_credentials(users(user).login, 'monkey') : nil
|
9
|
-
end
|
10
|
-
|
11
|
-
# rspec
|
12
|
-
def mock_user
|
13
|
-
user = mock_model(User, :id => 1,
|
14
|
-
:login => 'user_name',
|
15
|
-
:name => 'U. Surname',
|
16
|
-
:to_xml => "User-in-XML", :to_json => "User-in-JSON",
|
17
|
-
:errors => [])
|
18
|
-
user
|
19
|
-
end
|
20
|
-
end
|
data/lib/template_manager.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module TemplateManager
|
2
|
-
extend self
|
3
|
-
|
4
|
-
def outer_templates
|
5
|
-
templates.keys
|
6
|
-
end
|
7
|
-
def inner_templates(outer)
|
8
|
-
templates[outer].keys
|
9
|
-
end
|
10
|
-
def inner_template(outer, name)
|
11
|
-
templates[outer][name]
|
12
|
-
end
|
13
|
-
private
|
14
|
-
def templates
|
15
|
-
Dir.chdir(TEMPLATE_PATH) do
|
16
|
-
@templates ||= Dir.entries(".").inject({}) do |templates, entry|
|
17
|
-
yml_path = File.join(entry, "template.yml")
|
18
|
-
if entry != '.' &&
|
19
|
-
entry != '..' &&
|
20
|
-
File.exists?(yml_path)
|
21
|
-
templates[entry] = YAML.load_file(yml_path)
|
22
|
-
end
|
23
|
-
templates
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|