mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-05-25 09:19:15 -04:00
Compare commits
193 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ca314c2f2 | ||
|
|
36768cf384 | ||
|
|
e35d0455bd | ||
|
|
c8405830c7 | ||
|
|
6bc9f775c2 | ||
|
|
a43526776b | ||
|
|
6f74566d47 | ||
|
|
82ce6c8222 | ||
|
|
f96f459595 | ||
|
|
096146cb84 | ||
|
|
ba1c40702b | ||
|
|
e6254da3f1 | ||
|
|
acbb610e05 | ||
|
|
338265d9e9 | ||
|
|
706922cacf | ||
|
|
08f2877f8e | ||
|
|
8275f5be96 | ||
|
|
2c3d1848d5 | ||
|
|
17e88778c8 | ||
|
|
bafb0123da | ||
|
|
e1e9c32652 | ||
|
|
48c3cbb3d1 | ||
|
|
740b8587f2 | ||
|
|
b113146aaa | ||
|
|
900de8a615 | ||
|
|
d73aa98309 | ||
|
|
ac7d44cb72 | ||
|
|
bba057ec76 | ||
|
|
1dc44c9edc | ||
|
|
92c1515381 | ||
|
|
43f905ea25 | ||
|
|
1db30d98ce | ||
|
|
2b92f013fc | ||
|
|
23f8c24ef4 | ||
|
|
fba2306a4d | ||
|
|
c8fa54591a | ||
|
|
67b496fe44 | ||
|
|
b24514fa82 | ||
|
|
f0a81d4100 | ||
|
|
64f11793c9 | ||
|
|
05a9d498a7 | ||
|
|
16145599ce | ||
|
|
af8527aa5b | ||
|
|
f9eb70e2eb | ||
|
|
8408fdc845 | ||
|
|
f37c9152af | ||
|
|
4ee789ca06 | ||
|
|
43e4ed43cd | ||
|
|
80371c835c | ||
|
|
6478d9cb1b | ||
|
|
f8b84f390d | ||
|
|
755b9b339f | ||
|
|
9deed09d36 | ||
|
|
43de722faf | ||
|
|
e145bb59f7 | ||
|
|
911c7b7bc1 | ||
|
|
2b7144c1fd | ||
|
|
8ddf36fed9 | ||
|
|
785ae33a42 | ||
|
|
c43c1686a3 | ||
|
|
65a8bde467 | ||
|
|
3647f67538 | ||
|
|
6c4f7eff92 | ||
|
|
9b57a44f6c | ||
|
|
8a69ed4013 | ||
|
|
e5d826e8c3 | ||
|
|
77c01d4f66 | ||
|
|
33b7952ed3 | ||
|
|
1217ba5b48 | ||
|
|
ffee6ada83 | ||
|
|
63b71a9265 | ||
|
|
3ecc7ba99b | ||
|
|
3e81419e78 | ||
|
|
7cd8dfa0c7 | ||
|
|
9182c8ceb1 | ||
|
|
ec8096233c | ||
|
|
19aa3a1ca4 | ||
|
|
e574ee166c | ||
|
|
93e9428bb6 | ||
|
|
fcf453b9d9 | ||
|
|
909164ea70 | ||
|
|
b5a5aca67b | ||
|
|
2424e7de87 | ||
|
|
d367b44da1 | ||
|
|
fe999d7170 | ||
|
|
3267fd7d1f | ||
|
|
355419b6cb | ||
|
|
dfa23a6564 | ||
|
|
9099ee5779 | ||
|
|
7ba9049908 | ||
|
|
c82127f1fb | ||
|
|
666394906b | ||
|
|
150393b1c3 | ||
|
|
e8e1e33a07 | ||
|
|
18e6e8510c | ||
|
|
64d7c2535b | ||
|
|
15106a051c | ||
|
|
62fe72c9f4 | ||
|
|
43519809f5 | ||
|
|
7731623397 | ||
|
|
3b3e14fadb | ||
|
|
271242eca9 | ||
|
|
a607fdc6ec | ||
|
|
6d1bdf9ae1 | ||
|
|
25058d02fc | ||
|
|
b80e7f677c | ||
|
|
576426c30d | ||
|
|
c9b464771d | ||
|
|
76af02f2a5 | ||
|
|
346970b471 | ||
|
|
e6d3c257e8 | ||
|
|
7224ef8848 | ||
|
|
dd9a0071d2 | ||
|
|
65b4b2d23e | ||
|
|
4fedc7f23f | ||
|
|
26b3e28171 | ||
|
|
29765c7bab | ||
|
|
370938c9f9 | ||
|
|
08d407f041 | ||
|
|
d6de147661 | ||
|
|
9cadbdec2b | ||
|
|
5e61be9853 | ||
|
|
ff50ec65d0 | ||
|
|
714b2580a3 | ||
|
|
22343385f6 | ||
|
|
d0351bad70 | ||
|
|
7ca371ae43 | ||
|
|
7fa0d22583 | ||
|
|
6e535f2403 | ||
|
|
885c9433ce | ||
|
|
b0c132c28f | ||
|
|
8765770071 | ||
|
|
8083ae9052 | ||
|
|
a95fca3682 | ||
|
|
0c8345d1e2 | ||
|
|
27520e9aa6 | ||
|
|
3cdaa03e5d | ||
|
|
fe5a93160f | ||
|
|
88ba4f9198 | ||
|
|
2594e5d334 | ||
|
|
ce9fc85d0b | ||
|
|
2499db77f1 | ||
|
|
8edbef3965 | ||
|
|
2e23675425 | ||
|
|
fef272e30f | ||
|
|
391d5bed5f | ||
|
|
8161e90fbd | ||
|
|
a074e72b9b | ||
|
|
d4a496eb1c | ||
|
|
a23e241480 | ||
|
|
af424103f4 | ||
|
|
d68cfe0486 | ||
|
|
0f15095129 | ||
|
|
6e0e7e4de1 | ||
|
|
07f7bd24d5 | ||
|
|
04074ff372 | ||
|
|
d3dac756d6 | ||
|
|
6f9ae13757 | ||
|
|
0a33ae8d37 | ||
|
|
ac33816675 | ||
|
|
77e95ad344 | ||
|
|
bb25cbe5e2 | ||
|
|
71c0bff3e0 | ||
|
|
c7a71381b7 | ||
|
|
5a1fd19abc | ||
|
|
a48a6da494 | ||
|
|
b0a803a7a5 | ||
|
|
6e4bb58dfd | ||
|
|
66b0f139a9 | ||
|
|
567562f132 | ||
|
|
39feeb94d0 | ||
|
|
75ac2081b0 | ||
|
|
36a94156c1 | ||
|
|
e3db003bbc | ||
|
|
33a66dce1f | ||
|
|
a013385d35 | ||
|
|
ba7ef3c85d | ||
|
|
73e144278e | ||
|
|
e3d2a90af8 | ||
|
|
1d5466fdfd | ||
|
|
a749a9ca63 | ||
|
|
6d8817d1fe | ||
|
|
1a845fdabc | ||
|
|
e52c4f7d4b | ||
|
|
5f435b1e82 | ||
|
|
f608685ac8 | ||
|
|
dbbd37e59e | ||
|
|
482650dec6 | ||
|
|
cc22b87cf1 | ||
|
|
8826b0137a | ||
|
|
d4d76b2e8d | ||
|
|
994ee18f13 | ||
|
|
80532e94f1 |
@@ -19,6 +19,9 @@ engines:
|
||||
languages:
|
||||
- ruby
|
||||
- javascript
|
||||
exclude_fingerprints:
|
||||
- 16dbcb58d6caa7ccfe241417831ecfa6
|
||||
- 7d7dca4f27f50e3084f203280073cc74
|
||||
fixme:
|
||||
enabled: true
|
||||
exclude_fingerprints: # rubocop_todo filename
|
||||
|
||||
4
.haml-lint.yml
Normal file
4
.haml-lint.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
linters:
|
||||
LineLength:
|
||||
max: 120
|
||||
|
||||
@@ -37,7 +37,7 @@ Metrics/MethodLength:
|
||||
# Remove the following once the code style matches
|
||||
# Offense count: 59
|
||||
Metrics/AbcSize:
|
||||
Max: 38
|
||||
Max: 32
|
||||
|
||||
# Offense count: 5
|
||||
# Configuration parameters: CountComments.
|
||||
@@ -47,7 +47,7 @@ Metrics/BlockLength:
|
||||
# Offense count: 6
|
||||
# Configuration parameters: CountComments.
|
||||
Metrics/ClassLength:
|
||||
Max: 275
|
||||
Max: 269
|
||||
|
||||
# Offense count: 6
|
||||
Metrics/CyclomaticComplexity:
|
||||
@@ -58,7 +58,7 @@ Metrics/LineLength:
|
||||
|
||||
# Offense count: 8
|
||||
Metrics/PerceivedComplexity:
|
||||
Max: 10
|
||||
Max: 9
|
||||
|
||||
# See https://github.com/bbatsov/rubocop/issues/3629
|
||||
Rails/HttpPositionalArguments:
|
||||
@@ -75,4 +75,4 @@ Style/FrozenStringLiteralComment:
|
||||
Rails/Output:
|
||||
Exclude:
|
||||
- 'config/unicorn.rb'
|
||||
- 'db/seeds.rb'
|
||||
- 'db/seeds.rb'
|
||||
|
||||
@@ -28,6 +28,7 @@ before_script:
|
||||
- bundle exec rake assets:precompile
|
||||
script:
|
||||
- bundle exec rubocop --display-cop-names --rails
|
||||
- bundle exec haml-lint app/views/account_types app/views/admin app/views/alternate_names app/views/account_types app/views/comments app/views/crops app/views/forums app/views/gardens app/views/harvests app/views/notifier app/views/orders app/views/photos
|
||||
- script/gemfile_check
|
||||
- bundle exec script/check_contributors_md
|
||||
- bundle exec rake db:migrate --trace
|
||||
|
||||
@@ -54,6 +54,8 @@ submit the change with your pull request.
|
||||
- Rocky Jaiswal / [rocky-jaiswal](https://github.com/rocky-jaiswal)
|
||||
- Robert Landreaux / [robertlandreaux](https://github.com/robertlandreaux)
|
||||
- Savant Krishna / [sksavant](https://github.com/sksavant)
|
||||
- Marlena Compton / [marlena](https://github/marlena)
|
||||
- Ryan Dy / [rdy](https://github/rdy)
|
||||
- Jake Yesbeck / [yez](https://github.com/yez)
|
||||
- Mauricio Gonzalez / [mauricio-gonzalez](https://github.com/mauricio-gonzalez)
|
||||
- Andrey Bazhutkin / [andrba](https://github.com/andrba)
|
||||
@@ -73,3 +75,4 @@ submit the change with your pull request.
|
||||
- Kristine Nicole Polvoriza / [polveenomials](https://github.com/polveenomials)
|
||||
- Brenda Wallace / [br3nda](https://github.com/br3nda)
|
||||
- Jim Stallings / [jestallin](https://github.com/jestallin)
|
||||
- Alyssa Ransbury / [alran](https://github.com/alran)
|
||||
|
||||
5
Gemfile
5
Gemfile
@@ -68,6 +68,9 @@ gem 'omniauth-facebook'
|
||||
gem 'omniauth-flickr', '>= 0.0.15'
|
||||
gem 'omniauth-twitter'
|
||||
|
||||
# For charting data
|
||||
gem 'd3-rails'
|
||||
|
||||
# client for Elasticsearch. Elasticsearch is a flexible
|
||||
# and powerful, distributed, real-time search and analytics engine.
|
||||
# An example of the use in the project is fuzzy crop search.
|
||||
@@ -116,8 +119,10 @@ group :development, :test do
|
||||
gem 'database_cleaner', '~> 1.5.0'
|
||||
gem 'factory_girl_rails' # for creating test data
|
||||
gem 'haml-i18n-extractor'
|
||||
gem 'haml_lint' # Checks haml files for goodness
|
||||
gem 'haml-rails' # HTML templating language
|
||||
gem 'i18n-tasks' # adds tests for finding missing and unused translations
|
||||
gem 'jasmine' # javascript unit testing
|
||||
gem 'poltergeist' # for headless JS testing
|
||||
gem 'rspec-activemodel-mocks'
|
||||
gem 'rspec-rails' # unit testing framework
|
||||
|
||||
18
Gemfile.lock
18
Gemfile.lock
@@ -131,6 +131,8 @@ GEM
|
||||
tins (~> 1.6)
|
||||
csv_shaper (1.3.0)
|
||||
activesupport (>= 3.0.0)
|
||||
d3-rails (3.4.13)
|
||||
railties (>= 3.1)
|
||||
dalli (2.7.6)
|
||||
database_cleaner (1.5.3)
|
||||
debug_inspector (0.0.2)
|
||||
@@ -215,6 +217,11 @@ GEM
|
||||
haml (>= 4.0.6, < 5.0)
|
||||
html2haml (>= 1.0.1)
|
||||
railties (>= 4.0.1)
|
||||
haml_lint (0.20.0)
|
||||
haml (~> 4.0)
|
||||
rake (>= 10, < 13)
|
||||
rubocop (>= 0.47.0)
|
||||
sysexits (~> 1.1)
|
||||
hashie (3.4.6)
|
||||
heroku-api (0.4.2)
|
||||
excon (~> 0.45)
|
||||
@@ -238,6 +245,12 @@ GEM
|
||||
parser (>= 2.2.3.0)
|
||||
term-ansicolor (>= 1.3.2)
|
||||
terminal-table (>= 1.5.1)
|
||||
jasmine (2.5.1)
|
||||
jasmine-core (>= 2.5.1, < 3.0.0)
|
||||
phantomjs
|
||||
rack (>= 1.2.1)
|
||||
rake
|
||||
jasmine-core (2.5.2)
|
||||
jquery-rails (4.2.2)
|
||||
rails-dom-testing (>= 1, < 3)
|
||||
railties (>= 4.2.0)
|
||||
@@ -322,6 +335,7 @@ GEM
|
||||
parser (2.3.3.1)
|
||||
ast (~> 2.2)
|
||||
pg (0.19.0)
|
||||
phantomjs (2.1.1.0)
|
||||
plupload-rails (1.2.1)
|
||||
rails (>= 3.1)
|
||||
poltergeist (1.11.0)
|
||||
@@ -456,6 +470,7 @@ GEM
|
||||
actionpack (>= 4.0)
|
||||
activesupport (>= 4.0)
|
||||
sprockets (>= 3.0.0)
|
||||
sysexits (1.2.0)
|
||||
term-ansicolor (1.4.0)
|
||||
tins (~> 1.0)
|
||||
terminal-table (1.7.3)
|
||||
@@ -514,6 +529,7 @@ DEPENDENCIES
|
||||
comfortable_mexican_sofa (~> 1.12.0)
|
||||
coveralls
|
||||
csv_shaper
|
||||
d3-rails
|
||||
dalli
|
||||
database_cleaner (~> 1.5.0)
|
||||
devise (>= 4.0.0)
|
||||
@@ -533,8 +549,10 @@ DEPENDENCIES
|
||||
haml
|
||||
haml-i18n-extractor
|
||||
haml-rails
|
||||
haml_lint
|
||||
heroku-api
|
||||
i18n-tasks
|
||||
jasmine
|
||||
jquery-rails
|
||||
jquery-ui-rails (~> 5.0.2)
|
||||
js-routes
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//= require graphs/horizontal_bar_graph
|
||||
|
||||
if (document.getElementById("cropmap") !== null) {
|
||||
mapbox_map_id = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.mapbox_map_id %>";
|
||||
mapbox_access_token = "<%= Rails.env == 'test' ? 0 : Growstuff::Application.config.mapbox_access_token %>";
|
||||
@@ -49,6 +51,41 @@ function showCropMap(cropmap) {
|
||||
cropmap.addLayer(markers);
|
||||
}
|
||||
|
||||
function plantingStats(crop) {
|
||||
var sunniness_counts = { 'empty': 0, 'sun': 0, 'semi-shade': 0, 'shade': 0 };
|
||||
$.each(crop.plantings, function(i, planting) {
|
||||
if (planting.sunniness) {
|
||||
sunniness_counts[planting.sunniness]++;
|
||||
} else {
|
||||
sunniness_counts['Empty']++;
|
||||
}
|
||||
});
|
||||
return [
|
||||
{name: 'Empty', value: sunniness_counts['empty']},
|
||||
{name: 'Sun', value: sunniness_counts['sun']},
|
||||
{name: 'Semi-shade', value: sunniness_counts['semi-shade']},
|
||||
{name: 'Shade', value: sunniness_counts['shade']}
|
||||
];
|
||||
}
|
||||
|
||||
if ($("#sunchart")[0] !== null) {
|
||||
var HorizontalBarGraph = growstuff.HorizontalBarGraph;
|
||||
$.getJSON(location.pathname + '.json', function (crop) {
|
||||
data = {
|
||||
bars: plantingStats(crop),
|
||||
bar_color: 'steelblue',
|
||||
width: {size: 300, scale: 'linear'},
|
||||
height: {size: 100, scale: 'ordinal'},
|
||||
//left is used to shift the bars over so that there is
|
||||
//room for the labels
|
||||
margin: {top: 0, right: 0, bottom: 0, left: 100}
|
||||
};
|
||||
|
||||
var graph = new HorizontalBarGraph(data);
|
||||
graph.render(d3.select($('#sunchart')[0]));
|
||||
});
|
||||
}
|
||||
|
||||
$('.btn.toggle.crop-hierarchy').click(function () {
|
||||
$('.toggle.crop-hierarchy').toggleClass('hide');
|
||||
});
|
||||
|
||||
50
app/assets/javascripts/graphs/bar_group.js
Normal file
50
app/assets/javascripts/graphs/bar_group.js
Normal file
@@ -0,0 +1,50 @@
|
||||
//= require graphs/width_scale
|
||||
//= require graphs/height_scale
|
||||
|
||||
(function(){
|
||||
'use strict';
|
||||
|
||||
/*
|
||||
This represents bars for a bar graph.
|
||||
Currently these are used for HorizontalBarGraph.
|
||||
*/
|
||||
|
||||
var growstuff = (window.growstuff = window.growstuff || {});
|
||||
var WidthScale = growstuff.WidthScale;
|
||||
var HeightScale = growstuff.HeightScale;
|
||||
|
||||
function BarGroup(data) {
|
||||
this._data = data;
|
||||
}
|
||||
|
||||
BarGroup.prototype.render = function(root){
|
||||
|
||||
var data = this._data;
|
||||
var bars = this._data.bars;
|
||||
var widthScale = new WidthScale(data).render();
|
||||
var heightScale = new HeightScale(data).render();
|
||||
|
||||
return root.append('g')
|
||||
.attr("class", "bar")
|
||||
.selectAll("rect")
|
||||
.data(bars.map(function(bar) { return bar.value; }))
|
||||
.enter()
|
||||
.append("rect")
|
||||
.attr("y", function(d, i){
|
||||
return heightScale(i);
|
||||
|
||||
})
|
||||
.attr("height", heightScale.rangeBand())
|
||||
.attr("fill", data.bar_color)
|
||||
.attr("width", function(d){
|
||||
return widthScale(d);
|
||||
})
|
||||
.append("title")
|
||||
.text(function(d){
|
||||
return 'This value is ' + d + '.';
|
||||
});
|
||||
};
|
||||
|
||||
growstuff.BarGroup = BarGroup;
|
||||
|
||||
}());
|
||||
40
app/assets/javascripts/graphs/bar_label_group.js
Normal file
40
app/assets/javascripts/graphs/bar_label_group.js
Normal file
@@ -0,0 +1,40 @@
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
/*
|
||||
This file draws the labels to the left of each bar.
|
||||
*/
|
||||
|
||||
var growstuff = (window.growstuff = window.growstuff || {});
|
||||
|
||||
function BarLabelGroup(data) {
|
||||
this._data = data;
|
||||
}
|
||||
|
||||
BarLabelGroup.prototype.render = function(d3){
|
||||
var bars = this._data.bars;
|
||||
//vvcopy pasta from spike vv -- this is a good candidate for refactor
|
||||
var barHeight = 40;
|
||||
|
||||
return d3.append('g')
|
||||
.attr("class", "bar-label")
|
||||
.selectAll("text")
|
||||
.data(bars.map(function(bar){ return bar.name;}))
|
||||
.enter()
|
||||
.append("text")
|
||||
.attr('x', -80)
|
||||
.attr('y', function(d, i){
|
||||
//shrink the margin between each label to give them an even spread with
|
||||
//bars
|
||||
var barLabelSpread = 2/3;
|
||||
//move them downward to line up with bars
|
||||
var barLabelTopEdge = 17;
|
||||
return i * barHeight * (barLabelSpread) + barLabelTopEdge;
|
||||
})
|
||||
.text(function(d){return d});
|
||||
|
||||
};
|
||||
|
||||
growstuff.BarLabelGroup = BarLabelGroup;
|
||||
|
||||
}())
|
||||
29
app/assets/javascripts/graphs/height_scale.js
Normal file
29
app/assets/javascripts/graphs/height_scale.js
Normal file
@@ -0,0 +1,29 @@
|
||||
//=require d3
|
||||
|
||||
/*
|
||||
Height Scale is used to map the number of bars to the display size of
|
||||
the svg
|
||||
*/
|
||||
|
||||
(function(){
|
||||
'use strict';
|
||||
|
||||
var growstuff = (window.growstuff = window.growstuff || {});
|
||||
|
||||
function HeightScale(data){
|
||||
this._data = data;
|
||||
}
|
||||
|
||||
HeightScale.prototype.render = function(){
|
||||
var data = this._data;
|
||||
var scaleType = data.height.scale;
|
||||
var axisSize = data.height.size;
|
||||
|
||||
return d3.scale[scaleType]()
|
||||
.domain(d3.range(data.bars.length))
|
||||
.rangeRoundBands([0, data.height.size], 0.05, 0);
|
||||
};
|
||||
|
||||
growstuff.HeightScale = HeightScale;
|
||||
|
||||
}());
|
||||
51
app/assets/javascripts/graphs/horizontal_bar_graph.js
Normal file
51
app/assets/javascripts/graphs/horizontal_bar_graph.js
Normal file
@@ -0,0 +1,51 @@
|
||||
//= require d3
|
||||
//= require graphs/bar_group
|
||||
//= require graphs/bar_label_group
|
||||
|
||||
/*
|
||||
Horizontal Bar Graph represents sum total of the graph including all of the parts:
|
||||
Bars
|
||||
Bar Labels
|
||||
|
||||
The main dimensions of the graph are rendered here.
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
var growstuff = (window.growstuff = window.growstuff || {});
|
||||
var BarGroup = growstuff.BarGroup;
|
||||
var BarLabelGroup = growstuff.BarLabelGroup;
|
||||
|
||||
function HorizontalBarGraph(data) {
|
||||
this._data = data;
|
||||
this._d3 = d3;
|
||||
}
|
||||
|
||||
HorizontalBarGraph.prototype.render = function(root) {
|
||||
var bars = this._data.bars;
|
||||
var width = this._data.width;
|
||||
var height = this._data.height;
|
||||
|
||||
var barLabelGroup = new BarLabelGroup(this._data);
|
||||
var margin = this._data.margin;
|
||||
|
||||
var barGroup = new BarGroup(this._data);
|
||||
|
||||
var svg = root
|
||||
.append("svg")
|
||||
.attr("width", width.size + margin.left + margin.right)
|
||||
.attr("height", height.size + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("class","bar-graph")
|
||||
.attr("transform","translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
barGroup.render(svg);
|
||||
barLabelGroup.render(svg);
|
||||
|
||||
return svg;
|
||||
};
|
||||
|
||||
growstuff.HorizontalBarGraph = HorizontalBarGraph;
|
||||
}());
|
||||
33
app/assets/javascripts/graphs/width_scale.js
Normal file
33
app/assets/javascripts/graphs/width_scale.js
Normal file
@@ -0,0 +1,33 @@
|
||||
//=require d3
|
||||
|
||||
/*
|
||||
Width scale is used to map the value for the length of each bar
|
||||
to the display size of the svg
|
||||
*/
|
||||
|
||||
(function(){
|
||||
'use strict';
|
||||
|
||||
var growstuff = (window.growstuff = window.growstuff || {});
|
||||
|
||||
function WidthScale (data){
|
||||
this._data = data;
|
||||
}
|
||||
|
||||
WidthScale.prototype.render = function() {
|
||||
var data = this._data;
|
||||
var scaleType = data.width.scale;
|
||||
var axisSize = data.width.size;
|
||||
|
||||
return d3.scale[scaleType]()
|
||||
.domain([0, this.getMaxValue()])
|
||||
.range([0, axisSize]);
|
||||
};
|
||||
|
||||
WidthScale.prototype.getMaxValue = function(){
|
||||
return d3.max(this._data.bars.map(function(bar) { return bar.value; }));
|
||||
}
|
||||
|
||||
growstuff.WidthScale = WidthScale;
|
||||
|
||||
}());
|
||||
18
app/assets/javascripts/posts.js
Normal file
18
app/assets/javascripts/posts.js
Normal file
@@ -0,0 +1,18 @@
|
||||
$(document).ready(function () {
|
||||
$('.post-like').show();
|
||||
|
||||
$('.post-like').on('ajax:success', function(event, data) {
|
||||
var like_control = $('#post-' + data.id + ' .post-like');
|
||||
|
||||
$('#post-' + data.id + ' .like-count').text(data.description);
|
||||
if (data.liked_by_member) {
|
||||
like_control.data("method", "delete");
|
||||
like_control.attr("href", data.url);
|
||||
like_control.text("Unlike");
|
||||
} else {
|
||||
like_control.data("method", "post");
|
||||
like_control.attr("href", '/likes.json?post_id=' + data.id);
|
||||
like_control.text("Like");
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -5,3 +5,4 @@
|
||||
@import 'leaflet.markercluster.default'
|
||||
@import 'custom_bootstrap/custom_bootstrap'
|
||||
@import 'overrides'
|
||||
@import 'graphs'
|
||||
|
||||
@@ -11,12 +11,13 @@ $brown: #413f3b
|
||||
$green: #5f8e43
|
||||
$blue: #2f4365
|
||||
$red: #8e4d43
|
||||
$orange: #b2685c
|
||||
$orange: #ffa500
|
||||
$yellow: #b2935c
|
||||
|
||||
$body-bg: $beige
|
||||
$text-color: $brown
|
||||
$link-color: $green
|
||||
$graph-hover: $orange
|
||||
|
||||
$brand-primary: $green
|
||||
|
||||
|
||||
2
app/assets/stylesheets/graphs.sass
Normal file
2
app/assets/stylesheets/graphs.sass
Normal file
@@ -0,0 +1,2 @@
|
||||
.bar rect:hover
|
||||
fill: $graph-hover
|
||||
@@ -319,9 +319,6 @@ $state-success-bg: lighten($green, 50%)
|
||||
text-overflow: ellipsis
|
||||
overflow: hidden
|
||||
|
||||
#gardens_panel_body
|
||||
height: 20em
|
||||
|
||||
.form-group.required .control-label:before
|
||||
content: "* "
|
||||
color: red
|
||||
|
||||
@@ -7,13 +7,12 @@ class ApplicationController < ActionController::Base
|
||||
before_action :set_locale
|
||||
|
||||
def store_location
|
||||
if (request.path != "/members/sign_in" &&
|
||||
request.path != "/members/sign_up" &&
|
||||
request.path != "/members/password/new" &&
|
||||
request.path != "/members/password/edit" &&
|
||||
request.path != "/members/confirmation" &&
|
||||
request.path != "/members/sign_out" &&
|
||||
!request.xhr?)
|
||||
unless (request.path.in?(["/members/sign_in",
|
||||
"/members/sign_up",
|
||||
"/members/password/new",
|
||||
"/members/password/edit",
|
||||
"/members/confirmation",
|
||||
"/members/sign_out"]) || request.xhr?)
|
||||
store_location_for(:member, request.fullpath)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -16,6 +16,8 @@ class CropsController < ApplicationController
|
||||
end
|
||||
@paginated_crops = @crops.approved.paginate(page: params[:page])
|
||||
|
||||
@has_requested_pending = Crop.pending_approval.where(requester: current_member).count if current_member
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.json { render json: @crops }
|
||||
@@ -31,6 +33,10 @@ class CropsController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
def requested
|
||||
@requested = Crop.pending_approval.where(requester: current_member).paginate(page: params[:page])
|
||||
end
|
||||
|
||||
# GET /crops/wrangle
|
||||
def wrangle
|
||||
@approval_status = params[:approval_status]
|
||||
@@ -138,7 +144,7 @@ class CropsController < ApplicationController
|
||||
end
|
||||
unless current_member.role? :crop_wrangler
|
||||
Role.crop_wranglers.each do |w|
|
||||
Notifier.new_crop_request(w, @crop).deliver_later!
|
||||
Notifier.new_crop_request(w, @crop).deliver_now!
|
||||
end
|
||||
end
|
||||
|
||||
@@ -166,8 +172,8 @@ class CropsController < ApplicationController
|
||||
if previous_status == "pending"
|
||||
requester = @crop.requester
|
||||
new_status = @crop.approval_status
|
||||
Notifier.crop_request_approved(requester, @crop).deliver_later! if new_status == "approved"
|
||||
Notifier.crop_request_rejected(requester, @crop).deliver_later! if new_status == "rejected"
|
||||
Notifier.crop_request_approved(requester, @crop).deliver_now! if new_status == "approved"
|
||||
Notifier.crop_request_rejected(requester, @crop).deliver_now! if new_status == "rejected"
|
||||
end
|
||||
format.html { redirect_to @crop, notice: 'Crop was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
|
||||
@@ -6,11 +6,8 @@ class GardensController < ApplicationController
|
||||
# GET /gardens.json
|
||||
def index
|
||||
@owner = Member.find_by(slug: params[:owner])
|
||||
@gardens = if @owner
|
||||
@owner.gardens.paginate(page: params[:page])
|
||||
else
|
||||
Garden.paginate(page: params[:page])
|
||||
end
|
||||
@show_all = params[:all] == '1'
|
||||
@gardens = gardens
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
@@ -93,4 +90,12 @@ class GardensController < ApplicationController
|
||||
params.require(:garden).permit(:name, :slug, :owner_id, :description, :active,
|
||||
:location, :latitude, :longitude, :area, :area_unit)
|
||||
end
|
||||
|
||||
def gardens
|
||||
g = @owner ? @owner.gardens : Garden.all
|
||||
g = g.active unless @show_all
|
||||
g = g.includes(:owner).order(:name)
|
||||
g = g.paginate(page: params[:page])
|
||||
g
|
||||
end
|
||||
end
|
||||
|
||||
71
app/controllers/likes_controller.rb
Normal file
71
app/controllers/likes_controller.rb
Normal file
@@ -0,0 +1,71 @@
|
||||
class LikesController < ApplicationController
|
||||
before_action :authenticate_member!, except: :index
|
||||
|
||||
respond_to :html, :json
|
||||
|
||||
def create
|
||||
@like = Like.new
|
||||
@like.member = current_member
|
||||
@like.likeable = find_likeable
|
||||
|
||||
respond_to do |format|
|
||||
if @like.save
|
||||
format.html { redirect_to @like.likeable }
|
||||
format.json do
|
||||
render(
|
||||
json: {
|
||||
id: @like.likeable.id,
|
||||
liked_by_member: true,
|
||||
description: ActionController::Base.helpers.pluralize(@like.likeable.likes.count, "like"),
|
||||
url: like_path(@like, format: :json)
|
||||
},
|
||||
status: 201
|
||||
)
|
||||
end
|
||||
else
|
||||
format.html do
|
||||
flash[:error] = 'Unable to like'
|
||||
redirect_to @like.likeable
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
like = Like.find(params[:id])
|
||||
likeable = like.likeable
|
||||
respond_to do |format|
|
||||
if like.destroy
|
||||
format.html { redirect_to likeable }
|
||||
format.json do
|
||||
render(
|
||||
json: {
|
||||
id: likeable.id,
|
||||
liked_by_member: false,
|
||||
description: ActionController::Base.helpers.pluralize(likeable.likes.count, "like"),
|
||||
url: likes_path(Like.new, "#{likeable.class.name.underscore}_id", likeable.id, format: :json)
|
||||
},
|
||||
status: 200
|
||||
)
|
||||
end
|
||||
else
|
||||
format.html do
|
||||
flash[:error] = 'Unable to unlike'
|
||||
redirect_to likeable
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_likeable
|
||||
params.each do |name, value|
|
||||
return Regexp.last_match[1].classify.constantize.find(value) if name =~ /(.+)_id$/
|
||||
end
|
||||
end
|
||||
|
||||
def like_params
|
||||
params.require(:like).permit(:member, :likeable)
|
||||
end
|
||||
end
|
||||
@@ -30,6 +30,7 @@ class MembersController < ApplicationController
|
||||
@flickr_auth = @member.auth('flickr')
|
||||
@facebook_auth = @member.auth('facebook')
|
||||
@posts = @member.posts
|
||||
@gardens = @member.gardens.active.order(:name)
|
||||
# The garden form partial is called from the "New Garden" tab;
|
||||
# it requires a garden to be passed in @garden.
|
||||
# The new garden is not persisted unless Garden#save is called.
|
||||
|
||||
@@ -23,22 +23,21 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
||||
action = Growstuff::OauthSignupAction.new
|
||||
|
||||
@authentication = nil
|
||||
if auth
|
||||
member = action.find_or_create_from_authorization(auth)
|
||||
@authentication = action.establish_authentication(auth, member)
|
||||
|
||||
unless action.member_created?
|
||||
sign_in_and_redirect member, event: :authentication # this will throw if @user is not activated
|
||||
set_flash_message(:notice, :success, kind: auth['provider']) if is_navigational_format?
|
||||
else
|
||||
raise "Invalid provider" unless ['facebook', 'twitter', 'flickr'].index(auth['provider'].to_s)
|
||||
return redirect_to request.env['omniauth.origin'] || edit_member_registration_path unless auth
|
||||
|
||||
session["devise.#{auth['provider']}_data"] = request.env["omniauth.auth"]
|
||||
sign_in member
|
||||
redirect_to finish_signup_url(member)
|
||||
end
|
||||
member = action.find_or_create_from_authorization(auth)
|
||||
@authentication = action.establish_authentication(auth, member)
|
||||
|
||||
unless action.member_created?
|
||||
sign_in_and_redirect member, event: :authentication # this will throw if @user is not activated
|
||||
set_flash_message(:notice, :success, kind: auth['provider']) if is_navigational_format?
|
||||
else
|
||||
redirect_to request.env['omniauth.origin'] || edit_member_registration_path
|
||||
raise "Invalid provider" unless ['facebook', 'twitter', 'flickr'].index(auth['provider'].to_s)
|
||||
|
||||
session["devise.#{auth['provider']}_data"] = request.env["omniauth.auth"]
|
||||
sign_in member
|
||||
redirect_to finish_signup_url(member)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -124,16 +124,14 @@ class PlantingsController < ApplicationController
|
||||
end
|
||||
|
||||
def plantings
|
||||
@plantings = if @owner
|
||||
@owner.plantings
|
||||
elsif @crop
|
||||
@crop.plantings
|
||||
else
|
||||
Planting
|
||||
end
|
||||
|
||||
@plantings = @plantings.current unless @show_all
|
||||
@plantings = @plantings.includes(:owner, :crop, :garden).order(:created_at).paginate(page: params[:page])
|
||||
@plantings
|
||||
p = if @owner
|
||||
@owner.plantings
|
||||
elsif @crop
|
||||
@crop.plantings
|
||||
else
|
||||
Planting
|
||||
end
|
||||
p = p.current unless @show_all
|
||||
p.includes(:owner, :crop, :garden).order(:created_at).paginate(page: params[:page])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,13 +7,7 @@ class SeedsController < ApplicationController
|
||||
def index
|
||||
@owner = Member.find_by(slug: params[:owner])
|
||||
@crop = Crop.find_by(slug: params[:crop])
|
||||
@seeds = if @owner
|
||||
@owner.seeds.includes(:owner, :crop).paginate(page: params[:page])
|
||||
elsif @crop
|
||||
@crop.seeds.includes(:owner, :crop).paginate(page: params[:page])
|
||||
else
|
||||
Seed.includes(:owner, :crop).paginate(page: params[:page])
|
||||
end
|
||||
@seeds = seeds(owner: @owner, crop: @crop)
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
@@ -109,4 +103,14 @@ class SeedsController < ApplicationController
|
||||
:days_until_maturity_min, :days_until_maturity_max, :organic, :gmo,
|
||||
:heirloom, :tradable_to, :slug)
|
||||
end
|
||||
|
||||
def seeds(owner: nil, crop: nil)
|
||||
if owner
|
||||
owner.seeds
|
||||
elsif crop
|
||||
crop.seeds
|
||||
else
|
||||
Seed
|
||||
end.includes(:owner, :crop).paginate(page: params[:page])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -81,4 +81,29 @@ module ApplicationHelper
|
||||
model_name = model.model_name.human(count: size)
|
||||
"#{size} #{model_name}"
|
||||
end
|
||||
|
||||
def show_inactive_tickbox_path(type, owner, show_all)
|
||||
all = show_all ? '' : 1
|
||||
if owner
|
||||
plantings_by_owner_path(owner: owner.slug, all: all) if type == 'plantings'
|
||||
gardens_by_owner_path(owner: owner.slug, all: all) if type == 'gardens'
|
||||
else
|
||||
plantings_path(all: all) if type == 'plantings'
|
||||
gardens_path(all: all) if type == 'gardens'
|
||||
end
|
||||
end
|
||||
|
||||
def title(type, owner, crop)
|
||||
if owner
|
||||
t(".title.owner_#{type}", owner: owner.login_name)
|
||||
elsif crop
|
||||
t(".title.crop_#{type}", crop: crop.name)
|
||||
else
|
||||
t(".title.default")
|
||||
end
|
||||
end
|
||||
|
||||
def og_description(description)
|
||||
strip_tags(description).split(' ')[0..20].join(' ')
|
||||
end
|
||||
end
|
||||
|
||||
@@ -18,4 +18,8 @@ module CropsHelper
|
||||
"You have an unknown quantity of seeds of this crop."
|
||||
end
|
||||
end
|
||||
|
||||
def crop_ebay_seeds_url(crop)
|
||||
"http://rover.ebay.com/rover/1/705-53470-19255-0/1?icep_ff3=9&pub=5575213277&toolid=10001&campid=5337940151&customid=&icep_uq=#{URI.escape crop.name}&icep_sellerId=&icep_ex_kw=&icep_sortBy=12&icep_catId=181003&icep_minPrice=&icep_maxPrice=&ipn=psmain&icep_vectorid=229515&kwid=902099&mtid=824&kw=lg" # rubocop:disable Metrics/LineLength
|
||||
end
|
||||
end
|
||||
|
||||
@@ -9,6 +9,10 @@ module GardensHelper
|
||||
end
|
||||
end
|
||||
|
||||
def gardens_active_tickbox_path(owner, show_all)
|
||||
show_inactive_tickbox_path('gardens', owner, show_all)
|
||||
end
|
||||
|
||||
def display_garden_name(garden)
|
||||
truncate(garden.name, length: 50, separator: ' ', omission: '... ')
|
||||
end
|
||||
|
||||
@@ -28,7 +28,7 @@ module HarvestsHelper
|
||||
end
|
||||
|
||||
def display_harvest_description(harvest)
|
||||
return "No description provided." if harvest.description.empty?
|
||||
return "No description provided." if harvest.description.nil?
|
||||
harvest.description
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
module PlantingsHelper
|
||||
def display_days_before_maturity(planting)
|
||||
if planting.finished?
|
||||
"0"
|
||||
elsif !planting.finished_at.nil?
|
||||
((p = planting.finished_at - Date.current).to_i) <= 0 ? "0" : p.to_i.to_s
|
||||
elsif planting.planted_at.nil? || planting.days_before_maturity.nil?
|
||||
"unknown"
|
||||
# First try to calc from finished/finished_at
|
||||
if planting.finished? || planting.finished_at.present?
|
||||
planting.days_until_finished.to_s
|
||||
# then try to calc from planted at + maturity
|
||||
elsif planting.planted_at.present? && planting.days_before_maturity.present?
|
||||
planting.days_until_mature.to_s
|
||||
else
|
||||
((p = (planting.planted_at + planting.days_before_maturity) - Date.current).to_i <= 0) ? "0" : p.to_i.to_s
|
||||
"unknown"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -40,4 +40,8 @@ module PlantingsHelper
|
||||
"#{planting.owner}."
|
||||
end
|
||||
end
|
||||
|
||||
def plantings_active_tickbox_path(owner, show_all)
|
||||
show_inactive_tickbox_path('plantings', owner, show_all)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -40,6 +40,7 @@ class Ability
|
||||
|
||||
# members can see even rejected or pending crops if they requested it
|
||||
can :read, Crop, requester_id: member.id
|
||||
can :requested, Crop # see list of crops they've requested
|
||||
|
||||
# managing your own user settings
|
||||
can :update, Member, id: member.id
|
||||
|
||||
8
app/models/concerns/likeable.rb
Normal file
8
app/models/concerns/likeable.rb
Normal file
@@ -0,0 +1,8 @@
|
||||
module Likeable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
has_many :likes, as: :likeable, dependent: :destroy
|
||||
has_many :members, through: :likes
|
||||
end
|
||||
end
|
||||
@@ -163,11 +163,11 @@ class Crop < ActiveRecord::Base
|
||||
# key: plant part (eg. 'fruit')
|
||||
# value: count of how many times it's been used by harvests
|
||||
def popular_plant_parts
|
||||
popular_plant_parts = Hash.new(0)
|
||||
harvests.each do |h|
|
||||
popular_plant_parts[h.plant_part] += 1 if h.plant_part
|
||||
end
|
||||
popular_plant_parts
|
||||
PlantPart.joins(:harvests)
|
||||
.where("crop_id = ?", id)
|
||||
.order("count_harvests_id DESC")
|
||||
.group("plant_parts.id", "plant_parts.name")
|
||||
.count("harvests.id")
|
||||
end
|
||||
|
||||
def interesting?
|
||||
@@ -349,11 +349,11 @@ class Crop < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def count_uses_of_property(col_name)
|
||||
data = Hash.new(0)
|
||||
plantings.each do |p|
|
||||
data[p.send(col_name.to_s)] += 1 unless p.send(col_name.to_s).blank?
|
||||
end
|
||||
data
|
||||
plantings.unscoped
|
||||
.where(crop_id: id)
|
||||
.where.not(col_name => nil)
|
||||
.group(col_name)
|
||||
.count
|
||||
end
|
||||
|
||||
# Custom validations
|
||||
|
||||
@@ -82,32 +82,38 @@ class Harvest < ActiveRecord::Base
|
||||
def to_s
|
||||
# 50 individual apples, weighing 3lb
|
||||
# 2 buckets of apricots, weighing 10kg
|
||||
string = ''
|
||||
if quantity
|
||||
string += "#{number_to_human(quantity.to_s, strip_insignificant_zeros: true)} "
|
||||
string += if unit == 'individual'
|
||||
'individual '
|
||||
elsif quantity == 1
|
||||
"#{unit} of "
|
||||
else
|
||||
"#{unit.pluralize} of "
|
||||
end
|
||||
"#{quantity_to_human} #{unit_to_human} #{crop_name_to_human} #{weight_to_human}".strip
|
||||
end
|
||||
|
||||
def quantity_to_human
|
||||
return number_to_human(quantity.to_s, strip_insignificant_zeros: true) if quantity
|
||||
""
|
||||
end
|
||||
|
||||
def unit_to_human
|
||||
return "" unless quantity
|
||||
if unit == 'individual'
|
||||
'individual'
|
||||
elsif quantity == 1
|
||||
"#{unit} of"
|
||||
else
|
||||
"#{unit.pluralize} of"
|
||||
end
|
||||
end
|
||||
|
||||
string += if unit != 'individual' # buckets of apricot*s*
|
||||
crop.name.pluralize.to_s
|
||||
elsif quantity == 1
|
||||
crop.name.to_s
|
||||
else
|
||||
crop.name.pluralize.to_s
|
||||
end
|
||||
def weight_to_human
|
||||
return "" unless weight_quantity
|
||||
"weighing #{number_to_human(weight_quantity, strip_insignificant_zeros: true)} #{weight_unit}"
|
||||
end
|
||||
|
||||
if weight_quantity
|
||||
string += " weighing #{number_to_human(weight_quantity, strip_insignificant_zeros: true)}"\
|
||||
" #{weight_unit}"
|
||||
end
|
||||
|
||||
string
|
||||
def crop_name_to_human
|
||||
if unit != 'individual' # buckets of apricot*s*
|
||||
crop.name.pluralize
|
||||
elsif quantity == 1
|
||||
crop.name
|
||||
else
|
||||
crop.name.pluralize
|
||||
end.to_s
|
||||
end
|
||||
|
||||
def default_photo
|
||||
|
||||
6
app/models/like.rb
Normal file
6
app/models/like.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
class Like < ActiveRecord::Base
|
||||
belongs_to :member
|
||||
belongs_to :likeable, polymorphic: true
|
||||
validates :member, :likeable, presence: true
|
||||
validates :member, uniqueness: { scope: :likeable }
|
||||
end
|
||||
@@ -27,6 +27,8 @@ class Member < ActiveRecord::Base
|
||||
|
||||
has_many :photos
|
||||
|
||||
has_many :likes, dependent: :destroy
|
||||
|
||||
default_scope { order("lower(login_name) asc") }
|
||||
scope :confirmed, -> { where('confirmed_at IS NOT NULL') }
|
||||
scope :located, -> { where("location <> '' and latitude IS NOT NULL and longitude IS NOT NULL") }
|
||||
@@ -219,16 +221,12 @@ class Member < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def update_newsletter_subscription
|
||||
if confirmed_at_changed? && newsletter # just signed up
|
||||
newsletter_subscribe
|
||||
elsif confirmed_at # i.e. after member's confirmed their account
|
||||
if newsletter_changed? # edited member settings
|
||||
if newsletter
|
||||
newsletter_subscribe
|
||||
else
|
||||
newsletter_unsubscribe
|
||||
end
|
||||
end
|
||||
return unless confirmed_at_changed? || newsletter_changed?
|
||||
|
||||
if newsletter
|
||||
newsletter_subscribe if confirmed_at_changed? || confirmed_at && newsletter_changed?
|
||||
elsif confirmed_at
|
||||
newsletter_unsubscribe
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -21,6 +21,6 @@ class Notification < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def send_email
|
||||
Notifier.notify(self).deliver_later if recipient.send_notification_email
|
||||
Notifier.notify(self).deliver_now! if recipient.send_notification_email
|
||||
end
|
||||
end
|
||||
|
||||
@@ -112,6 +112,17 @@ class Planting < ActiveRecord::Base
|
||||
planted_at.present? && current_date.to_date >= planted_at
|
||||
end
|
||||
|
||||
def days_until_finished
|
||||
return 0 if finished?
|
||||
days = (finished_at - Date.current).to_i
|
||||
days.positive? ? days : 0
|
||||
end
|
||||
|
||||
def days_until_mature
|
||||
days = ((planted_at + days_before_maturity) - Date.current).to_i
|
||||
days.positive? ? days : 0
|
||||
end
|
||||
|
||||
def percentage_grown(current_date = Date.current)
|
||||
return nil unless days_before_maturity && planted?(current_date)
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
class Post < ActiveRecord::Base
|
||||
extend FriendlyId
|
||||
include Likeable
|
||||
friendly_id :author_date_subject, use: [:slugged, :finders]
|
||||
belongs_to :author, class_name: 'Member'
|
||||
belongs_to :forum
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
= form_for @account_type do |f|
|
||||
- if @account_type.errors.any?
|
||||
#error_explanation
|
||||
%h2= "#{pluralize(@account_type.errors.size, "error")} prohibited this account_type from being saved:"
|
||||
%h2
|
||||
= pluralize(@account_type.errors.size, "error")
|
||||
prohibited this account_type from being saved:
|
||||
%ul
|
||||
- @account_type.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-content_for :title, "Editing account type"
|
||||
- content_for :title, "Editing account type"
|
||||
|
||||
= render 'form'
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
%td= account_type.is_permanent_paid
|
||||
%td= link_to 'Show', account_type
|
||||
%td= link_to 'Edit', edit_account_type_path(account_type)
|
||||
%td= link_to 'Destroy', account_type, :method => :delete, :data => { :confirm => 'Are you sure?' }
|
||||
%td= link_to 'Destroy', account_type, method: :delete, data: { confirm: 'Are you sure?' }
|
||||
|
||||
%br
|
||||
|
||||
|
||||
@@ -12,6 +12,6 @@
|
||||
|
||||
= link_to 'Edit', edit_account_type_path(@account_type)
|
||||
\|
|
||||
= link_to 'Delete', @account_type, :method => :delete, :data => { :confirm => 'Are you sure?' }
|
||||
= link_to 'Delete', @account_type, method: :delete, data: { confirm: 'Are you sure?' }
|
||||
\|
|
||||
= link_to 'Back', account_types_path
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
= form_for @account do |f|
|
||||
- if @account.errors.any?
|
||||
#error_explanation
|
||||
%h2= "#{pluralize(@account.errors.size, "error")} prohibited this account from being saved:"
|
||||
%h2
|
||||
= pluralize(@account.errors.size, "error")
|
||||
prohibited this account from being saved:
|
||||
%ul
|
||||
- @account.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
%td= account.paid_until
|
||||
%td= link_to 'Show', account
|
||||
%td= link_to 'Edit', edit_account_path(account)
|
||||
%td= link_to 'Destroy', account, :method => :delete, :data => { :confirm => 'Are you sure?' }
|
||||
%td= link_to 'Destroy', account, method: :delete, data: { confirm: 'Are you sure?' }
|
||||
|
||||
%br
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-content_for :title, 'Admin'
|
||||
- content_for :title, 'Admin'
|
||||
|
||||
%h2 Manage
|
||||
|
||||
@@ -12,4 +12,4 @@
|
||||
|
||||
%h2 Orders
|
||||
|
||||
=render "admin/orders/searchform"
|
||||
= render "admin/orders/searchform"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-content_for :title, 'Newsletter subscribers'
|
||||
- content_for :title, 'Newsletter subscribers'
|
||||
|
||||
%p
|
||||
- @members.each do |m|
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
= form_tag(url_for(:controller => 'admin/orders', :action => 'search'), :method => :get, :class => 'form-inline') do
|
||||
= label_tag :distance, "Search orders:", :class => 'control-label'
|
||||
= form_tag(url_for(controller: 'admin/orders', action: 'search'), method: :get, class: 'form-inline') do
|
||||
= label_tag :distance, "Search orders:", class: 'control-label'
|
||||
= text_field_tag :search_text
|
||||
= select_tag :search_by, options_for_select({'Member' => 'member', 'Referral code' => 'referral_code', 'Order ID' => 'order_id', 'Paypal Token' => 'paypal_token', 'Paypal Payer ID' => 'paypal_payer_id' })
|
||||
= submit_tag "Search", :class => 'btn btn-primary'
|
||||
= select_tag :search_by,
|
||||
options_for_select('Member': 'member', 'Referral code': 'referral_code',
|
||||
'Order ID': 'order_id', 'Paypal Token': 'paypal_token',
|
||||
'Paypal Payer ID': 'paypal_payer_id')
|
||||
= submit_tag "Search", class: 'btn btn-primary'
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
-content_for :title, 'Admin Orders'
|
||||
- content_for :title, 'Admin Orders'
|
||||
|
||||
=render "admin/orders/searchform"
|
||||
= render "admin/orders/searchform"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
-content_for :title, 'Search Orders'
|
||||
- content_for :title, 'Search Orders'
|
||||
|
||||
=render "admin/orders/searchform"
|
||||
= render "admin/orders/searchform"
|
||||
|
||||
- unless @orders.empty?
|
||||
%h2
|
||||
@@ -28,7 +28,7 @@
|
||||
%td
|
||||
= order.referral_code
|
||||
%td
|
||||
- if order.order_items.size > 0
|
||||
- unless order.order_items.empty?
|
||||
- order.order_items.each do |o|
|
||||
= o.quantity
|
||||
x
|
||||
@@ -36,4 +36,4 @@
|
||||
@
|
||||
= price_with_currency(o.price)
|
||||
%br/
|
||||
%td= link_to 'Details', order, :class => 'btn btn-default btn-xs'
|
||||
%td= link_to 'Details', order, class: 'btn btn-default btn-xs'
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
= form_for @alternate_name, :html => {:class => 'form-horizontal', :role => "form"} do |f|
|
||||
= form_for @alternate_name, html: { class: 'form-horizontal', role: "form" } do |f|
|
||||
- if @alternate_name.errors.any?
|
||||
#error_explanation
|
||||
%h2= "#{pluralize(@alternate_name.errors.size, "error")} prohibited this alternate_name from being saved:"
|
||||
%h2
|
||||
= pluralize(@alternate_name.errors.size, "error")
|
||||
prohibited this alternate_name from being saved:
|
||||
%ul
|
||||
- @alternate_name.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
@@ -9,19 +11,22 @@
|
||||
%p
|
||||
%span.help-block
|
||||
For detailed crop wrangling guidelines, please consult the
|
||||
=link_to "crop wrangling guide", "http://wiki.growstuff.org/index.php/Crop_wrangling"
|
||||
= link_to "crop wrangling guide", "http://wiki.growstuff.org/index.php/Crop_wrangling"
|
||||
on the Growstuff wiki.
|
||||
|
||||
.form-group
|
||||
= f.label :crop_id, :class => 'control-label col-md-2'
|
||||
= f.label :crop_id, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= collection_select(:alternate_name, :crop_id, Crop.all, :id, :name, { :selected => @alternate_name.crop_id || @crop.id }, :class => 'form-control')
|
||||
= collection_select(:alternate_name, :crop_id,
|
||||
Crop.all, :id, :name,
|
||||
{ selected: @alternate_name.crop_id || @crop.id },
|
||||
class: 'form-control')
|
||||
|
||||
.form-group
|
||||
= f.label :name, :class => 'control-label col-md-2'
|
||||
= f.label :name, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :name, :class => 'form-control'
|
||||
= f.text_field :name, class: 'form-control'
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit 'Save', :class => 'btn btn-primary'
|
||||
= f.submit 'Save', class: 'btn btn-primary'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
- content_for :title, "Listing alternate names"
|
||||
|
||||
- if can? :create, AlternateName
|
||||
%p= link_to 'New alternate name', new_alternate_name_path, :class => 'btn btn-primary'
|
||||
%p= link_to 'New alternate name', new_alternate_name_path, class: 'btn btn-primary'
|
||||
|
||||
%table
|
||||
%tr
|
||||
@@ -17,7 +17,10 @@
|
||||
%td= link_to 'Show', alternate_name
|
||||
%td
|
||||
- if can? :edit, alternate_name
|
||||
= link_to 'Edit', edit_alternate_name_path(alternate_name), :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Edit', edit_alternate_name_path(alternate_name), class: 'btn btn-default btn-xs'
|
||||
%td
|
||||
- if can? :destroy, alternate_name
|
||||
= link_to 'Delete', alternate_name, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Delete', alternate_name,
|
||||
method: :delete,
|
||||
data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs'
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
%p#notice= notice
|
||||
|
||||
= render :partial => 'crops/approval_status_message', :locals => { :crop => @alternate_name.crop }
|
||||
= render partial: 'crops/approval_status_message', locals: { crop: @alternate_name.crop }
|
||||
|
||||
%p
|
||||
%b Alternate name:
|
||||
@@ -17,6 +17,6 @@
|
||||
= link_to @alternate_name.crop, @alternate_name.crop
|
||||
|
||||
- if can? :edit, @alternate_name
|
||||
= link_to 'Edit', edit_alternate_name_path(@alternate_name), :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Edit', edit_alternate_name_path(@alternate_name), class: 'btn btn-default btn-xs'
|
||||
\|
|
||||
= link_to 'Back', alternate_names_path
|
||||
|
||||
@@ -1,18 +1,20 @@
|
||||
= form_for(@comment, :html => {:class => "form-horizontal", :role => "form"}) do |f|
|
||||
= form_for(@comment, html: { class: "form-horizontal", role: "form" }) do |f|
|
||||
- if @comment.errors.any?
|
||||
#error_explanation
|
||||
%h2= "#{pluralize(@comment.errors.size, "error")} prohibited this comment from being saved:"
|
||||
%h2
|
||||
= pluralize(@comment.errors.size, "error")
|
||||
prohibited this comment from being saved:
|
||||
%ul
|
||||
- @comment.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.form-group
|
||||
= f.label :body, "Your comment:"
|
||||
= f.text_area :body, :rows => 6, :class => 'form-control', :autofocus => 'autofocus'
|
||||
= f.text_area :body, rows: 6, class: 'form-control', autofocus: 'autofocus'
|
||||
%span.help-block
|
||||
= render :partial => "shared/markdown_help"
|
||||
= render partial: "shared/markdown_help"
|
||||
.actions
|
||||
= f.submit 'Post comment', :class => 'btn btn-primary'
|
||||
= f.submit 'Post comment', class: 'btn btn-primary'
|
||||
- if defined?(@post)
|
||||
.field
|
||||
= f.hidden_field :post_id, :value => @post.id
|
||||
= f.hidden_field :post_id, value: @post.id
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
.comment
|
||||
.row
|
||||
.col-md-1
|
||||
= render :partial => "members/avatar", :locals => { :member => comment.author }
|
||||
= render partial: "members/avatar", locals: { member: comment.author }
|
||||
.col-md-11
|
||||
.comment-meta
|
||||
Posted by
|
||||
@@ -17,11 +17,11 @@
|
||||
:growstuff_markdown
|
||||
#{ strip_tags comment.body }
|
||||
|
||||
- if can? :edit, comment or can? :destroy, comment
|
||||
- if can?(:edit, comment) || can?(:destroy, comment)
|
||||
.comment-actions
|
||||
- if can? :edit, comment
|
||||
= link_to 'Edit', edit_comment_path(comment), :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Edit', edit_comment_path(comment), class: 'btn btn-default btn-xs'
|
||||
- if can? :destroy, comment
|
||||
= link_to 'Delete', comment, method: :delete, |
|
||||
data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Delete', comment, method: :delete,
|
||||
data: { confirm: 'Are you sure?' }, class: 'btn btn-default btn-xs'
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
= content_for :title, "Recent comments"
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= page_entries_info @comments
|
||||
= will_paginate @comments
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
%h2
|
||||
Comment on
|
||||
= link_to comment.post.subject, comment.post
|
||||
= render :partial => "single", :locals => { :comment => comment }
|
||||
= render partial: "single", locals: { comment: comment }
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= page_entries_info @comments
|
||||
= will_paginate @comments
|
||||
|
||||
%p
|
||||
Subscribe to the #{ENV['GROWSTUFF_SITE_NAME']}
|
||||
= succeed "." do
|
||||
= link_to "comments RSS feed", comments_path(:format => 'rss')
|
||||
= link_to "comments RSS feed", comments_path(format: 'rss')
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
%rss{:version => 2.0}
|
||||
%rss{ version: 2.0 }
|
||||
%channel
|
||||
%title Recent comments on all posts (#{ENV['GROWSTUFF_SITE_NAME']})
|
||||
%link= comments_url
|
||||
@@ -16,6 +16,6 @@
|
||||
:escaped_markdown
|
||||
#{ strip_tags comment.body }
|
||||
|
||||
%pubDate= comment.created_at.to_s(:rfc822)
|
||||
%pubdate= comment.created_at.to_s(:rfc822)
|
||||
%link= post_url(comment.post)
|
||||
%guid= comment_url(comment)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
= content_for :title, "New comment"
|
||||
|
||||
= render :partial => "posts/single", :locals => { :post => @post || @comment.post, :subject => true }
|
||||
= render partial: "posts/single", locals: { post: @post || @comment.post, subject: true }
|
||||
|
||||
= render :partial => "posts/comments", :locals => {:post => @post || @comment.post}
|
||||
= render partial: "posts/comments", locals: { post: @post || @comment.post }
|
||||
|
||||
= render 'form'
|
||||
|
||||
@@ -3,15 +3,15 @@
|
||||
= tag("meta", property: "og:image", content: avatar_uri(@comment.post.author, 200))
|
||||
= tag("meta", property: "og:image:user_generated", content: "true")
|
||||
= tag("meta", property: "og:title", content: @comment.post.subject)
|
||||
= tag("meta", property: "og:description", content: strip_tags(@comment.post.body).split(' ')[0..20].join(' '))
|
||||
= tag("meta", property: "og:description", content: og_description(@comment.post.body))
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
= render :partial => "posts/single", :locals => { :post => @comment.post }
|
||||
= render partial: "posts/single", locals: { post: @comment.post }
|
||||
|
||||
%h2 Showing 1 comment
|
||||
|
||||
= render :partial => "single", :locals => { :comment => @comment }
|
||||
= render partial: "single", locals: { comment: @comment }
|
||||
|
||||
=link_to "View all comments", post_path(@comment.post)
|
||||
= link_to "View all comments", post_path(@comment.post)
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
%li
|
||||
= an.name
|
||||
- if can? :edit, an
|
||||
= link_to 'Edit', edit_alternate_name_path(an), { :class => 'btn btn-default btn-xs' }
|
||||
= link_to 'Edit', edit_alternate_name_path(an), class: 'btn btn-default btn-xs'
|
||||
- if can? :destroy, an
|
||||
= link_to 'Delete', an, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Delete', an, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-default btn-xs'
|
||||
%p
|
||||
- if can? :edit, crop
|
||||
= link_to 'Add', new_alternate_name_path( :crop_id => crop.id ), { :class => 'btn btn-default btn-xs' }
|
||||
= link_to 'Add', new_alternate_name_path(crop_id: crop.id), class: 'btn btn-default btn-xs'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
%h4 Find #{ crop.name } seeds
|
||||
%h4 Find #{crop.name} seeds
|
||||
- if crop.seeds.empty?
|
||||
%p
|
||||
There are no seeds available to trade on Growstuff right now.
|
||||
@@ -7,13 +7,16 @@
|
||||
- crop.seeds.tradable.each do |seed|
|
||||
%li
|
||||
= link_to "#{seed.owner} will trade #{seed.tradable_to}.", seed_path(seed)
|
||||
= render :partial => 'members/location', :locals => { :member => seed.owner }
|
||||
= render partial: 'members/location', locals: { member: seed.owner }
|
||||
%p
|
||||
= link_to "View all #{crop.name} seeds", seeds_by_crop_path(crop)
|
||||
%p
|
||||
= link_to "Purchase seeds via Ebay", "http://rover.ebay.com/rover/1/705-53470-19255-0/1?icep_ff3=9&pub=5575213277&toolid=10001&campid=5337940151&customid=&icep_uq=#{URI.escape crop.name}&icep_sellerId=&icep_ex_kw=&icep_sortBy=12&icep_catId=181003&icep_minPrice=&icep_maxPrice=&ipn=psmain&icep_vectorid=229515&kwid=902099&mtid=824&kw=lg", target: "_blank", rel: "noopener noreferrer"
|
||||
= link_to "Purchase seeds via Ebay",
|
||||
crop_ebay_seeds_url(crop),
|
||||
target: "_blank",
|
||||
rel: "noopener noreferrer"
|
||||
- if crop.approved?
|
||||
- if current_member
|
||||
%p= link_to "List #{crop.name} seeds to trade", new_seed_path(:crop_id => crop.id)
|
||||
%p= link_to "List #{crop.name} seeds to trade", new_seed_path(crop_id: crop.id)
|
||||
- else
|
||||
= render :partial => 'shared/signin_signup', :locals => { :to => 'list your seeds to trade' }
|
||||
= render partial: 'shared/signin_signup', locals: { to: 'list your seeds to trade' }
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
= form_for @crop, :html => {:class => 'form-horizontal', :role => "form"} do |f|
|
||||
= form_for @crop, html: { class: 'form-horizontal', role: "form" } do |f|
|
||||
- if @crop.errors.any?
|
||||
#error_explanation
|
||||
%h3= "#{pluralize(@crop.errors.size, "error")} prohibited this crop from being saved:"
|
||||
%h3
|
||||
= pluralize(@crop.errors.size, "error")
|
||||
prohibited this crop from being saved:
|
||||
%ul
|
||||
- @crop.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
@@ -11,16 +13,16 @@
|
||||
%p
|
||||
%span.help-block
|
||||
For detailed crop wrangling guidelines, please consult the
|
||||
=link_to "crop wrangling guide", "http://wiki.growstuff.org/index.php/Crop_wrangling"
|
||||
= link_to "crop wrangling guide", "http://wiki.growstuff.org/index.php/Crop_wrangling"
|
||||
on the Growstuff wiki.
|
||||
|
||||
-# Everyone (wranglers and requesters) sees the basic info section
|
||||
%h2 Basic information
|
||||
|
||||
.form-group#new_crop
|
||||
= f.label :name, :class => 'control-label col-md-2'
|
||||
= f.label :name, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :name, :class => 'form-control'
|
||||
= f.text_field :name, class: 'form-control'
|
||||
%span.help-block
|
||||
The common name for the crop, in English (required).
|
||||
- if can? :wrangle, @crop
|
||||
@@ -28,87 +30,89 @@
|
||||
proper nouns only.
|
||||
|
||||
.form-group
|
||||
= f.label :en_wikipedia_url, 'Wikipedia URL', :class => 'control-label col-md-2'
|
||||
= f.label :en_wikipedia_url, 'Wikipedia URL', class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :en_wikipedia_url, :class => 'form-control', :id => "en_wikipedia_url"
|
||||
= f.text_field :en_wikipedia_url, class: 'form-control', id: "en_wikipedia_url"
|
||||
%span.help-block
|
||||
Link to the crop's page on the English language Wikipedia (required).
|
||||
|
||||
-# Only crop wranglers see the crop hierarchy (for now)
|
||||
- if can? :wrangle, @crop
|
||||
.form-group
|
||||
= f.label :parent_id, 'Parent crop', :class => 'control-label col-md-2'
|
||||
= f.label :parent_id, 'Parent crop', class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= collection_select(:crop, :parent_id, Crop.all, :id, :name, {:include_blank => true}, :class => 'form-control')
|
||||
= collection_select(:crop, :parent_id, Crop.all, :id, :name, { include_blank: true }, class: 'form-control')
|
||||
%span.help-block Optional. For setting up crop hierarchies for varieties etc.
|
||||
|
||||
|
||||
-# Everyone (wranglers and requesters) gets to add scientific names
|
||||
%h2
|
||||
Scientific names
|
||||
= button_tag "+", :id => "add-sci_name-row", :type => "button"
|
||||
= button_tag "-", :id => "remove-sci_name-row", :type => "button"
|
||||
= button_tag "+", id: "add-sci_name-row", type: "button"
|
||||
= button_tag "-", id: "remove-sci_name-row", type: "button"
|
||||
|
||||
.form-group#scientific_names
|
||||
- @crop.scientific_names.each.with_index do |sci, index|
|
||||
.template.col-md-12{ :id => "sci_template[#{index+1}]" }
|
||||
.template.col-md-12{ id: "sci_template[#{index + 1}]" }
|
||||
.col-md-2
|
||||
= label_tag :scientific_names, "Scientific name #{index+1}:", :class => 'control-label'
|
||||
= label_tag :scientific_names, "Scientific name #{index + 1}:", class: 'control-label'
|
||||
.col-md-8
|
||||
= text_field_tag "sci_name[#{index+1}]", sci.name, :id => "sci_name[#{index+1}]", :class => 'form-control'
|
||||
= text_field_tag "sci_name[#{index + 1}]", sci.name, id: "sci_name[#{index + 1}]", class: 'form-control'
|
||||
%span.help-block Scientific name of crop.
|
||||
.col-md-2
|
||||
|
||||
%h2
|
||||
Alternate names
|
||||
= button_tag "+", :id => "add-alt_name-row", :type => "button"
|
||||
= button_tag "-", :id => "remove-alt_name-row", :type => "button"
|
||||
= button_tag "+", id: "add-alt_name-row", type: "button"
|
||||
= button_tag "-", id: "remove-alt_name-row", type: "button"
|
||||
|
||||
.form-group#alternate_names
|
||||
- @crop.alternate_names.each.with_index do |alt, index|
|
||||
.template.col-md-12{ :id => "alt_template[#{index+1}]" }
|
||||
.template.col-md-12{ id: "alt_template[#{index + 1}]" }
|
||||
.col-md-2
|
||||
= label_tag :alternate_names, "Alternate name #{index+1}:", :class => 'control-label'
|
||||
= label_tag :alternate_names, "Alternate name #{index + 1}:", class: 'control-label'
|
||||
.col-md-8
|
||||
= text_field_tag "alt_name[#{index+1}]", alt.name, :id => "alt_name[#{index+1}]", :class => 'form-control'
|
||||
= text_field_tag "alt_name[#{index + 1}]", alt.name, id: "alt_name[#{index + 1}]", class: 'form-control'
|
||||
%span.help-block Alternate name of crop.
|
||||
.col-md-2
|
||||
|
||||
-# This is used for comments from crop requesters. We need to show it
|
||||
-# to everyone, but we don't include it on new crops from wranglers.
|
||||
|
||||
- if (can? :wrangle, @crop and @crop.requester) or (cannot? :wrangle, @crop and @crop.new_record?)
|
||||
- if (can?(:wrangle, @crop) && @crop.requester) || (cannot?(:wrangle, @crop) && @crop.new_record?)
|
||||
%h2 Crop request notes
|
||||
.form-group
|
||||
= f.label :request_notes, 'Comments', :class => 'control-label col-md-2'
|
||||
= f.label :request_notes, 'Comments', class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_area :request_notes, :rows => 3, :class => 'form-control', :id => 'request_notes'
|
||||
= f.text_area :request_notes, rows: 3, class: 'form-control', id: 'request_notes'
|
||||
|
||||
-# A final explanation of what's going to happen next, for crop requesters
|
||||
- unless can? :wrangle, @crop
|
||||
%p When you submit this form, your suggestion will be sent to our team of #{link_to 'volunteer crop wranglers', 'http://talk.growstuff.org/c/crop-wrangling'} for review. We'll let you know the outcome as soon as we can.
|
||||
%p
|
||||
When you submit this form, your suggestion will be sent to our team of
|
||||
= link_to 'volunteer crop wranglers', 'http://talk.growstuff.org/c/crop-wrangling'
|
||||
for review. We'll let you know the outcome as soon as we can.
|
||||
|
||||
-# Now, for crop wranglers, let's have approval/rejection at the bottom of the page
|
||||
- if can? :wrangle, @crop and @crop.requester
|
||||
- if can?(:wrangle, @crop) && @crop.requester
|
||||
%h2 Approve or reject pending crops
|
||||
.form-group
|
||||
= f.label :approval_status, 'Approval status', :class=> 'control-label col-md-2'
|
||||
= f.label :approval_status, 'Approval status', class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.select(:approval_status, @crop.approval_statuses, {}, {:class => 'form-control'})
|
||||
= f.select(:approval_status, @crop.approval_statuses, {}, class: 'form-control')
|
||||
|
||||
.form-group
|
||||
= f.label :reason_for_rejection, 'Reason for rejection', :class => 'control-label col-md-2'
|
||||
= f.label :reason_for_rejection, 'Reason for rejection', class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.select(:reason_for_rejection, @crop.reasons_for_rejection, {:include_blank => true}, {:class => 'form-control'})
|
||||
= f.select(:reason_for_rejection, @crop.reasons_for_rejection, include_blank: true, class: 'form-control')
|
||||
|
||||
.form-group
|
||||
= f.label :rejection_notes, 'Rejection notes', :class => 'control-label col-md-2'
|
||||
= f.label :rejection_notes, 'Rejection notes', class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_area :rejection_notes, :rows => 3, :class => 'form-control'
|
||||
= f.text_area :rejection_notes, rows: 3, class: 'form-control'
|
||||
%span.help-block
|
||||
Please provide additional notes why this crop request was rejected if the above reasons do not apply.
|
||||
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit 'Save', :class => 'btn btn-primary'
|
||||
= f.submit 'Save', class: 'btn btn-primary'
|
||||
|
||||
@@ -3,5 +3,7 @@
|
||||
- if crop.harvests.empty?
|
||||
not known.
|
||||
- else
|
||||
- popular_plant_parts = crop.popular_plant_parts.sort_by {|s, freq| freq }.reverse
|
||||
!= popular_plant_parts.map {|p, freq| link_to(p, p) + " (#{freq})" }.join(", ")
|
||||
- crop.popular_plant_parts.each do |plant_part, frequency|
|
||||
- id, name = plant_part
|
||||
= link_to name, plant_part_path(id: id)
|
||||
(#{frequency})
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
%h4 #{ crop.name.capitalize } harvests
|
||||
%h4 #{crop.name.capitalize} harvests
|
||||
- if crop.harvests.empty?
|
||||
%p
|
||||
Nobody has harvested this crop yet.
|
||||
@@ -7,7 +7,7 @@
|
||||
- crop.harvests.take(3).each do |harvest|
|
||||
%li
|
||||
= link_to "#{harvest.owner} harvested #{display_quantity(harvest)}.", harvest_path(harvest)
|
||||
= render :partial => 'members/location', :locals => { :member => harvest.owner }
|
||||
= render partial: 'members/location', locals: { member: harvest.owner }
|
||||
%small
|
||||
= distance_of_time_in_words(harvest.created_at, Time.zone.now)
|
||||
ago.
|
||||
@@ -15,7 +15,6 @@
|
||||
= link_to "View all #{crop.name} harvests", harvests_by_crop_path(crop)
|
||||
- if crop.approved?
|
||||
- if current_member
|
||||
%p= link_to "Harvest #{crop.name}", new_harvest_path(:crop_id => crop.id)
|
||||
%p= link_to "Harvest #{crop.name}", new_harvest_path(crop_id: crop.id)
|
||||
- else
|
||||
= render :partial => 'shared/signin_signup', :locals => { :to => "track your #{crop.name} harvests" }
|
||||
|
||||
= render partial: 'shared/signin_signup', locals: { to: "track your #{crop.name} harvests" }
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
- unless defined? max
|
||||
- max = 0 # list all without "show all" toggle button
|
||||
- display_crops.each do |c|
|
||||
%li.crop-hierarchy{:class => max != 0 && @count >= max ? ['hide', 'toggle'] : []}
|
||||
%li.crop-hierarchy{ class: max != 0 && @count >= max ? ['hide', 'toggle'] : [] }
|
||||
= link_to c, c
|
||||
- @count += 1
|
||||
- if c.varieties.present?
|
||||
- c.varieties.each do |v|
|
||||
= render :partial => 'hierarchy', :locals => { :display_crops => [ v ], :max => max }
|
||||
= render partial: 'hierarchy', locals: { display_crops: [v], max: max }
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
- cache crop do
|
||||
= link_to |
|
||||
image_tag( |
|
||||
crop.default_photo ? crop.default_photo.thumbnail_url : 'placeholder_150.png', |
|
||||
:alt => crop.name, |
|
||||
:class => 'image-responsive crop-image' |
|
||||
), |
|
||||
crop, |
|
||||
:rel => "popover", |
|
||||
'data-trigger' => 'hover', |
|
||||
'data-title' => crop.name, |
|
||||
'data-content' => "#{ render :partial => 'crops/popover', :locals => { :crop => crop } }", |
|
||||
'data-html' => true |
|
||||
= link_to image_tag(crop.default_photo.present? ? crop.default_photo.thumbnail_url : 'placeholder_150.png',
|
||||
alt: crop.name, class: 'image-responsive crop-image'),
|
||||
crop.name,
|
||||
rel: "popover",
|
||||
'data-trigger': 'hover',
|
||||
'data-title': crop.name,
|
||||
'data-content': render(partial: 'crops/popover', locals: { crop: crop }),
|
||||
'data-html': true
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
.well
|
||||
.row
|
||||
.col-md-4
|
||||
= link_to image_tag((crop.default_photo ? crop.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => '', :class => 'img crop-image'), crop
|
||||
= link_to image_tag((crop.default_photo ? crop.default_photo.thumbnail_url : 'placeholder_150.png'),
|
||||
alt: '',
|
||||
class: 'img crop-image'),
|
||||
crop
|
||||
.col-md-8
|
||||
%h3{:style => 'padding-top: 0px; margin-top: 0px'}
|
||||
%h3{ style: 'padding-top: 0px; margin-top: 0px' }
|
||||
= link_to crop, crop
|
||||
|
||||
%p
|
||||
@@ -16,6 +19,6 @@
|
||||
by #{ENV['GROWSTUFF_SITE_NAME']} members
|
||||
|
||||
- if can? :create, Planting
|
||||
= link_to 'Plant this', new_planting_path(:params => { :crop_id => crop.id }), :class => 'btn btn-primary'
|
||||
= link_to 'Plant this', new_planting_path(params: { crop_id: crop.id }), class: 'btn btn-primary'
|
||||
- if can? :create, Seed
|
||||
= link_to 'Add seeds to stash', new_seed_path(:params => { :crop_id => crop.id }), :class => 'btn btn-primary'
|
||||
= link_to 'Add seeds to stash', new_seed_path(params: { crop_id: crop.id }), class: 'btn btn-primary'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
.row
|
||||
- if !crop.photos.empty?
|
||||
- unless crop.photos.empty?
|
||||
- crop.photos.first(3).each do |p|
|
||||
.col-md-4
|
||||
= render :partial => "photos/thumbnail", :locals => { :photo => p }
|
||||
= render partial: "photos/thumbnail", locals: { photo: p }
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
- if crop.planted_from.empty?
|
||||
not known.
|
||||
- else
|
||||
- planted_from = crop.planted_from.sort_by {|s, freq| freq }.reverse
|
||||
= planted_from.map {|s, freq| "#{s} (#{freq})" }.join(", ")
|
||||
- planted_from = crop.planted_from.sort_by { |_, freq| freq }.reverse
|
||||
= planted_from.map { |s, freq| "#{s} (#{freq})" }.join(", ")
|
||||
|
||||
%p
|
||||
%strong Plant in:
|
||||
- if crop.sunniness.empty?
|
||||
not known.
|
||||
- else
|
||||
- sunniness = crop.sunniness.sort_by {|s, freq| freq }.reverse
|
||||
= sunniness.map {|s, freq| "#{s} (#{freq})" }.join(", ")
|
||||
- sunniness = crop.sunniness.sort_by { |_, freq| freq }.reverse
|
||||
= sunniness.map { |s, freq| "#{s} (#{freq})" }.join(", ")
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
%h4 See who's planted #{ crop.name.pluralize }
|
||||
%h4 See who's planted #{crop.name.pluralize}
|
||||
- if crop.plantings.empty?
|
||||
%p
|
||||
Nobody has planted this crop yet.
|
||||
@@ -7,7 +7,7 @@
|
||||
- crop.plantings.take(3).each do |planting|
|
||||
%li
|
||||
= link_to display_planting(planting), planting_path(planting)
|
||||
= render :partial => 'members/location', :locals => { :member => planting.owner }
|
||||
= render partial: 'members/location', locals: { member: planting.owner }
|
||||
%small
|
||||
= distance_of_time_in_words(planting.created_at, Time.zone.now)
|
||||
ago.
|
||||
@@ -15,7 +15,7 @@
|
||||
= link_to "View all #{crop.name} plantings", plantings_by_crop_path(crop)
|
||||
- if crop.approved?
|
||||
- if current_member
|
||||
%p= link_to "Plant #{crop.name}", new_planting_path(:crop_id => crop.id)
|
||||
%p= link_to "Plant #{crop.name}", new_planting_path(crop_id: crop.id)
|
||||
- else
|
||||
= render :partial => 'shared/signin_signup', :locals => { :to => "track your #{crop.name} plantings" }
|
||||
= render partial: 'shared/signin_signup', locals: { to: "track your #{crop.name} plantings" }
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%p
|
||||
%small
|
||||
- if crop.scientific_names.size > 0
|
||||
- unless crop.scientific_names.empty?
|
||||
%i
|
||||
= crop.scientific_names.first.name
|
||||
%br/
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
%li
|
||||
= sn.name
|
||||
- if can? :edit, sn
|
||||
= link_to 'Edit', edit_scientific_name_path(sn), { :class => 'btn btn-default btn-xs' }
|
||||
= link_to 'Edit', edit_scientific_name_path(sn), class: 'btn btn-default btn-xs'
|
||||
- if can? :destroy, sn
|
||||
= link_to 'Delete', sn, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Delete', sn, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-default btn-xs'
|
||||
%p
|
||||
- if can? :edit, crop
|
||||
= link_to 'Add', new_scientific_name_path( :crop_id => crop.id ), { :class => 'btn btn-default btn-xs' }
|
||||
= link_to 'Add', new_scientific_name_path(crop_id: crop.id), class: 'btn btn-default btn-xs'
|
||||
|
||||
@@ -2,11 +2,13 @@
|
||||
.crop-thumbnail
|
||||
- if crop
|
||||
- cache cache_key_for(Crop, crop.id) do
|
||||
= link_to image_tag((crop.default_photo ? crop.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => crop.name, :class => 'img'), crop
|
||||
= link_to image_tag((crop.default_photo ? crop.default_photo.thumbnail_url : 'placeholder_150.png'),
|
||||
alt: crop.name, class: 'img'),
|
||||
crop
|
||||
.cropinfo
|
||||
.cropname
|
||||
= link_to crop.name, crop
|
||||
- if crop.scientific_names.size > 0
|
||||
- unless crop.scientific_names.empty?
|
||||
.scientificname
|
||||
= crop.scientific_names.first.name
|
||||
.plantingcount
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
Varieties of #{crop.name}:
|
||||
|
||||
- max = 5
|
||||
= render :partial => 'hierarchy', :locals => { :display_crops => [ crop ], :max => max }
|
||||
= render partial: 'hierarchy', locals: { display_crops: [crop], max: max }
|
||||
- if max != 0 && @count > max
|
||||
= button_tag "Show all #{@count-1} varieties", :class => 'btn btn-link toggle crop-hierarchy'
|
||||
= button_tag "Show less varieties", :class => 'btn btn-link toggle crop-hierarchy hide'
|
||||
= button_tag "Show all #{@count - 1} varieties", class: 'btn btn-link toggle crop-hierarchy'
|
||||
= button_tag "Show less varieties", class: 'btn btn-link toggle crop-hierarchy hide'
|
||||
|
||||
- if ! crop.parent and crop.varieties.empty?
|
||||
- if !crop.parent && crop.varieties.empty?
|
||||
%p None known.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
- if can? :edit, crop or can? :destroy, crop
|
||||
- if can?(:edit, crop) || can?(:destroy, crop)
|
||||
%h4 Crop wrangling
|
||||
%p
|
||||
You are a
|
||||
@@ -6,6 +6,9 @@
|
||||
%strong CROP WRANGLER
|
||||
%p
|
||||
- if can? :edit, crop
|
||||
= link_to 'Edit crop', edit_crop_path(crop), { :class => 'btn btn-default btn-xs' }
|
||||
= link_to 'Edit crop', edit_crop_path(crop), class: 'btn btn-default btn-xs'
|
||||
- if can? :destroy, crop
|
||||
= link_to 'Delete crop', crop, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Delete crop', crop,
|
||||
method: :delete,
|
||||
data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs'
|
||||
|
||||
@@ -2,18 +2,29 @@
|
||||
|
||||
- if @crop.approval_status == "approved"
|
||||
- if @crop.requester
|
||||
%p Requested by #{link_to @crop.requester, @crop.requester} #{distance_of_time_in_words(@crop.created_at, Time.zone.now)} ago.
|
||||
%p Approved by #{link_to @crop.creator, @crop.creator}.
|
||||
%p
|
||||
Requested by #{link_to @crop.requester, @crop.requester}
|
||||
#{distance_of_time_in_words(@crop.created_at, Time.zone.now)} ago.
|
||||
%p
|
||||
Approved by #{link_to @crop.creator, @crop.creator}.
|
||||
- else
|
||||
%p Added by #{link_to @crop.creator, @crop.creator} #{distance_of_time_in_words(@crop.created_at, Time.zone.now)} ago.
|
||||
%p
|
||||
Added by #{link_to @crop.creator, @crop.creator}
|
||||
#{distance_of_time_in_words(@crop.created_at, Time.zone.now)} ago.
|
||||
- elsif @crop.approval_status == "pending"
|
||||
.alert.alert-danger
|
||||
%p Requested by #{link_to @crop.requester, @crop.requester} #{distance_of_time_in_words(@crop.created_at, Time.zone.now)} ago.
|
||||
%p Status: #{@crop.approval_status}.
|
||||
%p
|
||||
Requested by #{link_to @crop.requester, @crop.requester}
|
||||
#{distance_of_time_in_words(@crop.created_at, Time.zone.now)} ago.
|
||||
%p
|
||||
Status: #{@crop.approval_status}.
|
||||
- elsif @crop.approval_status == "rejected"
|
||||
.alert.alert-danger
|
||||
%p Requested by #{link_to @crop.requester, @crop.requester} #{distance_of_time_in_words(@crop.created_at, Time.zone.now)} ago.
|
||||
%p Status: #{@crop.approval_status} by #{link_to @crop.creator, @crop.creator}.
|
||||
%p
|
||||
Requested by #{link_to @crop.requester, @crop.requester}
|
||||
#{distance_of_time_in_words(@crop.created_at, Time.zone.now)} ago.
|
||||
%p
|
||||
Status: #{@crop.approval_status} by #{link_to @crop.creator, @crop.creator}.
|
||||
|
||||
= render 'form'
|
||||
|
||||
|
||||
@@ -6,4 +6,4 @@
|
||||
= link_to "crops database", crops_path
|
||||
|
||||
- cache cache_key_for(Crop) do
|
||||
= render :partial => "hierarchy", :locals => { :display_crops => @crops }
|
||||
= render partial: "hierarchy", locals: { display_crops: @crops }
|
||||
|
||||
@@ -2,36 +2,44 @@
|
||||
- content_for :subtitle, t('.subtitle', crops_size: @crops.size)
|
||||
|
||||
- if can? :wrangle, Crop
|
||||
= link_to 'Wrangle Crops', wrangle_crops_path, :class => 'btn btn-primary'
|
||||
= link_to 'Wrangle Crops', wrangle_crops_path, class: 'btn btn-primary'
|
||||
|
||||
- if @has_requested_pending
|
||||
= link_to(I18n.t('crops.requested.link', number_crops: @has_requested_pending), requested_crops_path)
|
||||
|
||||
%p
|
||||
#{ENV['GROWSTUFF_SITE_NAME']} tracks who's growing what, where.
|
||||
View any crop page to see which of our members have planted it and find
|
||||
information on how to grow it yourself.
|
||||
|
||||
= form_tag(crops_path, :method => :get, :class => 'form-inline', :role => 'form') do
|
||||
= form_tag(crops_path, method: :get, class: 'form-inline', role: 'form') do
|
||||
.form-group
|
||||
= label_tag :sort, "Sort by:", :class => 'sr-only'
|
||||
= select_tag "sort", options_for_select({"Sort by popularity" => 'popular', "Sort alphabetically" => 'alpha'}, @sort || 'popular'), :class => 'form-control'
|
||||
= submit_tag "Show", :class => 'btn btn-primary'
|
||||
= label_tag :sort, "Sort by:", class: 'sr-only'
|
||||
= select_tag "sort",
|
||||
options_for_select({ "Sort by popularity": 'popular',
|
||||
"Sort alphabetically": 'alpha' },
|
||||
@sort || 'popular'),
|
||||
class: 'form-control'
|
||||
= submit_tag "Show", class: 'btn btn-primary'
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= will_paginate @paginated_crops
|
||||
|
||||
.row
|
||||
- @paginated_crops.each do |crop|
|
||||
.col-md-2.six-across
|
||||
= render :partial => "thumbnail", :locals => { :crop => crop }
|
||||
= render partial: "thumbnail", locals: { crop: crop }
|
||||
|
||||
- if can? :create, Crop
|
||||
%div
|
||||
= link_to 'New Crop', new_crop_path, {:class => 'btn btn-primary'}
|
||||
= link_to 'New Crop', new_crop_path, class: 'btn btn-primary'
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= will_paginate @paginated_crops
|
||||
|
||||
|
||||
%ul.list-inline
|
||||
%li The data on this page is available in the following formats:
|
||||
%li= link_to "CSV", crops_path(:format => 'csv')
|
||||
%li= link_to "JSON", crops_path(:format => 'json')
|
||||
%li= link_to "RSS", crops_path(:format => 'rss')
|
||||
%li= link_to "CSV", crops_path(format: 'csv')
|
||||
%li= link_to "JSON", crops_path(format: 'json')
|
||||
%li= link_to "RSS", crops_path(format: 'rss')
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
%rss{:version => 2.0}
|
||||
%rss{ version: 2.0 }
|
||||
%channel
|
||||
%title Recently added crops (#{ENV['GROWSTUFF_SITE_NAME']})
|
||||
%link= crops_url
|
||||
- @crops.each do |crop|
|
||||
%item
|
||||
%title= crop.name
|
||||
%pubDate= crop.created_at.to_s(:rfc822)
|
||||
%pubdate= crop.created_at.to_s(:rfc822)
|
||||
%link= post_url(crop)
|
||||
%guid= post_url(crop)
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
- content_for :title, (can?(:wrangle, @crop) ? "New crop" : "Suggest a crop")
|
||||
|
||||
- unless can? :wrangler, @crop
|
||||
|
||||
%p Thanks for taking the time to suggest a crop! Our crop database is managed by volunteers, and we appreciate your help. Here are some things to consider when suggesting a new crop:
|
||||
|
||||
%p
|
||||
Thanks for taking the time to suggest a crop! Our crop database is
|
||||
managed by volunteers, and we appreciate your help. Here are some
|
||||
things to consider when suggesting a new crop:
|
||||
%ul
|
||||
%li First, you might want to #{link_to 'search our crops', crops_search_path} to make sure we don't have it already, perhaps under an alternate name.
|
||||
%li
|
||||
First, you might want to #{link_to 'search our crops', crops_search_path}
|
||||
to make sure we don't have it already, perhaps under an alternate name.
|
||||
%li
|
||||
The Growstuff database only contains edible crops. In future we hope to
|
||||
support other crops, but for now, if your suggestion is not edible we
|
||||
won't be able to add it.
|
||||
|
||||
%li The Growstuff database only contains edible crops. In future we hope to support other crops, but for now, if your suggestion is not edible we won't be able to add it.
|
||||
|
||||
%li At this time, we are only adding crops which have a Wikipedia page. If you want to add a specific variety of crop that doesn't have its own Wikipedia entry, please use the more general form of the crop instead and put the name of your variety in the notes/description.
|
||||
%li
|
||||
At this time, we are only adding crops which have a Wikipedia page. If you
|
||||
want to add a specific variety of crop that doesn't have its own Wikipedia
|
||||
entry, please use the more general form of the crop instead and put the name
|
||||
of your variety in the notes/description.
|
||||
|
||||
= render 'form'
|
||||
|
||||
15
app/views/crops/requested.haml
Normal file
15
app/views/crops/requested.haml
Normal file
@@ -0,0 +1,15 @@
|
||||
- content_for :title, t('crops.requested.title')
|
||||
- content_for :subtitle, t('crops.requested.subtitle', crops_size: @crops.size)
|
||||
|
||||
%p Crops you have requested
|
||||
|
||||
.pagination
|
||||
= will_paginate @requested
|
||||
|
||||
.row
|
||||
- @requested.each do |crop|
|
||||
.col-md-2.six-across
|
||||
= render partial: "thumbnail", locals: { crop: crop }
|
||||
|
||||
.pagination
|
||||
= will_paginate @requested
|
||||
@@ -6,11 +6,14 @@
|
||||
- content_for :title, "Crop search"
|
||||
|
||||
%div
|
||||
= form_tag crops_search_path, :method => :get, :id => 'crop-search', :class => 'form-inline' do
|
||||
= form_tag crops_search_path, method: :get, id: 'crop-search', class: 'form-inline' do
|
||||
.form-group
|
||||
= label_tag :term, "Search crops:", :class => 'sr-only'
|
||||
= text_field_tag 'term', nil, :class => 'search-query input-medium form-control', :placeholder => 'Search crops', :value => @term
|
||||
= submit_tag "Search", :class => 'btn btn-primary'
|
||||
= label_tag :term, "Search crops:", class: 'sr-only'
|
||||
= text_field_tag 'term', nil,
|
||||
class: 'search-query input-medium form-control',
|
||||
placeholder: 'Search crops',
|
||||
value: @term
|
||||
= submit_tag "Search", class: 'btn btn-primary'
|
||||
|
||||
- if @matches.empty?
|
||||
%h2 No results found
|
||||
@@ -22,14 +25,14 @@
|
||||
instead.
|
||||
|
||||
- else
|
||||
%div.pagination
|
||||
.pagination
|
||||
= will_paginate @paginated_matches
|
||||
|
||||
%div#paginated_matches
|
||||
#paginated_matches
|
||||
.row
|
||||
- @paginated_matches.each do |c|
|
||||
.col-md-2.six-across
|
||||
= render :partial => "thumbnail", :locals => { :crop => c }
|
||||
= render partial: "thumbnail", locals: { crop: c }
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= will_paginate @paginated_matches
|
||||
|
||||
@@ -8,31 +8,34 @@
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
= render :partial => 'approval_status_message', :locals => { :crop => @crop }
|
||||
= render partial: 'approval_status_message', locals: { crop: @crop }
|
||||
|
||||
- if @crop.approved?
|
||||
- content_for :buttonbar do
|
||||
- if can? :create, Planting
|
||||
= link_to "Plant this", new_planting_path(:crop_id => @crop.id), :class => 'btn btn-default'
|
||||
= link_to "Plant this", new_planting_path(crop_id: @crop.id), class: 'btn btn-default'
|
||||
|
||||
- if can? :create, Harvest
|
||||
= link_to "Harvest this", new_harvest_path(:crop_id => @crop.id), :class => 'btn btn-default'
|
||||
= link_to "Harvest this", new_harvest_path(crop_id: @crop.id), class: 'btn btn-default'
|
||||
|
||||
- if can? :create, Seed
|
||||
= link_to 'Add seeds to stash', new_seed_path(:params => { :crop_id => @crop.id }), :class => 'btn btn-default'
|
||||
= link_to 'Add seeds to stash', new_seed_path(params: { crop_id: @crop.id }), class: 'btn btn-default'
|
||||
- if member_signed_in?
|
||||
= display_seed_availability(@current_member, @crop)
|
||||
= link_to "View your seeds", seeds_by_owner_path(:owner => current_member.slug)
|
||||
= link_to "View your seeds", seeds_by_owner_path(owner: current_member.slug)
|
||||
|
||||
.row
|
||||
.col-md-9
|
||||
- unless current_member
|
||||
Learn how to grow #{ @crop.name.pluralize } from growers around the world. #{ ENV['GROWSTUFF_SITE_NAME'] } has tips and advice from real-life growers, including when to plant #{ @crop.name.pluralize }, how to harvest #{ @crop.name.pluralize }, and more.
|
||||
Learn how to grow #{@crop.name.pluralize} from growers around the world.
|
||||
#{ENV['GROWSTUFF_SITE_NAME']} has tips and advice from real-life growers,
|
||||
including when to plant #{@crop.name.pluralize}, how to harvest
|
||||
#{@crop.name.pluralize}, and more.
|
||||
|
||||
= render :partial => 'photos', :locals => { :crop => @crop }
|
||||
= render partial: 'photos', locals: { crop: @crop }
|
||||
|
||||
%h2
|
||||
- if @crop.plantings.size > 0
|
||||
- if !@crop.plantings.empty?
|
||||
= @crop.name.titleize
|
||||
has been planted
|
||||
= pluralize(@crop.plantings.size, "time")
|
||||
@@ -40,62 +43,78 @@
|
||||
- else
|
||||
Nobody is growing this yet. You could be the first!
|
||||
|
||||
%h2
|
||||
Sunniness Chart
|
||||
|
||||
#sunchart
|
||||
|
||||
%h2
|
||||
Crop Map
|
||||
%p
|
||||
Only plantings by members who have set their locations are shown on this map.
|
||||
- if current_member && current_member.location.blank?
|
||||
= link_to "Set your location.", edit_member_registration_path
|
||||
|
||||
#cropmap
|
||||
|
||||
%div#cropmap
|
||||
|
||||
%a{:name => 'posts'}
|
||||
%h2 What people are saying about #{ @crop.name.pluralize }
|
||||
%a{ name: 'posts' }
|
||||
%h2 What people are saying about #{@crop.name.pluralize}
|
||||
|
||||
- if @posts.empty?
|
||||
%p
|
||||
Nobody has posted about #{ @crop.name.pluralize } yet.
|
||||
Nobody has posted about #{@crop.name.pluralize} yet.
|
||||
%p
|
||||
- if can? :create, Post
|
||||
= link_to "Post something", new_post_path, :class => 'btn btn-default'
|
||||
= link_to "Post something", new_post_path, class: 'btn btn-default'
|
||||
- else
|
||||
= render :partial => "shared/signin_signup", :locals => { :to => "post your tips and experiences growing #{ @crop.name.pluralize }" }
|
||||
= render partial: "shared/signin_signup",
|
||||
locals: { to: "post your tips and experiences growing #{@crop.name.pluralize}" }
|
||||
- else
|
||||
%div.pagination
|
||||
.pagination
|
||||
= page_entries_info @posts
|
||||
= will_paginate @posts, :params => {:anchor => "posts"}
|
||||
= will_paginate @posts, params: { anchor: "posts" }
|
||||
- @posts.each do |post|
|
||||
= render :partial => "posts/single", :locals => { :post => post, :subject => true }
|
||||
= render partial: "posts/single", locals: { post: post, subject: true }
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= page_entries_info @posts
|
||||
= will_paginate @posts, :params => {:anchor => "posts"}
|
||||
= will_paginate @posts, params: { anchor: "posts" }
|
||||
|
||||
.col-md-3
|
||||
|
||||
= render :partial => 'wrangle', :locals => { :crop => @crop }
|
||||
= render partial: 'wrangle', locals: { crop: @crop }
|
||||
|
||||
%h4 How to grow #{ @crop.name.pluralize }
|
||||
%h4 How to grow #{@crop.name.pluralize}
|
||||
|
||||
= render :partial => 'grown_for', :locals => { :crop => @crop }
|
||||
= render :partial => 'planting_advice', :locals => { :crop => @crop }
|
||||
= render partial: 'grown_for', locals: { crop: @crop }
|
||||
= render partial: 'planting_advice', locals: { crop: @crop }
|
||||
|
||||
= render :partial => 'scientific_names', :locals => { :crop => @crop }
|
||||
= render :partial => 'alternate_names', :locals => { :crop => @crop }
|
||||
= render partial: 'scientific_names', locals: { crop: @crop }
|
||||
= render partial: 'alternate_names', locals: { crop: @crop }
|
||||
|
||||
%h4 #{ @crop.name.capitalize } varieties
|
||||
= render :partial => 'varieties', :locals => { :crop => @crop }
|
||||
%h4 #{@crop.name.capitalize} varieties
|
||||
= render partial: 'varieties', locals: { crop: @crop }
|
||||
|
||||
= render :partial => 'plantings', :locals => { :crop => @crop }
|
||||
= render :partial => 'harvests', :locals => { :crop => @crop }
|
||||
= render :partial => 'find_seeds', :locals => { :crop => @crop }
|
||||
= render partial: 'plantings', locals: { crop: @crop }
|
||||
= render partial: 'harvests', locals: { crop: @crop }
|
||||
= render partial: 'find_seeds', locals: { crop: @crop }
|
||||
|
||||
%h4 Learn more about #{ @crop.name.pluralize }
|
||||
|
||||
%h4 Learn more about #{@crop.name.pluralize}
|
||||
%ul
|
||||
%li= link_to 'Wikipedia (English)', @crop.en_wikipedia_url, target: "_blank", rel: "noopener noreferrer"
|
||||
%li
|
||||
= link_to "OpenFarm - Growing guide", "https://openfarm.cc/en/crops/#{URI.escape @crop.name}", target: "_blank", rel: "noopener noreferrer"
|
||||
= link_to "OpenFarm - Growing guide", "https://openfarm.cc/en/crops/#{URI.escape @crop.name}",
|
||||
target: "_blank",
|
||||
rel: "noopener noreferrer"
|
||||
%li
|
||||
= link_to "Gardenate - Planting reminders", "http://www.gardenate.com/plant/#{URI.escape @crop.name}", target: "_blank", rel: "noopener noreferrer"
|
||||
= link_to "Gardenate - Planting reminders", "http://www.gardenate.com/plant/#{URI.escape @crop.name}",
|
||||
target: "_blank", rel: "noopener noreferrer"
|
||||
- if current_member && current_member.location
|
||||
%li
|
||||
= link_to "Google", "http://www.google.com/search?q=#{URI.escape ["Growing", @crop.name, current_member.location].join(" ")}", target: "_blank", rel: "noopener noreferrer"
|
||||
= link_to "Google",
|
||||
'http://www.google.com/search?q=' + URI.escape(['Growing',
|
||||
@crop.name,
|
||||
current_member.location].join(' ')),
|
||||
target: "_blank",
|
||||
rel: "noopener noreferrer"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
%li= link_to "Full crop hierarchy", crops_hierarchy_path
|
||||
%li= link_to "Add Crop", new_crop_path
|
||||
|
||||
%div.crop_wranglers
|
||||
.crop_wranglers
|
||||
%h2 Crop Wranglers:
|
||||
%ul
|
||||
- @crop_wranglers.each do |crop_wrangler|
|
||||
@@ -17,12 +17,12 @@
|
||||
|
||||
.tabbable
|
||||
%ul.nav.nav-tabs
|
||||
%li{:class => @approval_status.blank? ? 'active' : ''}
|
||||
%li{ class: @approval_status.blank? ? 'active' : '' }
|
||||
= link_to "Recently added", wrangle_crops_path
|
||||
%li{:class => @approval_status == "pending" ? 'active' : ''}
|
||||
= link_to "Pending approval", wrangle_crops_path(:approval_status => "pending")
|
||||
%li{:class => @approval_status == "rejected" ? 'active' : ''}
|
||||
= link_to "Rejected", wrangle_crops_path(:approval_status => "rejected")
|
||||
%li{ class: @approval_status == "pending" ? 'active' : '' }
|
||||
= link_to "Pending approval", wrangle_crops_path(approval_status: "pending")
|
||||
%li{ class: @approval_status == "rejected" ? 'active' : '' }
|
||||
= link_to "Rejected", wrangle_crops_path(approval_status: "rejected")
|
||||
|
||||
%h2
|
||||
- if @approval_status == "pending"
|
||||
@@ -33,11 +33,12 @@
|
||||
Recently added crops
|
||||
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= page_entries_info @crops
|
||||
= will_paginate @crops
|
||||
|
||||
%table{:class => "table table-striped", :id => @approval_status.blank? ? 'recently-added-crops' : "#{@approval_status}-crops"}
|
||||
%table{ class: "table table-striped",
|
||||
id: @approval_status.blank? ? 'recently-added-crops' : "#{@approval_status}-crops" }
|
||||
%tr
|
||||
%th System name
|
||||
%th English Wikipedia URL
|
||||
@@ -63,7 +64,7 @@
|
||||
= distance_of_time_in_words(c.created_at, Time.zone.now)
|
||||
ago.
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= page_entries_info @crops
|
||||
= will_paginate @crops
|
||||
|
||||
|
||||
@@ -1,23 +1,25 @@
|
||||
= form_for @forum, :html => { :class => 'form-horizontal', :role => "form" } do |f|
|
||||
= form_for @forum, html: { class: 'form-horizontal', role: "form" } do |f|
|
||||
- if @forum.errors.any?
|
||||
#error_explanation
|
||||
%h2= "#{pluralize(@forum.errors.size, "error")} prohibited this forum from being saved:"
|
||||
%h2
|
||||
= pluralize(@forum.errors.size, "error")
|
||||
prohibited this forum from being saved:
|
||||
%ul
|
||||
- @forum.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.form-group
|
||||
= f.label :name, :class => 'control-label col-md-2'
|
||||
= f.label :name, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :name, :class => 'form-control'
|
||||
= f.text_field :name, class: 'form-control'
|
||||
.form-group
|
||||
= f.label :description, :class => 'control-label col-md-2'
|
||||
= f.label :description, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_area :description, :rows => 6, :class => 'form-control'
|
||||
= f.text_area :description, rows: 6, class: 'form-control'
|
||||
.form-group
|
||||
= f.label :owner_id, :class => 'control-label col-md-2'
|
||||
= f.label :owner_id, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= collection_select(:forum, :owner_id, Member.all, :id, :login_name, {}, :class => 'form-control')
|
||||
= collection_select(:forum, :owner_id, Member.all, :id, :login_name, {}, class: 'form-control')
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit 'Save', :class => 'btn btn-primary'
|
||||
= f.submit 'Save', class: 'btn btn-primary'
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
|
||||
- if can? :create, Forum
|
||||
%p
|
||||
= link_to "New forum", new_forum_path, :class => 'btn btn-default'
|
||||
= link_to "New forum", new_forum_path, class: 'btn btn-default'
|
||||
|
||||
- @forums.each do |forum|
|
||||
%h2= forum
|
||||
%p
|
||||
= localize_plural(forum.posts, Post)
|
||||
|
|
||||
=link_to "Visit forum", forum
|
||||
= link_to "Visit forum", forum
|
||||
|
|
||||
=link_to "Post", new_post_path(:forum_id => forum.id)
|
||||
=render :partial => "posts/summary", :locals => { :posts => forum.posts, :howmany => 4 }
|
||||
= link_to "Post", new_post_path(forum_id: forum.id)
|
||||
= render partial: "posts/summary", locals: { posts: forum.posts, howmany: 4 }
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
- content_for :title, @forum.name
|
||||
- content_for :opengraph do
|
||||
- if @forum.description
|
||||
= tag("meta", property: "og:description", content: strip_tags(@forum.description).split(' ')[0..20].join(' '))
|
||||
= tag("meta", property: "og:description", content: og_description(@forum.description))
|
||||
= tag("meta", property: "og:title", content: @forum.name)
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
@@ -18,18 +18,18 @@
|
||||
#{ strip_tags(@forum.description) }
|
||||
|
||||
- if can? :edit, @forum
|
||||
=link_to "Edit", edit_forum_path(@forum), :class => 'btn btn-default btn-xs'
|
||||
= link_to "Edit", edit_forum_path(@forum), class: 'btn btn-default btn-xs'
|
||||
- if can? :delete, @forum
|
||||
= link_to 'Delete', @forum, :method => :delete, :data => { :confirm => 'Are you sure?' }
|
||||
= link_to 'Delete', @forum, method: :delete, data: { confirm: 'Are you sure?' }
|
||||
|
||||
%h2
|
||||
Posts
|
||||
=link_to "Post something", new_post_path(:forum_id => @forum.id), :class => 'btn btn-primary'
|
||||
= link_to "Post something", new_post_path(forum_id: @forum.id), class: 'btn btn-primary'
|
||||
|
||||
- if @forum.posts.size > 0
|
||||
=render :partial => "posts/summary", :locals => { :posts => @forum.posts }
|
||||
- else
|
||||
- if @forum.posts.empty?
|
||||
No posts yet.
|
||||
- else
|
||||
= render partial: "posts/summary", locals: { posts: @forum.posts }
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,46 +1,50 @@
|
||||
= required_field_help_text
|
||||
|
||||
= form_for(@garden, :html => {:class => "form-horizontal", :role => "form"}) do |f|
|
||||
= form_for(@garden, html: { class: "form-horizontal", role: "form" }) do |f|
|
||||
- if @garden.errors.any?
|
||||
#error_explanation
|
||||
%h2= "#{pluralize(@garden.errors.size, "error")} prohibited this garden from being saved:"
|
||||
%h2
|
||||
= pluralize(@garden.errors.size, "error")
|
||||
prohibited this garden from being saved:
|
||||
%ul
|
||||
- @garden.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.form-group.required
|
||||
= f.label :name, :class => 'control-label col-md-2'
|
||||
= f.label :name, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :name, :class => 'form-control', :maxlength => 255, :required => "required"
|
||||
= f.text_field :name, class: 'form-control', maxlength: 255, required: "required"
|
||||
|
||||
.form-group
|
||||
= f.label :description, :class => 'control-label col-md-2'
|
||||
= f.label :description, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_area :description, :rows => 6, :class => 'form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
= f.text_area :description, rows: 6, class: 'form-control'
|
||||
= render partial: 'shared/form_optional'
|
||||
|
||||
.form-group
|
||||
= f.label :location, :class => 'control-label col-md-2'
|
||||
= f.label :location, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :location, :value => @garden.location || current_member.location, :class => 'form-control', :maxlength => 255
|
||||
= render :partial => 'shared/form_optional'
|
||||
= f.text_field :location,
|
||||
value: @garden.location || current_member.location,
|
||||
class: 'form-control', maxlength: 255
|
||||
= render partial: 'shared/form_optional'
|
||||
%span.help-block
|
||||
= t('.location_helper')
|
||||
- if current_member.location.blank?
|
||||
=link_to "Set your location now.", edit_member_registration_path
|
||||
= link_to "Set your location now.", edit_member_registration_path
|
||||
- else
|
||||
=link_to "Change your location.", edit_member_registration_path
|
||||
= link_to "Change your location.", edit_member_registration_path
|
||||
|
||||
.form-group
|
||||
= f.label :area, :class => 'control-label col-md-2'
|
||||
= f.label :area, class: 'control-label col-md-2'
|
||||
.col-md-2
|
||||
= f.number_field :area, :class => 'input-small form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
= f.number_field :area, class: 'input-small form-control'
|
||||
= render partial: 'shared/form_optional'
|
||||
.col-md-2
|
||||
= f.select(:area_unit, Garden::AREA_UNITS_VALUES, {:include_blank => false}, :class => 'form-control')
|
||||
= f.select(:area_unit, Garden::AREA_UNITS_VALUES, { include_blank: false }, class: 'form-control')
|
||||
|
||||
.form-group
|
||||
= f.label :active, 'Active? ', :class => 'control-label col-md-2'
|
||||
= f.label :active, 'Active? ', class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.check_box :active
|
||||
You can mark a garden as inactive if you no longer use it. Note:
|
||||
@@ -48,4 +52,4 @@
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit 'Save Garden', :class => 'btn btn-primary'
|
||||
= f.submit 'Save Garden', class: 'btn btn-primary'
|
||||
|
||||
15
app/views/gardens/_nav.haml
Normal file
15
app/views/gardens/_nav.haml
Normal file
@@ -0,0 +1,15 @@
|
||||
- content_for :buttonbar do
|
||||
- if current_member
|
||||
= link_to 'My Gardens', gardens_by_owner_path(owner: current_member.slug), class: 'btn btn-default'
|
||||
|
||||
= link_to "Everyone's gardens", gardens_path, class: 'btn btn-default'
|
||||
|
||||
|
||||
= link_to gardens_active_tickbox_path(@owner, show_all) do
|
||||
= check_box_tag 'active', 'all', show_all
|
||||
include in-active
|
||||
|
||||
- if can?(:create, Garden)
|
||||
= link_to 'Add a garden', new_garden_path, class: 'btn btn-primary'
|
||||
- unless current_member
|
||||
= render partial: 'shared/signin_signup', locals: { to: 'add a new garden' }
|
||||
@@ -3,12 +3,14 @@
|
||||
%h3.panel-title
|
||||
= link_to display_garden_name(garden), garden
|
||||
- if can? :edit, garden
|
||||
%a.pull-right{:href => edit_garden_path(garden), :role => "button", :id => "edit_garden_glyphicon"}
|
||||
%span.glyphicon.glyphicon-pencil{:title => "Edit"}
|
||||
.panel-body{:id => "gardens_panel_body"}
|
||||
%a.pull-right{ href: edit_garden_path(garden), role: "button", id: "edit_garden_glyphicon" }
|
||||
%span.glyphicon.glyphicon-pencil{ title: "Edit" }
|
||||
.panel-body{ id: "gardens_panel_body" }
|
||||
.row
|
||||
.col-md-4
|
||||
= link_to image_tag((garden.default_photo ? garden.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => garden.name, :class => 'img'), garden
|
||||
= link_to image_tag((garden.default_photo ? garden.default_photo.thumbnail_url : 'placeholder_150.png'),
|
||||
alt: garden.name, class: 'img'),
|
||||
garden_path(garden)
|
||||
.col-md-8
|
||||
%dl.dl-horizontal
|
||||
%dt Name :
|
||||
@@ -25,7 +27,8 @@
|
||||
%dd= garden.active ? "Yes" : "No"
|
||||
.col-md-12
|
||||
%b
|
||||
= "#{localize_plural(garden.plantings, Planting)} : "
|
||||
= localize_plural(garden.plantings, Planting)
|
||||
= ":"
|
||||
= display_garden_plantings(garden.plantings.current)
|
||||
- if garden.plantings.size > 2
|
||||
%br
|
||||
|
||||
@@ -1,32 +1,20 @@
|
||||
- content_for :title, @owner ? "#{@owner}'s gardens" : "Everyone's gardens"
|
||||
|
||||
%p
|
||||
- if can? :create, Garden
|
||||
- if @owner
|
||||
%p
|
||||
- if @owner == current_member
|
||||
= link_to 'Add a garden', new_garden_path, :class => 'btn btn-primary'
|
||||
= link_to "View everyone's gardens", gardens_path, :class => 'btn btn-default'
|
||||
- else # everyone's gardens
|
||||
= link_to 'Add a garden', new_garden_path, :class => 'btn btn-primary'
|
||||
- if current_member
|
||||
= link_to 'View your gardens', gardens_by_owner_path(:owner => current_member.slug), :class => 'btn btn-default'
|
||||
- else
|
||||
= render :partial => 'shared/signin_signup', :locals => { :to => 'add a new garden' }
|
||||
= render 'nav', owner: @owner, show_all: @show_all
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= page_entries_info @gardens
|
||||
= will_paginate @gardens
|
||||
|
||||
.row
|
||||
- if @gardens.size > 0
|
||||
- if @gardens.empty?
|
||||
%p There are no gardens to display.
|
||||
- else
|
||||
- @gardens.each do |garden|
|
||||
.col-md-6
|
||||
=render :partial => 'gardens/thumbnail', :locals => {:garden => garden}
|
||||
- else
|
||||
%p There are no gardens to display.
|
||||
= render partial: 'gardens/thumbnail', locals: { garden: garden }
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= page_entries_info @gardens
|
||||
= will_paginate @gardens
|
||||
|
||||
|
||||
@@ -1,31 +1,36 @@
|
||||
=content_for :title, "#{@garden.owner}'s #{@garden}"
|
||||
= content_for :title, "#{@garden.owner}'s #{@garden}"
|
||||
|
||||
- content_for :opengraph do
|
||||
- @garden.photos.each do |photo|
|
||||
= tag("meta", property: "og:image", content: photo.fullsize_url)
|
||||
- if @garden.description
|
||||
= tag("meta", property: "og:description", content: @garden.description)
|
||||
= tag("meta", property: "og:description", content: og_description(@garden.description))
|
||||
= tag("meta", property: "og:title", content: "#{@garden.owner}'s #{@garden}")
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
.row
|
||||
.col-md-9
|
||||
- if can? :edit, @garden or can? :delete, @garden
|
||||
- if can?(:edit, @garden) || can?(:delete, @garden)
|
||||
%p.btn-group
|
||||
- if can? :edit, @garden
|
||||
- if @garden.active
|
||||
= link_to "Plant something", new_planting_path(:garden_id => @garden.id), :class => 'btn btn-primary'
|
||||
= link_to "Mark as inactive", garden_path(@garden, :garden => {:active => 0}), |
|
||||
:method => :put, :class => 'btn btn-default', |
|
||||
= link_to "Plant something", new_planting_path(garden_id: @garden.id), class: 'btn btn-primary'
|
||||
= link_to "Mark as inactive", garden_path(@garden, garden: { active: 0 }),
|
||||
method: :put, class: 'btn btn-default',
|
||||
data: { confirm: 'All plantings associated with this garden will be marked as finished. Are you sure?' }
|
||||
- else
|
||||
= link_to "Mark as active", garden_path(@garden, :garden => {:active => 1}), :method => :put, :class => 'btn btn-default'
|
||||
= link_to 'Edit garden', edit_garden_path(@garden), :class => 'btn btn-default'
|
||||
- if can? :destroy, @garden
|
||||
= link_to 'Delete garden', @garden, method: :delete, |
|
||||
data: { confirm: 'All plantings associated with this garden will also be deleted. Are you sure?' }, :class => 'btn btn-default'
|
||||
= link_to "Mark as active", garden_path(@garden, garden: { active: 1 }),
|
||||
method: :put,
|
||||
class: 'btn btn-default'
|
||||
= link_to 'Edit garden', edit_garden_path(@garden), class: 'btn btn-default'
|
||||
- if can?(:destroy, @garden)
|
||||
= link_to 'Delete garden', @garden,
|
||||
method: :delete,
|
||||
data: { confirm: 'All plantings associated with this garden will also be deleted. Are you sure?' },
|
||||
class: 'btn btn-default'
|
||||
|
||||
- if ! @garden.active
|
||||
- unless @garden.active
|
||||
.alert.alert-warning
|
||||
This garden is inactive.
|
||||
- if can? :edit, @garden
|
||||
@@ -44,7 +49,7 @@
|
||||
Why not
|
||||
= link_to 'tell us more.', edit_garden_path(@garden)
|
||||
|
||||
- if @garden.photos.size > 0 or (can? :edit, @garden and can? :create, Photo)
|
||||
- if !@garden.photos.empty? || (can?(:edit, @garden) && can?(:create, Photo))
|
||||
.row-fluid
|
||||
%h3 Photos
|
||||
%p= localize_plural(@garden.photos, Photo)
|
||||
@@ -52,53 +57,51 @@
|
||||
%ul.thumbnails
|
||||
- @garden.photos.each do |p|
|
||||
.col-md-2.six-across
|
||||
= render :partial => 'photos/thumbnail', :locals => { :photo => p }
|
||||
= render partial: 'photos/thumbnail', locals: { photo: p }
|
||||
.row-fluid
|
||||
- if can? :create, Photo and can? :edit, @garden
|
||||
- if can?(:create, Photo) && can?(:edit, @garden)
|
||||
%p
|
||||
= link_to "Add photo", new_photo_path(:type => "garden", :id => @garden.id), :class => 'btn btn-primary'
|
||||
= link_to "Add photo", new_photo_path(type: "garden", id: @garden.id), class: 'btn btn-primary'
|
||||
|
||||
.row-fluid
|
||||
%h3 What's planted here?
|
||||
- if @garden.plantings.current.size > 0
|
||||
- @garden.plantings.current.each.with_index do |planting_current, index_current|
|
||||
= render partial: "plantings/thumbnail", locals: {:planting => planting_current}
|
||||
- if @garden.plantings.current.empty?
|
||||
%p Nothing is currently planted here.
|
||||
- else
|
||||
%p
|
||||
Nothing is currently planted here.
|
||||
- @garden.plantings.current.each.with_index do |planting_current, _|
|
||||
= render partial: "plantings/thumbnail", locals: { planting: planting_current }
|
||||
|
||||
.row-fluid
|
||||
%h3 Previously planted in this garden
|
||||
- if @garden.plantings.finished.size > 0
|
||||
- @garden.plantings.finished.each.with_index do |planting_finished|
|
||||
= render partial: "plantings/thumbnail", locals: {:planting => planting_finished}
|
||||
- if @garden.plantings.finished.empty?
|
||||
%p Nothing has been planted here.
|
||||
- else
|
||||
%p
|
||||
Nothing has been planted here.
|
||||
- @garden.plantings.finished.each.with_index do |planting_finished|
|
||||
= render partial: "plantings/thumbnail", locals: { planting: planting_finished }
|
||||
.col-md-3
|
||||
%h4 About this garden
|
||||
%p
|
||||
%strong Owner:
|
||||
= link_to @garden.owner, @garden.owner
|
||||
- if ! @garden.location.blank?
|
||||
- unless @garden.location.blank?
|
||||
%p
|
||||
%strong Location:
|
||||
= @garden.location
|
||||
- if ! @garden.area.blank?
|
||||
- unless @garden.area.blank?
|
||||
%p
|
||||
%strong Area:
|
||||
= pluralize(@garden.area, @garden.area_unit)
|
||||
|
||||
%h4= "#{@garden.owner}'s gardens"
|
||||
%h4 "#{@garden.owner}'s gardens"
|
||||
%ul
|
||||
- @garden.owner.gardens.active.each do |othergarden|
|
||||
%li
|
||||
- if @garden == othergarden
|
||||
= @garden
|
||||
- else
|
||||
= link_to "#{othergarden}", garden_path(othergarden)
|
||||
= link_to othergarden, garden_path(othergarden)
|
||||
|
||||
- if @garden.owner.gardens.inactive.size > 0
|
||||
- unless @garden.owner.gardens.inactive.empty?
|
||||
%h4= "Inactive gardens"
|
||||
%ul
|
||||
- @garden.owner.gardens.inactive.each do |othergarden|
|
||||
@@ -106,7 +109,7 @@
|
||||
- if @garden == othergarden
|
||||
= @garden
|
||||
- else
|
||||
= link_to "#{othergarden}", garden_path(othergarden)
|
||||
= link_to othergarden, garden_path(othergarden)
|
||||
|
||||
- if can? :create, @garden
|
||||
= link_to 'Add New Garden', new_garden_path, :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Add New Garden', new_garden_path, class: 'btn btn-default btn-xs'
|
||||
|
||||
@@ -1,63 +1,68 @@
|
||||
= required_field_help_text
|
||||
|
||||
= form_for(@harvest, :html => {:class => "form-horizontal", :role => :form}) do |f|
|
||||
= form_for(@harvest, html: { class: "form-horizontal", role: :form }) do |f|
|
||||
- if @harvest.errors.any?
|
||||
#error_explanation
|
||||
%h2= "#{pluralize(@harvest.errors.size, "error")} prohibited this harvest from being saved:"
|
||||
%h2
|
||||
= pluralize(@harvest.errors.size, "error")
|
||||
prohibited this harvest from being saved:"
|
||||
%ul
|
||||
- @harvest.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.form-group.required
|
||||
= f.label :crop, 'What did you harvest?', :class => 'control-label col-md-2'
|
||||
= f.label :crop, 'What did you harvest?', class: 'control-label col-md-2'
|
||||
- if @planting
|
||||
.col-md-8
|
||||
= link_to @planting.crop.name, planting_path(@planting)
|
||||
from
|
||||
= link_to @planting.garden.name, garden_path(@planting.garden)
|
||||
= link_to @planting.garden.name, garden_path(@planting.garden)
|
||||
= f.hidden_field :planting_id, value: @planting.id
|
||||
- else
|
||||
.col-md-4
|
||||
= auto_suggest @harvest, :crop, :class => 'form-control col-md-2', :default => @crop
|
||||
= auto_suggest @harvest, :crop, class: 'form-control col-md-2', default: @crop
|
||||
|
||||
.col-md-4
|
||||
= collection_select(:harvest, :plant_part_id, PlantPart.all, :id, :name, { :selected => @harvest.plant_part_id }, { :class => 'form-control', :prompt => 'e.g. fruit', :required => "required" })
|
||||
= collection_select(:harvest, :plant_part_id, PlantPart.all,
|
||||
:id, :name, { selected: @harvest.plant_part_id },
|
||||
class: 'form-control', prompt: 'e.g. fruit', required: "required")
|
||||
- unless @planting
|
||||
%span.help-block.col-md-8
|
||||
Can't find what you're looking for?
|
||||
= link_to "Request new crops.", new_crop_path
|
||||
|
||||
.form-group
|
||||
= f.label :harvested_at, 'When?', :class => 'control-label col-md-2'
|
||||
= f.label :harvested_at, 'When?', class: 'control-label col-md-2'
|
||||
.col-md-2
|
||||
= f.text_field :harvested_at, :value => @harvest.harvested_at ? @harvest.harvested_at.to_s(:ymd) : '', :class => 'add-datepicker form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
= f.text_field :harvested_at, value: @harvest.harvested_at ? @harvest.harvested_at.to_s(:ymd) : '',
|
||||
class: 'add-datepicker form-control'
|
||||
= render partial: 'shared/form_optional'
|
||||
|
||||
.form-group
|
||||
= f.label :quantity, 'How many?', :class => 'control-label col-md-2'
|
||||
= f.label :quantity, 'How many?', class: 'control-label col-md-2'
|
||||
.col-md-2
|
||||
-# Some browsers (eg Firefox for Android) assume "number" means
|
||||
-# "integer" unless you specify step="any":
|
||||
-# http://blog.isotoma.com/2012/03/html5-input-typenumber-and-decimalsfloats-in-chrome/
|
||||
= f.number_field :quantity, :class => 'input-small form-control', :step => 'any'
|
||||
= render :partial => 'shared/form_optional'
|
||||
= f.number_field :quantity, class: 'input-small form-control', step: 'any'
|
||||
= render partial: 'shared/form_optional'
|
||||
.col-md-2
|
||||
= f.select(:unit, Harvest::UNITS_VALUES, {:include_blank => false}, :class => 'input-medium form-control')
|
||||
= f.select(:unit, Harvest::UNITS_VALUES, { include_blank: false }, class: 'input-medium form-control')
|
||||
|
||||
.form-group
|
||||
= f.label :weight_quantity, 'Weighing (in total):', :class => 'control-label col-md-2'
|
||||
= f.label :weight_quantity, 'Weighing (in total):', class: 'control-label col-md-2'
|
||||
.col-md-2
|
||||
= f.number_field :weight_quantity, :class => 'input-small form-control', :step => 'any'
|
||||
= render :partial => 'shared/form_optional'
|
||||
= f.number_field :weight_quantity, class: 'input-small form-control', step: 'any'
|
||||
= render partial: 'shared/form_optional'
|
||||
.col-md-2
|
||||
= f.select(:weight_unit, Harvest::WEIGHT_UNITS_VALUES, {:include_blank => false}, :class => 'form-control')
|
||||
= f.select(:weight_unit, Harvest::WEIGHT_UNITS_VALUES, { include_blank: false }, class: 'form-control')
|
||||
.form-group
|
||||
= f.label :description, 'Notes', :class => 'control-label col-md-2'
|
||||
= f.label :description, 'Notes', class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_area :description, :rows => 6, :class => 'form-control'
|
||||
= render :partial => 'shared/form_optional'
|
||||
= f.text_area :description, rows: 6, class: 'form-control'
|
||||
= render partial: 'shared/form_optional'
|
||||
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit 'Save', :class => 'btn btn-primary'
|
||||
= f.submit 'Save', class: 'btn btn-primary'
|
||||
|
||||
|
||||
@@ -3,12 +3,14 @@
|
||||
%h3.panel-title
|
||||
= link_to "#{harvest.owner.login_name}'s #{harvest.crop.name} harvest", harvest
|
||||
- if can? :edit, harvest
|
||||
%a.pull-right{:href => edit_harvest_path(harvest), :role => "button", :id => "edit_harvest_glyphicon"}
|
||||
%span.glyphicon.glyphicon-pencil{:title => "Edit"}
|
||||
%a.pull-right{ href: edit_harvest_path(harvest), role: "button", id: "edit_harvest_glyphicon" }
|
||||
%span.glyphicon.glyphicon-pencil{ title: "Edit" }
|
||||
.panel-body
|
||||
.row
|
||||
.col-md-4
|
||||
= link_to image_tag((harvest.default_photo ? harvest.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => harvest.crop.name, :class => 'img'), harvest.crop
|
||||
= link_to image_tag((harvest.default_photo ? harvest.default_photo.thumbnail_url : 'placeholder_150.png'),
|
||||
alt: harvest.crop.name, class: 'img'),
|
||||
harvest.crop
|
||||
.col-md-8
|
||||
%dl.dl-horizontal
|
||||
%dt Crop :
|
||||
@@ -23,5 +25,5 @@
|
||||
%dt Description
|
||||
%dd.truncate
|
||||
= display_harvest_description(harvest)
|
||||
= if not harvest.description.empty?
|
||||
= if harvest.description.present?
|
||||
- link_to "Read more", harvest_path(harvest)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
- content_for :title, @owner ? t('.title.owner_harvests', owner: @owner) : @crop ? t('.title.crop_harvests', crop: @crop.name) : t('.title.default')
|
||||
- content_for :title, title('harvests', @owner, @crop)
|
||||
|
||||
- if @owner
|
||||
= link_to "View #{@owner}'s profile >>", member_path(@owner)
|
||||
|
||||
@@ -11,33 +12,33 @@
|
||||
- if @owner
|
||||
%p
|
||||
- if @owner == current_member
|
||||
= link_to 'Add harvest', new_harvest_path, :class => 'btn btn-primary'
|
||||
= link_to "View everyone's harvests", harvests_path, :class => 'btn btn-default'
|
||||
= link_to 'Add harvest', new_harvest_path, class: 'btn btn-primary'
|
||||
= link_to "View everyone's harvests", harvests_path, class: 'btn btn-default'
|
||||
- else # everyone's harvests
|
||||
= link_to 'Add harvest', new_harvest_path, :class => 'btn btn-primary'
|
||||
= link_to 'Add harvest', new_harvest_path, class: 'btn btn-primary'
|
||||
- if current_member
|
||||
= link_to 'View your harvests', harvests_by_owner_path(:owner => current_member.slug), :class => 'btn btn-default'
|
||||
= link_to 'View your harvests', harvests_by_owner_path(owner: current_member.slug), class: 'btn btn-default'
|
||||
- else
|
||||
= render :partial => 'shared/signin_signup', :locals => { :to => 'track your harvests' }
|
||||
= render partial: 'shared/signin_signup', locals: { to: 'track your harvests' }
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= page_entries_info @harvests
|
||||
= will_paginate @harvests
|
||||
.row
|
||||
- if @harvests.size > 0
|
||||
- unless @harvests.empty?
|
||||
- @harvests.each do |harvest|
|
||||
.col-md-6
|
||||
=render :partial => 'harvests/thumbnail', :locals => {:harvest => harvest}
|
||||
= render partial: 'harvests/thumbnail', locals: { harvest: harvest }
|
||||
|
||||
%div.pagination
|
||||
.pagination
|
||||
= page_entries_info @harvests
|
||||
= will_paginate @harvests
|
||||
|
||||
%ul.list-inline
|
||||
%li The data on this page is available in the following formats:
|
||||
- if @owner
|
||||
%li= link_to "CSV", harvests_by_owner_path(@owner, :format => 'csv')
|
||||
%li= link_to "JSON", harvests_by_owner_path(@owner, :format => 'json')
|
||||
%li= link_to "CSV", harvests_by_owner_path(@owner, format: 'csv')
|
||||
%li= link_to "JSON", harvests_by_owner_path(@owner, format: 'json')
|
||||
- else
|
||||
%li= link_to "CSV", harvests_path(:format => 'csv')
|
||||
%li= link_to "JSON", harvests_path(:format => 'json')
|
||||
%li= link_to "CSV", harvests_path(format: 'csv')
|
||||
%li= link_to "JSON", harvests_path(format: 'json')
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
=content_for :title, "#{@harvest.crop} harvested by #{@harvest.owner}"
|
||||
= content_for :title, "#{@harvest.crop} harvested by #{@harvest.owner}"
|
||||
- content_for :opengraph do
|
||||
- @harvest.photos.each do |photo|
|
||||
= tag("meta", property: "og:image", content: photo.fullsize_url)
|
||||
@@ -14,7 +14,7 @@
|
||||
%b Owner:
|
||||
= link_to @harvest.owner, @harvest.owner
|
||||
—
|
||||
= link_to "view all #{@harvest.owner}'s harvests", harvests_by_owner_path(:owner => @harvest.owner.slug)
|
||||
= link_to "view all #{@harvest.owner}'s harvests", harvests_by_owner_path(owner: @harvest.owner.slug)
|
||||
%p
|
||||
%b Plant part:
|
||||
- if @harvest.plant_part
|
||||
@@ -27,36 +27,39 @@
|
||||
|
||||
- if @planting
|
||||
%p
|
||||
%b Garden:
|
||||
%b Planting:
|
||||
= link_to "#{@planting.crop.name} planted on #{@planting.planted_at}", planting_path(@planting)
|
||||
in
|
||||
= link_to @planting.garden, garden_path(@planting.garden)
|
||||
%p
|
||||
%b Quantity:
|
||||
= display_quantity(@harvest)
|
||||
|
||||
- if can? :edit, @harvest or can? :destroy, @harvest
|
||||
- if can?(:edit, @harvest) || can?(:destroy, @harvest)
|
||||
%p
|
||||
- if can? :edit, @harvest
|
||||
=link_to 'Edit', edit_harvest_path(@harvest), :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Edit', edit_harvest_path(@harvest), class: 'btn btn-default btn-xs'
|
||||
- if can? :destroy, @harvest
|
||||
=link_to 'Delete', @harvest, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
|
||||
= link_to 'Delete', @harvest, method: :delete, data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs'
|
||||
|
||||
.col-md-6
|
||||
= render :partial => "crops/index_card", :locals => { :crop => @harvest.crop}
|
||||
= render partial: "crops/index_card", locals: { crop: @harvest.crop }
|
||||
|
||||
%h2 Notes
|
||||
|
||||
:growstuff_markdown
|
||||
#{ @harvest.description != "" ? @harvest.description : "No description given." }
|
||||
#{ @harvest.description != "" ? strip_tags(@harvest.description) : "No description given." }
|
||||
|
||||
- if @harvest.photos.size > 0 or (can? :edit, @harvest and can? :create, Photo)
|
||||
- if !@harvest.photos.empty? || (can?(:edit, @harvest) && can?(:create, Photo))
|
||||
%h2 Pictures
|
||||
|
||||
%ul.thumbnails
|
||||
- @harvest.photos.each do |p|
|
||||
.col-md-2.six-across
|
||||
= render :partial => 'photos/thumbnail', :locals => { :photo => p }
|
||||
- if can? :create, Photo and can? :edit, @harvest
|
||||
= render partial: 'photos/thumbnail', locals: { photo: p }
|
||||
- if can?(:create, Photo) && can?(:edit, @harvest)
|
||||
.col-md-2
|
||||
.thumbnail(style='height: 220px')
|
||||
%p{:style => 'text-align: center; padding-top: 50px'}
|
||||
= link_to "Add photo", new_photo_path(:type => "harvest", :id => @harvest.id), :class => 'btn btn-primary'
|
||||
.thumbnail{ style: 'height: 220px' }
|
||||
%p{ style: 'text-align: center; padding-top: 50px' }
|
||||
= link_to "Add photo", new_photo_path(type: "harvest", id: @harvest.id), class: 'btn btn-primary'
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
.col-md-8.info
|
||||
%p= t('.intro', site_name: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
= render :partial => 'stats'
|
||||
= render partial: 'stats'
|
||||
.col-md-4.signup
|
||||
%p= t('.perks')
|
||||
%p= link_to(t('.sign_up'), new_member_registration_path, :class => 'btn btn-primary btn-lg')
|
||||
%p= link_to(t('.sign_up'), new_member_registration_path, class: 'btn btn-primary btn-lg')
|
||||
%p
|
||||
%small
|
||||
= t('.already_html', sign_in: link_to(t('.sign_in_linktext'), new_member_session_path))
|
||||
|
||||
@@ -5,24 +5,24 @@
|
||||
.hidden-xs
|
||||
- Crop.interesting.first(8).each do |c|
|
||||
.col-md-3
|
||||
= render :partial => 'crops/thumbnail', :locals => { :crop => c }
|
||||
= render partial: 'crops/thumbnail', locals: { crop: c }
|
||||
.visible-xs
|
||||
- Crop.interesting.first(3).each do |c|
|
||||
.col-md-3
|
||||
= render :partial => 'crops/thumbnail', :locals => { :crop => c }
|
||||
= render partial: 'crops/thumbnail', locals: { crop: c }
|
||||
|
||||
.col-md-4.hidden-xs
|
||||
- cache cache_key_for(Planting) do
|
||||
%h2= t('.recently_planted')
|
||||
= render :partial => 'plantings/list', :locals => { :plantings => Planting.interesting.first(6) }
|
||||
= render partial: 'plantings/list', locals: { :plantings => Planting.interesting.first(6) }
|
||||
|
||||
.row
|
||||
.col-md-12
|
||||
- cache cache_key_for(Crop, 'recent') do
|
||||
%p{ :style => 'margin-top: 11.25px' }
|
||||
%p{ style: 'margin-top: 11.25px' }
|
||||
%strong
|
||||
#{t('.recently_added')}:
|
||||
!= Crop.recent.limit(12).map {|c| link_to(c, c) }.join(", ")
|
||||
|
||||
%p.text-right
|
||||
=link_to "#{t('.view_all')} »", crops_path
|
||||
= link_to "#{t('.view_all')} »", crops_path
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
- posts = Post.limit(6)
|
||||
- if posts
|
||||
=render :partial => "posts/summary", :locals => { :posts => posts, :howmany => 6 }
|
||||
= render partial: "posts/summary", locals: {posts: posts, howmany: 6 }
|
||||
|
||||
- cache cache_key_for(Forum) do
|
||||
- forums = Forum.all
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user