mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-05-25 09:19:15 -04:00
Compare commits
349 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ff468aa50 | ||
|
|
4261f16cd0 | ||
|
|
b8884beb2f | ||
|
|
bc88c4d8c7 | ||
|
|
3ac4fbcdb8 | ||
|
|
549426e3e0 | ||
|
|
25a1f0da9a | ||
|
|
3be2fc6241 | ||
|
|
837934167b | ||
|
|
d43d8ae0e7 | ||
|
|
035b2399ca | ||
|
|
1a3e976ba5 | ||
|
|
d31739f86a | ||
|
|
0f523381f0 | ||
|
|
550848a513 | ||
|
|
ae3752e021 | ||
|
|
50624fb2cb | ||
|
|
818466a142 | ||
|
|
e184503caa | ||
|
|
d00f743c47 | ||
|
|
b19a991106 | ||
|
|
88e019a19f | ||
|
|
e954ba801b | ||
|
|
be23bfc419 | ||
|
|
5e984ce04a | ||
|
|
d15eb32133 | ||
|
|
21f11a4d5d | ||
|
|
ae398f1a63 | ||
|
|
cd3cee5d5f | ||
|
|
9030e5b978 | ||
|
|
9d6ac9fd8b | ||
|
|
403a8814e1 | ||
|
|
00c34ef30c | ||
|
|
738c0d4e08 | ||
|
|
82e27f8a71 | ||
|
|
fbc203ca0d | ||
|
|
c83bfc101e | ||
|
|
22905235c1 | ||
|
|
4d3b94b7f0 | ||
|
|
9e19aae0ca | ||
|
|
d8c3f7ed34 | ||
|
|
28a6cfe25c | ||
|
|
630d539f7d | ||
|
|
4704bd89f8 | ||
|
|
076695d349 | ||
|
|
3925a54340 | ||
|
|
6c566c56d8 | ||
|
|
bcc89674d4 | ||
|
|
e1dab634a2 | ||
|
|
e06e002282 | ||
|
|
23ed7f91ba | ||
|
|
aa511aedb4 | ||
|
|
2b03381a24 | ||
|
|
6017c4ba23 | ||
|
|
a46b8ebe76 | ||
|
|
a4f8b3a0e6 | ||
|
|
1b8c413b90 | ||
|
|
7a334abf1d | ||
|
|
5c067c87b8 | ||
|
|
87bc1becb0 | ||
|
|
7c0d6c04df | ||
|
|
01415fd04f | ||
|
|
e0def646ce | ||
|
|
a52731dc4b | ||
|
|
cd2500c99a | ||
|
|
c9a197bc61 | ||
|
|
c5439c8650 | ||
|
|
6d0a7ebc8f | ||
|
|
0d1bab04d5 | ||
|
|
e6b23262da | ||
|
|
06ea3db252 | ||
|
|
8d24ffbffb | ||
|
|
cce9f513db | ||
|
|
c37ba9f041 | ||
|
|
f8c56cc217 | ||
|
|
d11e6f484a | ||
|
|
9218a03e2b | ||
|
|
da760a8a4c | ||
|
|
9ccecf0e04 | ||
|
|
5ec105ad19 | ||
|
|
5c1f5f4312 | ||
|
|
48d3a64e7b | ||
|
|
decd48a970 | ||
|
|
540ac7b034 | ||
|
|
8112133cf2 | ||
|
|
55f00ed0f8 | ||
|
|
d0999c2f9a | ||
|
|
47150a8ad8 | ||
|
|
9301688763 | ||
|
|
248b89a564 | ||
|
|
8e9ffac64e | ||
|
|
65024d8f83 | ||
|
|
8ab70a1c1c | ||
|
|
2c871abd03 | ||
|
|
8b4491d0ab | ||
|
|
93202fc13c | ||
|
|
0f520c0928 | ||
|
|
21c989989c | ||
|
|
123c34b6d1 | ||
|
|
f5e786401d | ||
|
|
6ecb919f34 | ||
|
|
c89d1ae94e | ||
|
|
9b7a7d3e8f | ||
|
|
9ebe830402 | ||
|
|
9a0adadc9a | ||
|
|
92c3976f0a | ||
|
|
01c25df8cf | ||
|
|
9ae35ca6eb | ||
|
|
43f9707c11 | ||
|
|
4fa423bcab | ||
|
|
97d0bb6752 | ||
|
|
b9edd2f89b | ||
|
|
4bd50ca433 | ||
|
|
a2dd675717 | ||
|
|
1275aa0102 | ||
|
|
f40ff18949 | ||
|
|
f25d4dbf8c | ||
|
|
4dd99f54db | ||
|
|
b8e06a1d1d | ||
|
|
f7b8113af1 | ||
|
|
b0394d1028 | ||
|
|
fa0c00aa9c | ||
|
|
a507eb47bf | ||
|
|
865f323f97 | ||
|
|
c82f47bdda | ||
|
|
72d0514e75 | ||
|
|
dc62365c7d | ||
|
|
d8d94d178c | ||
|
|
6afb12c157 | ||
|
|
a0be52fdaa | ||
|
|
6b8474e01b | ||
|
|
23ae7fcd8c | ||
|
|
179cfbf6bc | ||
|
|
b5f82a8fc8 | ||
|
|
54c01cbd82 | ||
|
|
cf9e5a6652 | ||
|
|
01c6a6da9f | ||
|
|
cc1daf8f6b | ||
|
|
a0bf815663 | ||
|
|
ce573c1e55 | ||
|
|
be2426c99f | ||
|
|
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 | ||
|
|
d301f2f2ae | ||
|
|
2accb727e5 | ||
|
|
16db285898 | ||
|
|
b8c0882642 | ||
|
|
cc54dc54b4 | ||
|
|
3f8ebdc477 | ||
|
|
68120c5bbe | ||
|
|
71ec9fd2d3 | ||
|
|
f11bc42507 | ||
|
|
7672b9ffc8 | ||
|
|
8d237cc2ee | ||
|
|
a875a7c883 | ||
|
|
19d65587be | ||
|
|
3fed962dcc | ||
|
|
987f50c87e | ||
|
|
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
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -14,4 +14,5 @@ Pathogen:
|
||||
custom_plan.rb
|
||||
zeus.json
|
||||
.bundle
|
||||
.idea/**
|
||||
.idea/**
|
||||
public/**
|
||||
|
||||
4
.haml-lint.yml
Normal file
4
.haml-lint.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
linters:
|
||||
LineLength:
|
||||
max: 120
|
||||
|
||||
10
.rubocop.yml
10
.rubocop.yml
@@ -32,12 +32,12 @@ Metrics/MethodLength:
|
||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
|
||||
# Set to 30 once all methods are fixed.
|
||||
# Max: 30
|
||||
Max: 104
|
||||
Max: 34
|
||||
|
||||
# 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'
|
||||
|
||||
@@ -55,7 +55,7 @@ Lint/Void:
|
||||
# Offense count: 55
|
||||
# Configuration parameters: CountComments, ExcludedMethods.
|
||||
Metrics/BlockLength:
|
||||
Exclude:
|
||||
Exclude:
|
||||
- '**/*'
|
||||
|
||||
# Offense count: 2
|
||||
@@ -65,19 +65,6 @@ Performance/StringReplacement:
|
||||
- 'app/models/planting.rb'
|
||||
- 'spec/rails_helper.rb'
|
||||
|
||||
# Offense count: 9
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: strict, flexible
|
||||
Rails/Date:
|
||||
Exclude:
|
||||
- 'app/controllers/harvests_controller.rb'
|
||||
- 'db/seeds.rb'
|
||||
- 'lib/tasks/growstuff.rake'
|
||||
- 'spec/controllers/plantings_controller_spec.rb'
|
||||
- 'spec/factories/planting.rb'
|
||||
- 'spec/features/plantings/planting_a_crop_spec.rb'
|
||||
- 'spec/features/shared_examples/append_date.rb'
|
||||
|
||||
# Offense count: 4
|
||||
Rails/FilePath:
|
||||
Exclude:
|
||||
@@ -90,13 +77,6 @@ Rails/OutputSafety:
|
||||
- 'app/helpers/auto_suggest_helper.rb'
|
||||
- 'app/helpers/gardens_helper.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Configuration parameters: Include.
|
||||
# Include: db/migrate/*.rb
|
||||
Rails/ReversibleMigration:
|
||||
Exclude:
|
||||
- 'db/migrate/20130215131921_rename_notification_fields.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# Configuration parameters: Blacklist.
|
||||
# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters
|
||||
@@ -148,11 +128,9 @@ Style/BarePercentLiterals:
|
||||
# IgnoredMethods: lambda, proc, it
|
||||
Style/BlockDelimiters:
|
||||
Exclude:
|
||||
- 'app/controllers/alternate_names_controller.rb'
|
||||
- 'app/controllers/members_controller.rb'
|
||||
- 'app/controllers/posts_controller.rb'
|
||||
- 'app/controllers/scientific_names_controller.rb'
|
||||
- 'spec/controllers/harvests_controller_spec.rb'
|
||||
- 'spec/controllers/order_items_controller_spec.rb'
|
||||
- 'spec/features/notifications_spec.rb'
|
||||
- 'spec/models/ability_spec.rb'
|
||||
@@ -204,12 +182,6 @@ Style/CommentAnnotation:
|
||||
Exclude:
|
||||
- 'app/controllers/crops_controller.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
Style/DefWithParentheses:
|
||||
Exclude:
|
||||
- 'spec/views/posts/_single.html.haml_spec.rb'
|
||||
|
||||
# Offense count: 10
|
||||
# Cop supports --auto-correct.
|
||||
Style/EachForSimpleLoop:
|
||||
@@ -225,7 +197,6 @@ Style/EmptyMethod:
|
||||
Exclude:
|
||||
- 'app/controllers/account_types_controller.rb'
|
||||
- 'app/controllers/accounts_controller.rb'
|
||||
- 'app/controllers/alternate_names_controller.rb'
|
||||
- 'app/controllers/gardens_controller.rb'
|
||||
- 'app/controllers/photos_controller.rb'
|
||||
- 'app/controllers/plant_parts_controller.rb'
|
||||
@@ -269,31 +240,6 @@ Style/Lambda:
|
||||
- 'spec/controllers/member_controller_spec.rb'
|
||||
- 'spec/models/photo_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# Cop supports --auto-correct.
|
||||
Style/MethodCallWithoutArgsParentheses:
|
||||
Exclude:
|
||||
- 'spec/helpers/application_helper_spec.rb'
|
||||
- 'spec/views/plantings/new.html.haml_spec.rb'
|
||||
|
||||
# Offense count: 8
|
||||
# Cop supports --auto-correct.
|
||||
Style/MultilineBlockLayout:
|
||||
Exclude:
|
||||
- 'app/controllers/members_controller.rb'
|
||||
- 'app/controllers/posts_controller.rb'
|
||||
- 'spec/models/ability_spec.rb'
|
||||
- 'spec/models/member_spec.rb'
|
||||
- 'spec/models/planting_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: symmetrical, new_line, same_line
|
||||
Style/MultilineHashBraceLayout:
|
||||
Exclude:
|
||||
- 'app/models/planting.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
Style/MultilineIfModifier:
|
||||
@@ -307,54 +253,6 @@ Style/MultilineIfThen:
|
||||
- 'script/check_contributors_md'
|
||||
- 'script/gemfile_check'
|
||||
|
||||
# Offense count: 95
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: symmetrical, new_line, same_line
|
||||
Style/MultilineMethodCallBraceLayout:
|
||||
Exclude:
|
||||
- 'app/controllers/application_controller.rb'
|
||||
- 'app/controllers/authentications_controller.rb'
|
||||
- 'app/controllers/seeds_controller.rb'
|
||||
- 'spec/controllers/order_items_controller_spec.rb'
|
||||
- 'spec/helpers/gardens_helper_spec.rb'
|
||||
- 'spec/helpers/harvests_helper_spec.rb'
|
||||
- 'spec/helpers/plantings_helper_spec.rb'
|
||||
- 'spec/helpers/seeds_helper_spec.rb'
|
||||
- 'spec/models/ability_spec.rb'
|
||||
- 'spec/models/crop_spec.rb'
|
||||
- 'spec/models/harvest_spec.rb'
|
||||
- 'spec/models/member_spec.rb'
|
||||
- 'spec/models/order_spec.rb'
|
||||
- 'spec/models/plant_part_spec.rb'
|
||||
- 'spec/models/planting_spec.rb'
|
||||
- 'spec/models/post_spec.rb'
|
||||
- 'spec/views/account_types/edit.html.haml_spec.rb'
|
||||
- 'spec/views/account_types/new.html.haml_spec.rb'
|
||||
- 'spec/views/account_types/show.html.haml_spec.rb'
|
||||
- 'spec/views/crops/_grown_for.html.haml_spec.rb'
|
||||
- 'spec/views/crops/_planting_advice.html.haml_spec.rb'
|
||||
- 'spec/views/forums/edit.html.haml_spec.rb'
|
||||
- 'spec/views/harvests/index.html.haml_spec.rb'
|
||||
- 'spec/views/orders/show.html.haml_spec.rb'
|
||||
- 'spec/views/photos/edit.html.haml_spec.rb'
|
||||
- 'spec/views/plant_parts/edit.html.haml_spec.rb'
|
||||
- 'spec/views/plant_parts/new.html.haml_spec.rb'
|
||||
- 'spec/views/plantings/_form.html.haml_spec.rb'
|
||||
- 'spec/views/plantings/edit.html.haml_spec.rb'
|
||||
- 'spec/views/plantings/index.html.haml_spec.rb'
|
||||
- 'spec/views/plantings/new.html.haml_spec.rb'
|
||||
- 'spec/views/plantings/show.html.haml_spec.rb'
|
||||
- 'spec/views/posts/edit.html.haml_spec.rb'
|
||||
- 'spec/views/products/edit.html.haml_spec.rb'
|
||||
- 'spec/views/products/new.html.haml_spec.rb'
|
||||
- 'spec/views/roles/edit.html.haml_spec.rb'
|
||||
- 'spec/views/roles/index.html.haml_spec.rb'
|
||||
- 'spec/views/roles/new.html.haml_spec.rb'
|
||||
- 'spec/views/roles/show.html.haml_spec.rb'
|
||||
- 'spec/views/scientific_names/edit.html.haml_spec.rb'
|
||||
- 'spec/views/scientific_names/show.html.haml_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
Style/MultilineTernaryOperator:
|
||||
Exclude:
|
||||
@@ -377,7 +275,6 @@ Style/NegatedIf:
|
||||
# Offense count: 2
|
||||
Style/NestedTernaryOperator:
|
||||
Exclude:
|
||||
- 'app/controllers/harvests_controller.rb'
|
||||
- 'app/controllers/plantings_controller.rb'
|
||||
|
||||
# Offense count: 1
|
||||
@@ -425,15 +322,6 @@ Style/ParallelAssignment:
|
||||
Exclude:
|
||||
- 'app/mailers/notifier.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowSafeAssignment.
|
||||
Style/ParenthesesAroundCondition:
|
||||
Exclude:
|
||||
- 'app/controllers/application_controller.rb'
|
||||
- 'app/controllers/orders_controller.rb'
|
||||
- 'app/helpers/crops_helper.rb'
|
||||
- 'config/factory_girl.rb'
|
||||
|
||||
# Offense count: 5
|
||||
# Cop supports --auto-correct.
|
||||
@@ -506,44 +394,12 @@ Style/TernaryParentheses:
|
||||
Exclude:
|
||||
- 'app/helpers/plantings_helper.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline.
|
||||
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
||||
Style/TrailingCommaInArguments:
|
||||
Exclude:
|
||||
- 'db/seeds.rb'
|
||||
- 'lib/actions/oauth_signup_action.rb'
|
||||
- 'lib/tasks/growstuff.rake'
|
||||
|
||||
# Offense count: 4
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline.
|
||||
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
||||
Style/TrailingCommaInLiteral:
|
||||
Exclude:
|
||||
- 'config/environments/test.rb'
|
||||
- 'spec/rails_helper.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
Style/UnlessElse:
|
||||
Exclude:
|
||||
- 'app/controllers/omniauth_callbacks_controller.rb'
|
||||
|
||||
# Offense count: 12
|
||||
# Cop supports --auto-correct.
|
||||
Style/UnneededInterpolation:
|
||||
Exclude:
|
||||
- 'spec/features/crops/crop_wranglers_spec.rb'
|
||||
- 'spec/features/following_spec.rb'
|
||||
- 'spec/features/shared_examples/append_date.rb'
|
||||
- 'spec/models/crop_spec.rb'
|
||||
- 'spec/models/forum_spec.rb'
|
||||
- 'spec/models/member_spec.rb'
|
||||
- 'spec/models/plant_part_spec.rb'
|
||||
- 'spec/views/layouts/_header_spec.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# Cop supports --auto-correct.
|
||||
Style/UnneededPercentQ:
|
||||
|
||||
30
.travis.yml
30
.travis.yml
@@ -4,12 +4,16 @@ cache:
|
||||
bundler: true
|
||||
directories:
|
||||
- travis_phantomjs
|
||||
- tmp/cache/assets/test/sprockets
|
||||
env:
|
||||
matrix:
|
||||
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='true'
|
||||
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='false'
|
||||
- GROWSTUFF_ELASTICSEARCH='true' RSPEC_TAG=elasticsearch
|
||||
- GROWSTUFF_ELASTICSEARCH='false' RSPEC_TAG=~elasticsearch
|
||||
- STATIC_CHECKS='true'
|
||||
global:
|
||||
secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
|
||||
- GROWSTUFF_SITE_NAME="Growstuff (travis)"
|
||||
- RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
|
||||
- secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
|
||||
rvm:
|
||||
- 2.3.3
|
||||
before_install:
|
||||
@@ -24,14 +28,20 @@ before_install:
|
||||
fi
|
||||
- phantomjs --version
|
||||
before_script:
|
||||
- bundle exec rake db:create db:migrate db:test:prepare
|
||||
- bundle exec rake assets:precompile
|
||||
- >
|
||||
if [ "$STATIC_CHECKS" != 'true' ]; then
|
||||
bundle exec rake db:create db:migrate db:test:prepare
|
||||
bundle exec rake assets:precompile
|
||||
fi
|
||||
script:
|
||||
- bundle exec rubocop --display-cop-names --rails
|
||||
- script/gemfile_check
|
||||
- bundle exec script/check_contributors_md
|
||||
- bundle exec rake db:migrate --trace
|
||||
- bundle exec rspec spec/
|
||||
- >
|
||||
if [ "$STATIC_CHECKS" = 'true' ]; then
|
||||
bundle exec script/check_static
|
||||
else
|
||||
bundle exec rake db:migrate --trace
|
||||
bundle exec rspec --tag $RSPEC_TAG spec/
|
||||
bundle exec rake jasmine:ci
|
||||
fi
|
||||
services:
|
||||
- elasticsearch
|
||||
before_deploy:
|
||||
|
||||
@@ -7,7 +7,27 @@ When you create a pull request, please include the following:
|
||||
* Make sure you have automated tests for your work, where possible.
|
||||
* Add your name (and that of your pair partner, if any) to [CONTRIBUTORS.md](CONTRIBUTORS.md).
|
||||
|
||||
If you would like to discuss your work before submitting a pull request,
|
||||
please join any of our [Discussion
|
||||
forums](http://wiki.growstuff.org/index.php/Discussion_forums), where
|
||||
our dev team will be happy to help you.
|
||||
All pull requests should pass our automatic continuous integration and style
|
||||
checks before being merged. You can run tests locally as follows:
|
||||
|
||||
- `rake` to run all tests and static checks
|
||||
- `rake spec` to run all Ruby tests
|
||||
- `rake spec:models` to run Ruby model tests (or `rake spec:views` for view tests, etc)
|
||||
- `rake static` to run all static checks (code style, unfixed Git conflicts, etc)
|
||||
- `rake jasmine:ci` to run JavaScript unit tests in headless mode
|
||||
- `rake jasmine` to start a server for running JavaScript unit tests in a
|
||||
browser (eg for debugging). Point your browser at http://localhost:8888 to
|
||||
run the tests.
|
||||
- `rspec ./spec/path/to/my_spec.rb` to run all Ruby tests in the file `my_spec.rb`
|
||||
- `rspec ./spec/path/to/my_spec.rb:45` to run the Ruby test starting on line 45 of
|
||||
`my_spec.rb`. RSpec will output a list of command-lines in this form for all
|
||||
failing tests so you can easily re-run particular ones.
|
||||
- `rspec --only-failures` to re-run all Ruby tests that failed last time.
|
||||
|
||||
You can run `rake -T` to see a list of available Rake tasks. If you can't get
|
||||
some tests to pass, please submit a pull request anyway - we'll be happy to
|
||||
help you debug the failures.
|
||||
|
||||
If you would like to discuss an idea before submitting a pull request,
|
||||
please open a [GitHub Issue](https://github.com/growstuff/growstuff/issues),
|
||||
where our dev team will be happy to help you.
|
||||
|
||||
@@ -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)
|
||||
|
||||
8
Gemfile
8
Gemfile
@@ -27,7 +27,7 @@ gem 'csv_shaper' # CSV export
|
||||
gem 'figaro' # for handling config via ENV variables
|
||||
gem 'gibbon', '~>1.2.0' # for Mailchimp newsletter subscriptions
|
||||
gem 'leaflet-markercluster-rails'
|
||||
gem 'leaflet-rails'
|
||||
gem 'leaflet-rails', '~> 0.7.7' # Newer versions break tests - see https://travis-ci.org/CloCkWeRX/growstuff/builds/200984350
|
||||
gem 'pg'
|
||||
gem 'ruby-units' # for unit conversion
|
||||
gem 'unicorn' # http server
|
||||
@@ -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.
|
||||
@@ -77,6 +80,7 @@ gem 'omniauth-twitter'
|
||||
# See https://github.com/elastic/elasticsearch-ruby#compatibility
|
||||
gem "elasticsearch-api", "~> 2.0.0"
|
||||
gem "elasticsearch-model"
|
||||
gem "hashie", ">= 3.5.3"
|
||||
gem "elasticsearch-rails"
|
||||
|
||||
gem 'rake', '>= 10.0.0'
|
||||
@@ -116,8 +120,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
|
||||
|
||||
89
Gemfile.lock
89
Gemfile.lock
@@ -30,7 +30,7 @@ GEM
|
||||
activejob (4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
globalid (>= 0.3.0)
|
||||
activemerchant (1.61.0)
|
||||
activemerchant (1.63.0)
|
||||
activesupport (>= 3.2.14, < 5.1)
|
||||
builder (>= 2.1.2, < 4.0.0)
|
||||
i18n (>= 0.6.9)
|
||||
@@ -71,11 +71,11 @@ GEM
|
||||
bootstrap-sass (3.3.7)
|
||||
autoprefixer-rails (>= 5.2.1)
|
||||
sass (>= 3.3.4)
|
||||
bootstrap_form (2.5.3)
|
||||
bootstrap_form (2.6.0)
|
||||
builder (3.2.3)
|
||||
byebug (9.0.6)
|
||||
cancancan (1.15.0)
|
||||
capybara (2.10.1)
|
||||
cancancan (1.16.0)
|
||||
capybara (2.12.0)
|
||||
addressable
|
||||
mime-types (>= 1.16)
|
||||
nokogiri (>= 1.3.3)
|
||||
@@ -88,7 +88,7 @@ GEM
|
||||
capybara-screenshot (1.0.14)
|
||||
capybara (>= 1.0, < 3)
|
||||
launchy
|
||||
childprocess (0.5.9)
|
||||
childprocess (0.6.1)
|
||||
ffi (~> 1.0, >= 1.0.11)
|
||||
climate_control (0.1.0)
|
||||
cliver (0.3.2)
|
||||
@@ -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)
|
||||
@@ -146,17 +148,17 @@ GEM
|
||||
json
|
||||
thread
|
||||
thread_safe
|
||||
elasticsearch (2.0.0)
|
||||
elasticsearch-api (= 2.0.0)
|
||||
elasticsearch-transport (= 2.0.0)
|
||||
elasticsearch-api (2.0.0)
|
||||
elasticsearch (2.0.1)
|
||||
elasticsearch-api (= 2.0.1)
|
||||
elasticsearch-transport (= 2.0.1)
|
||||
elasticsearch-api (2.0.1)
|
||||
multi_json
|
||||
elasticsearch-model (0.1.9)
|
||||
activesupport (> 3)
|
||||
elasticsearch (> 0.4)
|
||||
hashie
|
||||
elasticsearch-rails (0.1.9)
|
||||
elasticsearch-transport (2.0.0)
|
||||
elasticsearch-transport (2.0.1)
|
||||
faraday
|
||||
multi_json
|
||||
erubis (2.7.0)
|
||||
@@ -173,12 +175,12 @@ GEM
|
||||
figaro (1.1.1)
|
||||
thor (~> 0.14)
|
||||
flickraw (0.9.9)
|
||||
font-awesome-sass (4.6.2)
|
||||
font-awesome-sass (4.7.0)
|
||||
sass (>= 3.2)
|
||||
formatador (0.2.5)
|
||||
friendly_id (5.0.5)
|
||||
activerecord (>= 4.0.0)
|
||||
geocoder (1.4.1)
|
||||
geocoder (1.4.3)
|
||||
gibbon (1.2.1)
|
||||
httparty
|
||||
multi_json (>= 1.9.0)
|
||||
@@ -187,7 +189,7 @@ GEM
|
||||
gravatar-ultimate (2.0.0)
|
||||
activesupport (>= 2.3.14)
|
||||
rack
|
||||
guard (2.14.0)
|
||||
guard (2.14.1)
|
||||
formatador (>= 0.2.4)
|
||||
listen (>= 2.7, < 4.0)
|
||||
lumberjack (~> 1.0)
|
||||
@@ -215,7 +217,12 @@ GEM
|
||||
haml (>= 4.0.6, < 5.0)
|
||||
html2haml (>= 1.0.1)
|
||||
railties (>= 4.0.1)
|
||||
hashie (3.4.6)
|
||||
haml_lint (0.20.0)
|
||||
haml (~> 4.0)
|
||||
rake (>= 10, < 13)
|
||||
rubocop (>= 0.47.0)
|
||||
sysexits (~> 1.1)
|
||||
hashie (3.5.3)
|
||||
heroku-api (0.4.2)
|
||||
excon (~> 0.45)
|
||||
multi_json (~> 1.8)
|
||||
@@ -227,8 +234,8 @@ GEM
|
||||
ruby_parser (~> 3.5)
|
||||
httparty (0.14.0)
|
||||
multi_xml (>= 0.5.2)
|
||||
i18n (0.7.0)
|
||||
i18n-tasks (0.9.9)
|
||||
i18n (0.8.0)
|
||||
i18n-tasks (0.9.12)
|
||||
activesupport (>= 4.0.2)
|
||||
ast (>= 2.1.0)
|
||||
easy_translate (>= 0.5.0)
|
||||
@@ -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)
|
||||
@@ -252,7 +265,7 @@ GEM
|
||||
kaminari (0.17.0)
|
||||
actionpack (>= 3.0.0)
|
||||
activesupport (>= 3.0.0)
|
||||
kgio (2.10.0)
|
||||
kgio (2.11.0)
|
||||
kramdown (1.13.2)
|
||||
launchy (2.4.3)
|
||||
addressable (~> 2.3)
|
||||
@@ -282,7 +295,7 @@ GEM
|
||||
multi_xml (0.6.0)
|
||||
multipart-post (2.0.0)
|
||||
nenv (0.3.0)
|
||||
newrelic_rpm (3.17.1.326)
|
||||
newrelic_rpm (3.18.1.330)
|
||||
nokogiri (1.6.8.1)
|
||||
mini_portile2 (~> 2.1.0)
|
||||
notiffany (0.1.1)
|
||||
@@ -319,12 +332,13 @@ GEM
|
||||
cocaine (~> 0.5.5)
|
||||
mime-types
|
||||
mimemagic (~> 0.3.0)
|
||||
parser (2.3.3.1)
|
||||
parser (2.4.0.0)
|
||||
ast (~> 2.2)
|
||||
pg (0.19.0)
|
||||
phantomjs (2.1.1.0)
|
||||
plupload-rails (1.2.1)
|
||||
rails (>= 3.1)
|
||||
poltergeist (1.11.0)
|
||||
poltergeist (1.13.0)
|
||||
capybara (~> 2.1)
|
||||
cliver (~> 0.3.1)
|
||||
websocket-driver (>= 0.2.0)
|
||||
@@ -377,9 +391,9 @@ GEM
|
||||
raindrops (0.17.0)
|
||||
rake (12.0.0)
|
||||
rb-fsevent (0.9.8)
|
||||
rb-inotify (0.9.7)
|
||||
rb-inotify (0.9.8)
|
||||
ffi (>= 0.5.0)
|
||||
redis (3.3.2)
|
||||
redis (3.3.3)
|
||||
responders (2.3.0)
|
||||
railties (>= 4.2.0, < 5.1)
|
||||
rspec (3.5.0)
|
||||
@@ -418,7 +432,7 @@ GEM
|
||||
ruby_dep (1.5.0)
|
||||
ruby_parser (3.8.4)
|
||||
sexp_processor (~> 4.1)
|
||||
rubyzip (1.2.0)
|
||||
rubyzip (1.2.1)
|
||||
sass (3.4.23)
|
||||
sass-rails (5.0.6)
|
||||
railties (>= 4.0.0, < 6)
|
||||
@@ -426,26 +440,22 @@ GEM
|
||||
sprockets (>= 2.8, < 4.0)
|
||||
sprockets-rails (>= 2.0, < 4.0)
|
||||
tilt (>= 1.1, < 3)
|
||||
selenium-webdriver (3.0.5)
|
||||
selenium-webdriver (3.0.8)
|
||||
childprocess (~> 0.5)
|
||||
rubyzip (~> 1.0)
|
||||
websocket (~> 1.0)
|
||||
sexp_processor (4.7.0)
|
||||
shellany (0.0.1)
|
||||
sidekiq (4.1.4)
|
||||
sidekiq (4.2.9)
|
||||
concurrent-ruby (~> 1.0)
|
||||
connection_pool (~> 2.2, >= 2.2.0)
|
||||
rack-protection (>= 1.5.0)
|
||||
redis (~> 3.2, >= 3.2.1)
|
||||
sinatra (>= 1.4.7)
|
||||
simplecov (0.12.0)
|
||||
docile (~> 1.1.0)
|
||||
json (>= 1.8, < 3)
|
||||
simplecov-html (~> 0.10.0)
|
||||
simplecov-html (0.10.0)
|
||||
sinatra (1.4.7)
|
||||
rack (~> 1.5)
|
||||
rack-protection (~> 1.4)
|
||||
tilt (>= 1.3, < 3)
|
||||
slop (3.6.0)
|
||||
sparkpost_rails (1.4.0)
|
||||
rails (>= 4.0, < 5.1)
|
||||
@@ -456,6 +466,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)
|
||||
@@ -463,8 +474,8 @@ GEM
|
||||
thor (0.19.4)
|
||||
thread (0.2.2)
|
||||
thread_safe (0.3.5)
|
||||
tilt (2.0.5)
|
||||
tins (1.13.0)
|
||||
tilt (2.0.6)
|
||||
tins (1.13.2)
|
||||
trollop (1.16.2)
|
||||
tzinfo (1.2.2)
|
||||
thread_safe (~> 0.1)
|
||||
@@ -472,17 +483,17 @@ GEM
|
||||
execjs (>= 0.3.0)
|
||||
json (>= 1.8.0)
|
||||
unicode-display_width (1.1.3)
|
||||
unicorn (5.1.0)
|
||||
unicorn (5.2.0)
|
||||
kgio (~> 2.6)
|
||||
raindrops (~> 0.7)
|
||||
warden (1.2.6)
|
||||
warden (1.2.7)
|
||||
rack (>= 1.0)
|
||||
webrat (0.7.3)
|
||||
nokogiri (>= 1.2.0)
|
||||
rack (>= 1.0)
|
||||
rack-test (>= 0.5.3)
|
||||
websocket (1.2.3)
|
||||
websocket-driver (0.6.4)
|
||||
websocket (1.2.4)
|
||||
websocket-driver (0.6.5)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.2)
|
||||
will_paginate (3.1.5)
|
||||
@@ -514,6 +525,7 @@ DEPENDENCIES
|
||||
comfortable_mexican_sofa (~> 1.12.0)
|
||||
coveralls
|
||||
csv_shaper
|
||||
d3-rails
|
||||
dalli
|
||||
database_cleaner (~> 1.5.0)
|
||||
devise (>= 4.0.0)
|
||||
@@ -533,14 +545,17 @@ DEPENDENCIES
|
||||
haml
|
||||
haml-i18n-extractor
|
||||
haml-rails
|
||||
haml_lint
|
||||
hashie (>= 3.5.3)
|
||||
heroku-api
|
||||
i18n-tasks
|
||||
jasmine
|
||||
jquery-rails
|
||||
jquery-ui-rails (~> 5.0.2)
|
||||
js-routes
|
||||
kaminari
|
||||
leaflet-markercluster-rails
|
||||
leaflet-rails
|
||||
leaflet-rails (~> 0.7.7)
|
||||
letter_opener
|
||||
memcachier
|
||||
newrelic_rpm
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
class AlternateNamesController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
# GET /alternate_names
|
||||
# GET /alternate_names.json
|
||||
def index
|
||||
@alternate_names = AlternateName.all
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.haml
|
||||
format.json { render json: @alternate_names }
|
||||
end
|
||||
respond_with(@alternate_names)
|
||||
end
|
||||
|
||||
# GET /alternate_names/new
|
||||
@@ -18,16 +15,10 @@ class AlternateNamesController < ApplicationController
|
||||
def new
|
||||
@alternate_name = AlternateName.new
|
||||
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.haml
|
||||
format.json { render json: @alternate_name }
|
||||
end
|
||||
end
|
||||
|
||||
# GET /alternate_names/1/edit
|
||||
def edit
|
||||
end
|
||||
def edit; end
|
||||
|
||||
# POST /alternate_names
|
||||
# POST /alternate_names.json
|
||||
@@ -35,28 +26,20 @@ class AlternateNamesController < ApplicationController
|
||||
params[:alternate_name][:creator_id] = current_member.id
|
||||
@alternate_name = AlternateName.new(alternate_name_params)
|
||||
|
||||
respond_to do |format|
|
||||
if @alternate_name.save
|
||||
format.html { redirect_to @alternate_name.crop, notice: 'Alternate name was successfully created.' }
|
||||
format.json { render json: @alternate_name, status: :created, location: @alternate_name }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @alternate_name.errors, status: :unprocessable_entity }
|
||||
end
|
||||
if @alternate_name.save
|
||||
redirect_to @alternate_name.crop, notice: 'Alternate name was successfully created.'
|
||||
else
|
||||
render action: "new"
|
||||
end
|
||||
end
|
||||
|
||||
# PUT /alternate_names/1
|
||||
# PUT /alternate_names/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @alternate_name.update(alternate_name_params)
|
||||
format.html { redirect_to @alternate_name.crop, notice: 'Alternate name was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @alternate_name.errors, status: :unprocessable_entity }
|
||||
end
|
||||
if @alternate_name.update(alternate_name_params)
|
||||
redirect_to @alternate_name.crop, notice: 'Alternate name was successfully updated.'
|
||||
else
|
||||
render action: "edit"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -65,13 +48,7 @@ class AlternateNamesController < ApplicationController
|
||||
def destroy
|
||||
@crop = @alternate_name.crop
|
||||
@alternate_name.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html {
|
||||
redirect_to @crop, notice: 'Alternate name was successfully deleted.'
|
||||
}
|
||||
format.json { head :no_content }
|
||||
end
|
||||
redirect_to @crop, notice: 'Alternate name was successfully deleted.'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -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
|
||||
@@ -60,8 +59,7 @@ class ApplicationController < ActionController::Base
|
||||
# profile stuff
|
||||
:bio, :location, :latitude, :longitude,
|
||||
# email settings
|
||||
:show_email, :newsletter, :send_notification_email, :send_planting_reminder
|
||||
)
|
||||
:show_email, :newsletter, :send_notification_email, :send_planting_reminder)
|
||||
end
|
||||
|
||||
devise_parameter_sanitizer.permit(:account_update) do |member|
|
||||
@@ -74,8 +72,11 @@ class ApplicationController < ActionController::Base
|
||||
# email settings
|
||||
:show_email, :newsletter, :send_notification_email, :send_planting_reminder,
|
||||
# update password
|
||||
:current_password
|
||||
)
|
||||
:current_password)
|
||||
end
|
||||
end
|
||||
|
||||
def expire_homepage
|
||||
expire_fragment("homepage_stats")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -18,7 +18,8 @@ class AuthenticationsController < ApplicationController
|
||||
.find_or_create_by(
|
||||
provider: auth['provider'],
|
||||
uid: auth['uid'],
|
||||
name: name)
|
||||
name: name
|
||||
)
|
||||
|
||||
flash[:notice] = "Authentication successful."
|
||||
else
|
||||
@@ -29,7 +30,6 @@ class AuthenticationsController < ApplicationController
|
||||
|
||||
# DELETE /authentications/1
|
||||
def destroy
|
||||
@authentication = Authentication.find(params[:id])
|
||||
@authentication.destroy
|
||||
|
||||
respond_to do |format|
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
class CommentsController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
respond_to :rss, only: :index
|
||||
|
||||
# GET /comments
|
||||
# GET /comments.json
|
||||
# GET /comments.rss
|
||||
def index
|
||||
@comments = Comment.paginate(page: params[:page])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
format.json { render json: @comments }
|
||||
format.rss { render layout: false }
|
||||
end
|
||||
respond_with(@comments)
|
||||
end
|
||||
|
||||
# GET /comments/new
|
||||
@@ -22,13 +20,10 @@ class CommentsController < ApplicationController
|
||||
|
||||
if @post
|
||||
@comments = @post.comments
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @comment }
|
||||
end
|
||||
respond_with(@comment)
|
||||
else
|
||||
redirect_to request.referer || root_url,
|
||||
alert: "Can't post a comment on a non-existent post"
|
||||
redirect_to(request.referer || root_url,
|
||||
alert: "Can't post a comment on a non-existent post")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -40,37 +35,20 @@ class CommentsController < ApplicationController
|
||||
# POST /comments
|
||||
# POST /comments.json
|
||||
def create
|
||||
params[:comment][:author_id] = current_member.id
|
||||
@comment = Comment.new(comment_params)
|
||||
|
||||
respond_to do |format|
|
||||
if @comment.save
|
||||
format.html { redirect_to @comment.post, notice: "Comment was successfully created." }
|
||||
format.json { render json: @comment, status: :created, location: @comment }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @comment.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
@comment.author = current_member
|
||||
flash[:notice] = "Comment was successfully created." if @comment.save
|
||||
respond_with(@comment.post)
|
||||
end
|
||||
|
||||
# PUT /comments/1
|
||||
# PUT /comments/1.json
|
||||
def update
|
||||
# you should never be able to change the author or post when
|
||||
# updating
|
||||
params[:comment].delete("post_id")
|
||||
params[:comment].delete("author_id")
|
||||
|
||||
respond_to do |format|
|
||||
if @comment.update(comment_params)
|
||||
format.html { redirect_to @comment.post, notice: 'Comment was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @comment.errors, status: :unprocessable_entity }
|
||||
end
|
||||
# only body can be updated
|
||||
if @comment.update(body: comment_params['body'])
|
||||
flash[:notice] = 'Comment was successfully updated.'
|
||||
end
|
||||
respond_with(@comment.post)
|
||||
end
|
||||
|
||||
# DELETE /comments/1
|
||||
@@ -78,16 +56,12 @@ class CommentsController < ApplicationController
|
||||
def destroy
|
||||
@post = @comment.post
|
||||
@comment.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to @post }
|
||||
format.json { head :no_content }
|
||||
end
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def comment_params
|
||||
params.require(:comment).permit(:author_id, :body, :post_id)
|
||||
params.require(:comment).permit(:body, :post_id)
|
||||
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 }
|
||||
|
||||
@@ -1,86 +1,51 @@
|
||||
class ForumsController < ApplicationController
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
# GET /forums
|
||||
# GET /forums.json
|
||||
def index
|
||||
@forums = Forum.all
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
format.json { render json: @forums }
|
||||
end
|
||||
respond_with(@forums)
|
||||
end
|
||||
|
||||
# GET /forums/1
|
||||
# GET /forums/1.json
|
||||
def show
|
||||
@forum = Forum.find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @forum }
|
||||
end
|
||||
respond_with(@forum)
|
||||
end
|
||||
|
||||
# GET /forums/new
|
||||
# GET /forums/new.json
|
||||
def new
|
||||
@forum = Forum.new
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @forum }
|
||||
end
|
||||
respond_with(@forum)
|
||||
end
|
||||
|
||||
# GET /forums/1/edit
|
||||
def edit
|
||||
@forum = Forum.find(params[:id])
|
||||
end
|
||||
def edit; end
|
||||
|
||||
# POST /forums
|
||||
# POST /forums.json
|
||||
def create
|
||||
@forum = Forum.new(forum_params)
|
||||
|
||||
respond_to do |format|
|
||||
if @forum.save
|
||||
format.html { redirect_to @forum, notice: 'Forum was successfully created.' }
|
||||
format.json { render json: @forum, status: :created, location: @forum }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @forum.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Forum was successfully created.' if @forum.save
|
||||
respond_with(@forum)
|
||||
end
|
||||
|
||||
# PUT /forums/1
|
||||
# PUT /forums/1.json
|
||||
def update
|
||||
@forum = Forum.find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
if @forum.update(forum_params)
|
||||
format.html { redirect_to @forum, notice: 'Forum was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @forum.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Forum was successfully updated.' if @forum.update(forum_params)
|
||||
respond_with(@forum)
|
||||
end
|
||||
|
||||
# DELETE /forums/1
|
||||
# DELETE /forums/1.json
|
||||
def destroy
|
||||
@forum = Forum.find(params[:id])
|
||||
@forum.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to forums_url, notice: 'Forum was successfully deleted' }
|
||||
format.json { head :no_content }
|
||||
end
|
||||
flash[:notice] = 'Forum was successfully deleted'
|
||||
redirect_to forums_url
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -1,96 +1,69 @@
|
||||
class GardensController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
after_action :expire_homepage, only: [:create, :delete]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
# GET /gardens
|
||||
# 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
|
||||
format.json { render json: @gardens }
|
||||
end
|
||||
respond_with(@gardens)
|
||||
end
|
||||
|
||||
# GET /gardens/1
|
||||
# GET /gardens/1.json
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @garden }
|
||||
end
|
||||
respond_with(@garden)
|
||||
end
|
||||
|
||||
# GET /gardens/new
|
||||
# GET /gardens/new.json
|
||||
def new
|
||||
@garden = Garden.new
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @garden }
|
||||
end
|
||||
respond_with(@garden)
|
||||
end
|
||||
|
||||
# GET /gardens/1/edit
|
||||
def edit
|
||||
end
|
||||
def edit; end
|
||||
|
||||
# POST /gardens
|
||||
# POST /gardens.json
|
||||
def create
|
||||
@garden.owner_id = current_member.id
|
||||
|
||||
respond_to do |format|
|
||||
if @garden.save
|
||||
format.html { redirect_to @garden, notice: I18n.t('gardens.created') }
|
||||
format.json { render json: @garden, status: :created, location: @garden }
|
||||
expire_fragment("homepage_stats")
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @garden.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = I18n.t('gardens.created') if @garden.save
|
||||
respond_with(@garden)
|
||||
end
|
||||
|
||||
# PUT /gardens/1
|
||||
# PUT /gardens/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @garden.update(garden_params)
|
||||
format.html { redirect_to @garden, notice: I18n.t('gardens.updated') }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @garden.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = I18n.t('gardens.updated') if @garden.update(garden_params)
|
||||
respond_with(@garden)
|
||||
end
|
||||
|
||||
# DELETE /gardens/1
|
||||
# DELETE /gardens/1.json
|
||||
def destroy
|
||||
@garden.destroy
|
||||
expire_fragment("homepage_stats")
|
||||
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
redirect_to gardens_by_owner_path(owner: @garden.owner), notice: I18n.t('gardens.deleted')
|
||||
end
|
||||
format.json { head :no_content }
|
||||
end
|
||||
flash[:notice] = I18n.t('gardens.deleted')
|
||||
redirect_to(gardens_by_owner_path(owner: @garden.owner))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def garden_params
|
||||
params.require(:garden).permit(:name, :slug, :owner_id, :description, :active,
|
||||
params.require(:garden).permit(:name, :slug, :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.paginate(page: params[:page])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,48 +1,34 @@
|
||||
class HarvestsController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
respond_to :csv, only: :index
|
||||
|
||||
# GET /harvests
|
||||
# GET /harvests.json
|
||||
def index
|
||||
@owner = Member.find_by(slug: params[:owner])
|
||||
@crop = Crop.find_by(slug: params[:crop])
|
||||
@harvests = if @owner
|
||||
@owner.harvests.includes(:owner, :crop)
|
||||
elsif @crop
|
||||
@crop.harvests.includes(:owner, :crop)
|
||||
else
|
||||
Harvest.includes(:owner, :crop)
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.html { @harvests = @harvests.paginate(page: params[:page]) }
|
||||
format.json { render json: @harvests }
|
||||
format.csv do
|
||||
specifics = (@owner ? "#{@owner.login_name}-" : @crop ? "#{@crop.name}-" : nil)
|
||||
@filename = "Growstuff-#{specifics}Harvests-#{Time.zone.now.to_s(:number)}.csv"
|
||||
render csv: @harvests
|
||||
end
|
||||
end
|
||||
@harvests = harvests
|
||||
@filename = csv_filename
|
||||
respond_with(@harvests)
|
||||
end
|
||||
|
||||
# GET /harvests/1
|
||||
# GET /harvests/1.json
|
||||
def show
|
||||
@planting = @harvest.planting if @harvest.planting_id
|
||||
@matching_plantings = matching_plantings if @harvest.owner == current_member
|
||||
respond_with(@harvest)
|
||||
end
|
||||
|
||||
# GET /harvests/new
|
||||
# GET /harvests/new.json
|
||||
def new
|
||||
@harvest = Harvest.new('harvested_at' => Date.today)
|
||||
@harvest = Harvest.new(harvested_at: Time.zone.today)
|
||||
@planting = Planting.find_by(slug: params[:planting_id]) if params[:planting_id]
|
||||
|
||||
# using find_by_id here because it returns nil, unlike find
|
||||
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @harvest }
|
||||
end
|
||||
@crop = Crop.find_by(id: params[:crop_id])
|
||||
respond_with(@harvest)
|
||||
end
|
||||
|
||||
# GET /harvests/1/edit
|
||||
@@ -54,41 +40,22 @@ class HarvestsController < ApplicationController
|
||||
# POST /harvests.json
|
||||
def create
|
||||
@harvest.crop_id = @harvest.planting.crop_id if @harvest.planting_id
|
||||
|
||||
respond_to do |format|
|
||||
if @harvest.save
|
||||
format.html { redirect_to @harvest, notice: I18n.t('harvests.created') }
|
||||
format.json { render json: @harvest, status: :created, location: @harvest }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @harvest.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = I18n.t('harvests.created') if @harvest.save
|
||||
respond_with(@harvest)
|
||||
end
|
||||
|
||||
# PUT /harvests/1
|
||||
# PUT /harvests/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @harvest.update(harvest_params)
|
||||
format.html { redirect_to @harvest, notice: I18n.t('harvests.updated') }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @harvest.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = I18n.t('harvests.updated') if @harvest.update(harvest_params)
|
||||
respond_with(@harvest)
|
||||
end
|
||||
|
||||
# DELETE /harvests/1
|
||||
# DELETE /harvests/1.json
|
||||
def destroy
|
||||
@harvest.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to harvests_url }
|
||||
format.json { head :no_content }
|
||||
end
|
||||
respond_with(@harvest)
|
||||
end
|
||||
|
||||
private
|
||||
@@ -100,4 +67,29 @@ class HarvestsController < ApplicationController
|
||||
:plant_part_id, :slug, :si_weight)
|
||||
.merge(owner_id: current_member.id)
|
||||
end
|
||||
|
||||
def matching_plantings
|
||||
Planting.where(crop: @harvest.crop, owner: @harvest.owner)
|
||||
.where('(planted_at IS NULL OR planted_at <= ?)', @harvest.harvested_at)
|
||||
.where('(finished_at IS NULL OR finished_at >= ?)', @harvest.harvested_at)
|
||||
end
|
||||
|
||||
def harvests
|
||||
if @owner
|
||||
@owner.harvests
|
||||
elsif @crop
|
||||
@crop.harvests
|
||||
else
|
||||
Harvest
|
||||
end.includes(:owner, :crop).paginate(page: params[:page])
|
||||
end
|
||||
|
||||
def csv_filename
|
||||
specifics = if @owner
|
||||
"#{@owner.login_name}-"
|
||||
elsif @crop
|
||||
"#{@crop.name}-"
|
||||
end
|
||||
"Growstuff-#{specifics}Harvests-#{Time.zone.now.to_s(:number)}.csv"
|
||||
end
|
||||
end
|
||||
|
||||
57
app/controllers/likes_controller.rb
Normal file
57
app/controllers/likes_controller.rb
Normal file
@@ -0,0 +1,57 @@
|
||||
class LikesController < ApplicationController
|
||||
before_action :authenticate_member!
|
||||
respond_to :html, :json
|
||||
|
||||
def create
|
||||
@like = Like.new(member: current_member, likeable: find_likeable)
|
||||
return failed(@like, message: 'Unable to like') unless @like.likeable && @like.save
|
||||
|
||||
success(@like, liked_by_member: true, status_code: :created)
|
||||
end
|
||||
|
||||
def destroy
|
||||
@like = Like.find_by(id: params[:id], member: current_member)
|
||||
return failed(@like, message: 'Unable to unlike') unless @like && @like.destroy
|
||||
|
||||
success(@like, liked_by_member: false, status_code: :ok)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_likeable
|
||||
Post.find(params[:post_id]) if params[:post_id]
|
||||
end
|
||||
|
||||
def render_json(like, liked_by_member: true)
|
||||
{
|
||||
id: like.likeable.id,
|
||||
liked_by_member: liked_by_member,
|
||||
description: ActionController::Base.helpers.pluralize(like.likeable.likes.count, "like"),
|
||||
url: like_path(like, format: :json)
|
||||
}
|
||||
end
|
||||
|
||||
def success(like, liked_by_member: nil, status_code: nil)
|
||||
respond_to do |format|
|
||||
format.html { redirect_to like.likeable }
|
||||
format.json do
|
||||
render(json: render_json(like, liked_by_member: liked_by_member),
|
||||
status: status_code)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def failed(like, message)
|
||||
respond_to do |format|
|
||||
format.json { render(json: { 'error': message }, status: :forbidden) }
|
||||
format.html do
|
||||
flash[:error] = message
|
||||
if like && like.likeable
|
||||
redirect_to like.likeable
|
||||
else
|
||||
redirect_to root_path
|
||||
end
|
||||
end
|
||||
end
|
||||
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.
|
||||
@@ -44,10 +45,11 @@ class MembersController < ApplicationController
|
||||
:latitude, :longitude
|
||||
])
|
||||
}
|
||||
format.rss { render(
|
||||
layout: false,
|
||||
locals: { member: @member }
|
||||
)}
|
||||
format.rss {
|
||||
render(
|
||||
layout: false,
|
||||
locals: { member: @member }
|
||||
)}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -2,14 +2,11 @@ class NotificationsController < ApplicationController
|
||||
include NotificationsHelper
|
||||
before_action :authenticate_member!
|
||||
load_and_authorize_resource
|
||||
respond_to :html
|
||||
|
||||
# GET /notifications
|
||||
def index
|
||||
@notifications = Notification.by_recipient(current_member).page(params[:page])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
end
|
||||
end
|
||||
|
||||
# GET /notifications/1
|
||||
@@ -17,10 +14,6 @@ class NotificationsController < ApplicationController
|
||||
@notification.read = true
|
||||
@notification.save
|
||||
@reply_link = reply_link(@notification)
|
||||
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
end
|
||||
end
|
||||
|
||||
# GET /notifications/new
|
||||
@@ -29,35 +22,24 @@ class NotificationsController < ApplicationController
|
||||
@notification = Notification.new
|
||||
@recipient = Member.find_by(id: params[:recipient_id])
|
||||
@subject = params[:subject] || ""
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
end
|
||||
end
|
||||
|
||||
# GET /notifications/1/reply
|
||||
def reply
|
||||
@notification = Notification.new
|
||||
@sender_notification = Notification.find(params[:id])
|
||||
@sender_notification = Notification.find_by(id: params[:id], recipient: current_member)
|
||||
@sender_notification.read = true
|
||||
@sender_notification.save
|
||||
@recipient = @sender_notification.sender
|
||||
@subject = @sender_notification.subject =~ /^Re: / ?
|
||||
@sender_notification.subject :
|
||||
"Re: " + @sender_notification.subject
|
||||
|
||||
respond_to do |format|
|
||||
format.html # reply.html.haml
|
||||
end
|
||||
end
|
||||
|
||||
# DELETE /notifications/1
|
||||
def destroy
|
||||
@notification.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to notifications_url }
|
||||
end
|
||||
redirect_to notifications_url
|
||||
end
|
||||
|
||||
# POST /notifications
|
||||
@@ -66,12 +48,10 @@ class NotificationsController < ApplicationController
|
||||
@notification = Notification.new(notification_params)
|
||||
@recipient = Member.find_by(id: params[:notification][:recipient_id])
|
||||
|
||||
respond_to do |format|
|
||||
if @notification.save
|
||||
format.html { redirect_to notifications_path, notice: 'Message was successfully sent.' }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
end
|
||||
if @notification.save
|
||||
redirect_to notifications_path, notice: 'Message was successfully sent.'
|
||||
else
|
||||
render action: "new"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ class OrdersController < ApplicationController
|
||||
end
|
||||
|
||||
def complete
|
||||
if (params[:token] && params['PayerID'])
|
||||
if params[:token] && params['PayerID']
|
||||
purchase = EXPRESS_GATEWAY.purchase(
|
||||
@order.total,
|
||||
currency: Growstuff::Application.config.currency,
|
||||
|
||||
@@ -1,35 +1,25 @@
|
||||
class PlantPartsController < ApplicationController
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
# GET /plant_parts
|
||||
# GET /plant_parts.json
|
||||
def index
|
||||
@plant_parts = PlantPart.all
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
format.json { render json: @plant_parts }
|
||||
end
|
||||
respond_with(@plant_parts)
|
||||
end
|
||||
|
||||
# GET /plant_parts/1
|
||||
# GET /plant_parts/1.json
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @plant_part }
|
||||
end
|
||||
respond_with(@plant_part)
|
||||
end
|
||||
|
||||
# GET /plant_parts/new
|
||||
# GET /plant_parts/new.json
|
||||
def new
|
||||
@plant_part = PlantPart.new
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @plant_part }
|
||||
end
|
||||
respond_with(@plant_part)
|
||||
end
|
||||
|
||||
# GET /plant_parts/1/edit
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,38 +1,24 @@
|
||||
class PostsController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
respond_to :rss, only: [:index, :show]
|
||||
|
||||
# GET /posts
|
||||
# GET /posts.json
|
||||
|
||||
# GET /posts.rss
|
||||
def index
|
||||
@author = Member.find_by(slug: params[:author])
|
||||
@posts = if @author
|
||||
@author.posts.includes(:author, comments: :author).paginate(page: params[:page])
|
||||
else
|
||||
Post.includes(:author, comments: :author).paginate(page: params[:page])
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.haml
|
||||
format.json { render json: @posts }
|
||||
format.rss { render layout: false } # index.rss.builder
|
||||
end
|
||||
@posts = posts
|
||||
respond_with(@posts)
|
||||
end
|
||||
|
||||
# GET /posts/1
|
||||
# GET /posts/1.json
|
||||
# GET /posts/1.rss
|
||||
def show
|
||||
@post = Post.includes(:author, comments: :author).find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # show.html.haml
|
||||
format.json { render json: @post }
|
||||
format.rss { render(
|
||||
layout: false,
|
||||
locals: { post: @post }
|
||||
)}
|
||||
end
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
# GET /posts/new
|
||||
@@ -40,11 +26,7 @@ class PostsController < ApplicationController
|
||||
def new
|
||||
@post = Post.new
|
||||
@forum = Forum.find_by(id: params[:forum_id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.haml
|
||||
format.json { render json: @post }
|
||||
end
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
# GET /posts/1/edit
|
||||
@@ -56,41 +38,22 @@ class PostsController < ApplicationController
|
||||
def create
|
||||
params[:post][:author_id] = current_member.id
|
||||
@post = Post.new(post_params)
|
||||
|
||||
respond_to do |format|
|
||||
if @post.save
|
||||
format.html { redirect_to @post, notice: 'Post was successfully created.' }
|
||||
format.json { render json: @post, status: :created, location: @post }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @post.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Post was successfully created.' if @post.save
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
# PUT /posts/1
|
||||
# PUT /posts/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @post.update(post_params)
|
||||
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @post.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Post was successfully updated.' if @post.update(post_params)
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
# DELETE /posts/1
|
||||
# DELETE /posts/1.json
|
||||
def destroy
|
||||
@post.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to posts_url, notice: 'Post was deleted.' }
|
||||
format.json { head :no_content }
|
||||
end
|
||||
flash[:notice] = 'Post was deleted.' if @post.destroy
|
||||
respond_with(@post)
|
||||
end
|
||||
|
||||
private
|
||||
@@ -98,4 +61,12 @@ class PostsController < ApplicationController
|
||||
def post_params
|
||||
params.require(:post).permit(:body, :subject, :author_id, :forum_id)
|
||||
end
|
||||
|
||||
def posts
|
||||
if @author
|
||||
@author.posts
|
||||
else
|
||||
Post
|
||||
end.includes(:author, comments: :author).paginate(page: params[:page])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,25 +1,19 @@
|
||||
class ScientificNamesController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
# GET /scientific_names
|
||||
# GET /scientific_names.json
|
||||
def index
|
||||
@scientific_names = ScientificName.all
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.haml
|
||||
format.json { render json: @scientific_names }
|
||||
end
|
||||
respond_with(@scientific_names)
|
||||
end
|
||||
|
||||
# GET /scientific_names/1
|
||||
# GET /scientific_names/1.json
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.html # show.html.haml
|
||||
format.json { render json: @scientific_name }
|
||||
end
|
||||
respond_with(@scientific_name)
|
||||
end
|
||||
|
||||
# GET /scientific_names/new
|
||||
@@ -27,11 +21,7 @@ class ScientificNamesController < ApplicationController
|
||||
def new
|
||||
@scientific_name = ScientificName.new
|
||||
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.haml
|
||||
format.json { render json: @scientific_name }
|
||||
end
|
||||
respond_with(@scientific_name)
|
||||
end
|
||||
|
||||
# GET /scientific_names/1/edit
|
||||
@@ -41,32 +31,18 @@ class ScientificNamesController < ApplicationController
|
||||
# POST /scientific_names
|
||||
# POST /scientific_names.json
|
||||
def create
|
||||
params[:scientific_name][:creator_id] = current_member.id
|
||||
@scientific_name = ScientificName.new(scientific_name_params)
|
||||
@scientific_name.creator = current_member
|
||||
|
||||
respond_to do |format|
|
||||
if @scientific_name.save
|
||||
format.html { redirect_to @scientific_name.crop, notice: 'Scientific name was successfully created.' }
|
||||
format.json { render json: @scientific_name, status: :created, location: @scientific_name }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @scientific_name.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Scientific name was successfully created.' if @scientific_name.save
|
||||
respond_with(@scientific_name.crop)
|
||||
end
|
||||
|
||||
# PUT /scientific_names/1
|
||||
# PUT /scientific_names/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @scientific_name.update(scientific_name_params)
|
||||
format.html { redirect_to @scientific_name.crop, notice: 'Scientific name was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @scientific_name.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Scientific name was successfully updated.' if @scientific_name.update(scientific_name_params)
|
||||
respond_with(@scientific_name.crop)
|
||||
end
|
||||
|
||||
# DELETE /scientific_names/1
|
||||
@@ -74,18 +50,13 @@ class ScientificNamesController < ApplicationController
|
||||
def destroy
|
||||
@crop = @scientific_name.crop
|
||||
@scientific_name.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html {
|
||||
redirect_to @crop, notice: 'Scientific name was successfully deleted.'
|
||||
}
|
||||
format.json { head :no_content }
|
||||
end
|
||||
flash[:notice] = 'Scientific name was successfully deleted.'
|
||||
respond_with(@crop)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def scientific_name_params
|
||||
params.require(:scientific_name).permit(:crop_id, :name, :creator_id)
|
||||
params.require(:scientific_name).permit(:crop_id, :name)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,44 +1,25 @@
|
||||
class SeedsController < ApplicationController
|
||||
before_action :authenticate_member!, except: [:index, :show]
|
||||
load_and_authorize_resource
|
||||
respond_to :html, :json
|
||||
respond_to :csv, only: :index
|
||||
respond_to :rss, only: :index
|
||||
|
||||
# GET /seeds
|
||||
# GET /seeds.json
|
||||
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)
|
||||
@filename = csv_filename
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
format.json { render json: @seeds }
|
||||
format.rss { render layout: false } # index.rss.builder
|
||||
format.csv do
|
||||
if @owner
|
||||
@filename = "Growstuff-#{@owner}-Seeds-#{Time.zone.now.to_s(:number)}.csv"
|
||||
@seeds = @owner.seeds.includes(:owner, :crop)
|
||||
else
|
||||
@filename = "Growstuff-Seeds-#{Time.zone.now.to_s(:number)}.csv"
|
||||
@seeds = Seed.includes(:owner, :crop)
|
||||
end
|
||||
render csv: @seeds
|
||||
end
|
||||
end
|
||||
respond_with(@seeds)
|
||||
end
|
||||
|
||||
# GET /seeds/1
|
||||
# GET /seeds/1.json
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.html # show.html.erb
|
||||
format.json { render json: @seed }
|
||||
end
|
||||
respond_with(@seed)
|
||||
end
|
||||
|
||||
# GET /seeds/new
|
||||
@@ -48,11 +29,7 @@ class SeedsController < ApplicationController
|
||||
|
||||
# using find_by_id here because it returns nil, unlike find
|
||||
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html # new.html.erb
|
||||
format.json { render json: @seed }
|
||||
end
|
||||
respond_with(@seed)
|
||||
end
|
||||
|
||||
# GET /seeds/1/edit
|
||||
@@ -62,51 +39,51 @@ class SeedsController < ApplicationController
|
||||
# POST /seeds
|
||||
# POST /seeds.json
|
||||
def create
|
||||
params[:seed][:owner_id] = current_member.id
|
||||
@seed = Seed.new(seed_params)
|
||||
|
||||
respond_to do |format|
|
||||
if @seed.save
|
||||
format.html { redirect_to @seed, notice: "Successfully added #{@seed.crop} seed to your stash." }
|
||||
format.json { render json: @seed, status: :created, location: @seed }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.json { render json: @seed.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
@seed.owner = current_member
|
||||
flash[:notice] = "Successfully added #{@seed.crop} seed to your stash." if @seed.save
|
||||
respond_with(@seed)
|
||||
end
|
||||
|
||||
# PUT /seeds/1
|
||||
# PUT /seeds/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @seed.update(seed_params)
|
||||
format.html { redirect_to @seed, notice: 'Seed was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.json { render json: @seed.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
flash[:notice] = 'Seed was successfully updated.' if @seed.update(seed_params)
|
||||
respond_with(@seed)
|
||||
end
|
||||
|
||||
# DELETE /seeds/1
|
||||
# DELETE /seeds/1.json
|
||||
def destroy
|
||||
@seed.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to seeds_url }
|
||||
format.json { head :no_content }
|
||||
end
|
||||
respond_with(@seed)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def seed_params
|
||||
params.require(:seed).permit(
|
||||
:owner_id, :crop_id, :description, :quantity, :plant_before,
|
||||
:crop_id, :description, :quantity, :plant_before,
|
||||
:days_until_maturity_min, :days_until_maturity_max, :organic, :gmo,
|
||||
:heirloom, :tradable_to, :slug)
|
||||
: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
|
||||
|
||||
def csv_filename
|
||||
if @owner
|
||||
"Growstuff-#{@owner}-Seeds-#{Time.zone.now.to_s(:number)}.csv"
|
||||
else
|
||||
"Growstuff-Seeds-#{Time.zone.now.to_s(:number)}.csv"
|
||||
end
|
||||
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
|
||||
|
||||
@@ -12,10 +12,14 @@ module CropsHelper
|
||||
return "You don't have any seeds of this crop."
|
||||
end
|
||||
|
||||
if (total_quantity != 0)
|
||||
if total_quantity != 0
|
||||
"You have #{total_quantity} #{Seed.model_name.human(count: total_quantity)} of this crop."
|
||||
else
|
||||
"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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
class Ability
|
||||
include CanCan::Ability
|
||||
|
||||
def initialize(member) # rubocop:disable Metrics/AbcSize
|
||||
def initialize(member) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
||||
# See the wiki for details: https://github.com/ryanb/cancan/wiki/Defining-Abilities
|
||||
|
||||
# everyone can do these things, even non-logged in
|
||||
@@ -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
|
||||
@@ -71,11 +72,13 @@ class Ability
|
||||
can :create, Authentication
|
||||
can :destroy, Authentication, member_id: member.id
|
||||
|
||||
# anyone can create a post, or comment on a post,
|
||||
# anyone can create a post, like, or comment on a post,
|
||||
# but only the author can edit/destroy it.
|
||||
can :create, Post
|
||||
can :update, Post, author_id: member.id
|
||||
can :destroy, Post, author_id: member.id
|
||||
can :create, Like
|
||||
can :destroy, Like, member_id: member.id
|
||||
can :create, Comment
|
||||
can :update, Comment, author_id: member.id
|
||||
can :destroy, Comment, author_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
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
class Forum < ActiveRecord::Base
|
||||
extend FriendlyId
|
||||
validates :name, presence: true
|
||||
friendly_id :name, use: [:slugged, :finders]
|
||||
|
||||
has_many :posts
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -28,7 +28,8 @@ class Planting < ActiveRecord::Base
|
||||
validates :quantity,
|
||||
numericality: {
|
||||
only_integer: true,
|
||||
greater_than_or_equal_to: 0 },
|
||||
greater_than_or_equal_to: 0
|
||||
},
|
||||
allow_nil: true
|
||||
|
||||
SUNNINESS_VALUES = %w(sun semi-shade shade)
|
||||
@@ -64,15 +65,11 @@ class Planting < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def planting_slug
|
||||
if garden.present? && crop.present?
|
||||
"#{owner.login_name}-#{garden.name}-#{crop.name}"
|
||||
elsif garden.present?
|
||||
"#{owner.login_name}-#{garden.name}-null"
|
||||
elsif crop.present?
|
||||
"#{owner.login_name}-null-#{crop.name}"
|
||||
else
|
||||
"#{owner.login_name}-null-null"
|
||||
end.downcase.gsub(' ', '-')
|
||||
[
|
||||
owner.login_name,
|
||||
garden.present? ? garden.name : 'null',
|
||||
crop.present? ? crop.name : 'null'
|
||||
].join('-').tr(' ', '-').downcase
|
||||
end
|
||||
|
||||
# location = garden owner + garden name, i.e. "Skud's backyard"
|
||||
@@ -112,6 +109,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,9 +1,10 @@
|
||||
-content_for :title, 'Admin'
|
||||
- content_for :title, 'Admin'
|
||||
|
||||
%h2 Manage
|
||||
|
||||
%ul#admin_links
|
||||
%li= link_to "Account types", account_types_path
|
||||
%li= link_to "Alternate names", alternate_names_path
|
||||
%li= link_to "Products", products_path
|
||||
%li= link_to "Roles", roles_path
|
||||
%li= link_to "Forums", forums_path
|
||||
@@ -12,4 +13,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,17 +1,19 @@
|
||||
- content_for :title, "Resend confirmation instructions"
|
||||
|
||||
= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post, :class => 'form-horizontal', :role => 'form' }) do |f|
|
||||
= form_for(resource, as: resource_name,
|
||||
url: confirmation_path(resource_name),
|
||||
html: { method: :post, class: 'form-horizontal', role: 'form' }) do |f|
|
||||
= devise_error_messages!
|
||||
|
||||
%p Enter either your login name or your email address to resend the confirmation email.
|
||||
|
||||
.form-group
|
||||
= f.label :login, :class => 'control-label col-md-2'
|
||||
= f.label :login, class: 'control-label col-md-2'
|
||||
.col-md-8
|
||||
= f.text_field :login, :class => 'form-control'
|
||||
= f.text_field :login, class: 'form-control'
|
||||
.form-group
|
||||
.form-actions.col-md-offset-2.col-md-8
|
||||
= f.submit "Resend confirmation instructions", :class => 'btn btn-primary'
|
||||
= f.submit "Resend confirmation instructions", class: 'btn btn-primary'
|
||||
|
||||
.form-group
|
||||
.col-md-offset-2.col-md-8
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user