Compare commits

...

193 Commits

Author SHA1 Message Date
Shiny
7ca314c2f2 Merge pull request #1191 from Growstuff/dev
Release 19
2017-02-10 09:24:00 +13:00
Mackenzie
36768cf384 Merge pull request #1194 from Br3nda/bw/grand-haml-cleanup-of-2017
More haml clean up
2017-02-08 22:46:34 -05:00
Mackenzie
e35d0455bd Merge pull request #1196 from Br3nda/spammer-begone
stripping html from markdown
2017-02-08 22:43:51 -05:00
Brenda Wallace
c8405830c7 Added strip_tags before processing markdown 2017-02-09 03:29:18 +00:00
Shiny
6bc9f775c2 Merge branch 'dev' into bw/grand-haml-cleanup-of-2017 2017-02-09 10:23:01 +13:00
Mackenzie
a43526776b Merge pull request #1195 from Br3nda/bw/spammer-injection-begone
Truncate, escape, and DRY og:description fields
2017-02-07 16:00:32 -05:00
Brenda Wallace
6f74566d47 Truncate, escape, and DRY og:description fields 2017-02-08 09:49:19 +13:00
Brenda Wallace
82ce6c8222 Haml clean up for seeds views 2017-02-08 08:52:46 +13:00
Brenda Wallace
f96f459595 Moved title logic into application helper
For harvests, plantings, and seeds
2017-02-08 07:25:59 +13:00
Brenda Wallace
096146cb84 Fix: @owner -> owner in harvests_title 2017-02-08 07:25:59 +13:00
Brenda Wallace
ba1c40702b DRY up gardens and plantings helper 2017-02-08 07:25:59 +13:00
Brenda Wallace
e6254da3f1 Haml clean up for Roles views 2017-02-08 07:25:59 +13:00
Brenda Wallace
acbb610e05 Haml clean up for posts views 2017-02-08 07:25:59 +13:00
Brenda Wallace
338265d9e9 Haml cleanup for plantings views 2017-02-08 07:25:59 +13:00
Brenda Wallace
706922cacf Haml clean up for plantparts views 2017-02-08 07:25:59 +13:00
Brenda Wallace
08f2877f8e Haml clean up for places views 2017-02-08 07:25:59 +13:00
Brenda Wallace
8275f5be96 Add photos to travis haml check 2017-02-08 07:25:59 +13:00
Brenda Wallace
2c3d1848d5 Haml clean up for photos 2017-02-08 07:25:59 +13:00
Brenda Wallace
17e88778c8 Haml clean up for orders 2017-02-08 07:25:59 +13:00
Brenda Wallace
bafb0123da Haml cleanup for notifier 2017-02-08 07:25:59 +13:00
Brenda Wallace
e1e9c32652 Moved havests#index title to a helper 2017-02-08 07:25:59 +13:00
Brenda Wallace
48c3cbb3d1 Change to hash attributes syntax in harvests#show 2017-02-08 07:25:59 +13:00
Brenda Wallace
740b8587f2 Moved complex parts of garden/nav into helper 2017-02-08 07:25:59 +13:00
Brenda Wallace
b113146aaa Add harvest and gardens to travis for haml-lint 2017-02-08 07:25:59 +13:00
Brenda Wallace
900de8a615 Fixed Read more link in harvests 2017-02-08 07:25:59 +13:00
Brenda Wallace
d73aa98309 Cleaned up most of Home's haml 2017-02-08 07:25:59 +13:00
Brenda Wallace
ac7d44cb72 Cleaned up most of harvest's haml 2017-02-08 07:25:59 +13:00
Daniel O'Connor
bba057ec76 Merge pull request #1192 from Br3nda/bw/three-pending-specs
Filled in the 3 pending planting specs
2017-02-07 16:36:59 +10:30
Brenda Wallace
1dc44c9edc Filled in the 3 pending planting specs 2017-02-07 18:29:10 +13:00
Daniel O'Connor
92c1515381 Merge pull request #1186 from CloCkWeRX/fix_date_expectation
Fix #1182 and improve test coverage
2017-02-07 14:02:31 +10:30
Shiny
43f905ea25 Merge branch 'dev' into fix_date_expectation 2017-02-07 16:03:39 +13:00
Brenda Wallace
1db30d98ce Haml clean up for members 2017-02-07 15:35:34 +13:00
Shiny
2b92f013fc Merge branch 'dev' into fix_date_expectation 2017-02-07 14:34:41 +13:00
Brenda Wallace
23f8c24ef4 Haml clean up for notifications 2017-02-07 14:33:20 +13:00
Daniel O'Connor
fba2306a4d Merge pull request #1190 from Br3nda/bw/haml-shop
Haml clean for shop
2017-02-07 11:15:26 +10:30
Brenda Wallace
c8fa54591a Haml clean for shop 2017-02-07 07:53:34 +13:00
Daniel O'Connor
67b496fe44 Merge pull request #1185 from Br3nda/bw/grand-haml-cleanup-of-2017
Forums and Gardens haml clean up
2017-02-06 14:13:27 +10:30
Daniel O'Connor
b24514fa82 Look at right attribute 2017-02-06 14:11:44 +10:30
Daniel O'Connor
f0a81d4100 Fix #1182 and improve test coverage 2017-02-06 14:10:40 +10:30
Brenda Wallace
64f11793c9 Fixed typo in link 2017-02-06 16:31:57 +13:00
Brenda Wallace
05a9d498a7 More forums haml clean up 2017-02-06 14:50:49 +13:00
Brenda Wallace
16145599ce Haml clean up for (most) garden views 2017-02-06 14:46:19 +13:00
Brenda Wallace
af8527aa5b Haml clean up of forum views 2017-02-06 14:46:19 +13:00
Daniel O'Connor
f9eb70e2eb Merge pull request #1184 from Br3nda/bw/grand-haml-cleanup-of-2017
Haml clean up -- crops views
2017-02-06 11:47:47 +10:30
Brenda Wallace
8408fdc845 Moved popular plant plarts calculation into sql 2017-02-06 13:22:18 +13:00
Brenda Wallace
f37c9152af Simplified the "grown for" view 2017-02-06 11:21:33 +13:00
Brenda Wallace
4ee789ca06 Popular plant parts are now sorted by popularity 2017-02-06 10:59:40 +13:00
Brenda Wallace
43e4ed43cd Travis starts checking the haml that's cleaned up
To stop regressions to bad haml again
2017-02-06 10:46:49 +13:00
Brenda Wallace
80371c835c Moved long line (ebay url) to helper 2017-02-06 10:40:58 +13:00
Brenda Wallace
6478d9cb1b Haml clean up for crops views 2017-02-06 10:31:45 +13:00
pozorvlak
f8b84f390d Calculate "count_uses_of_property" using DB query (#1183)
* Refactor 'count_uses_of_property' method in crop model
* Add check for nil column value

* Add @alran to CONTRIBUTORS.md

* Reformat Crop#count_uses_of_property

* Remove unnecessary string interpolation
2017-02-05 13:23:47 +13:00
pozorvlak
755b9b339f Merge pull request #1181 from Br3nda/bw/grand-haml-cleanup-of-2017
Te grand haml cleanup of 2017
2017-02-04 23:07:12 +00:00
Shiny
9deed09d36 Merge branch 'dev' into bw/grand-haml-cleanup-of-2017 2017-02-05 11:01:46 +13:00
pozorvlak
43de722faf Merge pull request #1180 from Br3nda/bw/application-controller-complexity
Reduce complexity of ApplicationController.store_location
2017-02-04 21:55:51 +00:00
pozorvlak
e145bb59f7 Merge branch 'dev' into bw/application-controller-complexity 2017-02-04 21:45:06 +00:00
pozorvlak
911c7b7bc1 Merge pull request #1174 from Br3nda/bw/rubocop-reduce-complexity
rubocop - reduce complexity
2017-02-04 21:44:42 +00:00
Brenda Wallace
2b7144c1fd Fixed trailing quote in haml 2017-02-04 15:07:18 +13:00
Brenda Wallace
8ddf36fed9 Haml clean up for (some of) crops views 2017-02-04 15:04:07 +13:00
Brenda Wallace
785ae33a42 Haml clean up for comments views 2017-02-04 14:07:59 +13:00
Brenda Wallace
c43c1686a3 Haml clean up for alternate_names views 2017-02-04 13:50:04 +13:00
Brenda Wallace
65a8bde467 Haml clean up for admin views 2017-02-04 12:00:42 +13:00
Brenda Wallace
3647f67538 Haml clean up for accounts views 2017-02-04 11:52:15 +13:00
Brenda Wallace
6c4f7eff92 Haml clean up for account_types views 2017-02-04 11:50:33 +13:00
Brenda Wallace
9b57a44f6c Adding haml-lint 2017-02-04 11:41:02 +13:00
Brenda Wallace
8a69ed4013 Reduce complexity of ApplicationController.store_location 2017-02-04 11:31:34 +13:00
Brenda Wallace
e5d826e8c3 Further simplified newsletter subscription logic 2017-02-04 11:28:37 +13:00
Brenda Wallace
77c01d4f66 BUGFIX: Added missing if 2017-02-04 11:23:27 +13:00
Brenda Wallace
33b7952ed3 Simplified OmniauthCallbacksController 2017-02-04 11:21:15 +13:00
Brenda Wallace
1217ba5b48 Reduce complexity of ApplicationController.store_location 2017-02-04 11:19:11 +13:00
Brenda Wallace
ffee6ada83 Simplify member.update_newsletter_subscription 2017-02-04 11:18:00 +13:00
Brenda Wallace
63b71a9265 Reduce controller complexity 2017-02-04 11:18:00 +13:00
pozorvlak
3ecc7ba99b Merge pull request #1178 from Br3nda/bw/plantingshelper-simplify
PlantingsHelper simplification
2017-02-03 13:36:42 +00:00
pozorvlak
3e81419e78 Merge branch 'dev' into bw/plantingshelper-simplify 2017-02-03 12:08:54 +00:00
pozorvlak
7cd8dfa0c7 Merge pull request #1176 from Br3nda/bw/seeds-controller-complexity
Reduce complexity of seeds controller
2017-02-03 12:08:45 +00:00
pozorvlak
9182c8ceb1 Merge branch 'dev' into bw/seeds-controller-complexity 2017-02-03 11:12:20 +00:00
pozorvlak
ec8096233c Merge pull request #1179 from CloCkWeRX/repair_gemfile
Repair missing items from Gemfile.lock - jasmine/phantomjs
2017-02-03 11:11:28 +00:00
Brenda Wallace
19aa3a1ca4 PlantingsHelper simplification 2017-02-03 20:42:15 +13:00
Shiny
e574ee166c Merge branch 'dev' into bw/seeds-controller-complexity 2017-02-03 20:32:29 +13:00
Daniel O'Connor
93e9428bb6 Repair missing items from Gemfile.lock 2017-02-03 11:11:47 +10:30
pozorvlak
fcf453b9d9 Merge pull request #1173 from Br3nda/bw/inactive-gardens
hide inactive gardens by default
2017-02-02 22:57:54 +00:00
pozorvlak
909164ea70 Merge branch 'dev' into bw/inactive-gardens 2017-02-02 22:40:21 +00:00
pozorvlak
b5a5aca67b Merge pull request #1175 from Br3nda/bw/plantings-controller-complexity
Reduce complexity of plantings controller
2017-02-02 22:22:41 +00:00
Shiny
2424e7de87 Merge branch 'dev' into bw/inactive-gardens 2017-02-02 14:48:31 +13:00
Shiny
d367b44da1 Merge branch 'dev' into bw/plantings-controller-complexity 2017-02-02 14:48:14 +13:00
Shiny
fe999d7170 Merge branch 'dev' into bw/seeds-controller-complexity 2017-02-02 14:47:10 +13:00
Daniel O'Connor
3267fd7d1f Merge pull request #1177 from Br3nda/bw/simplify-harvest-to-s
Simplified harvest.to_s
2017-02-02 10:58:16 +10:30
Brenda Wallace
355419b6cb Reduce complexity of seeds controller 2017-02-02 00:01:48 +00:00
Brenda Wallace
dfa23a6564 Simplified harvest.to_s 2017-02-01 23:55:45 +00:00
Brenda Wallace
9099ee5779 Reduce complexity of plantings controller 2017-02-01 23:51:14 +00:00
Brenda Wallace
7ba9049908 spec only show active gardens 2017-02-01 18:25:56 +13:00
Brenda Wallace
c82127f1fb Modify specs for new titles on garden nav buttons 2017-02-01 17:37:03 +13:00
Brenda Wallace
666394906b Active gardens only on profiles 2017-02-01 17:37:03 +13:00
Brenda Wallace
150393b1c3 Show only active gardens by default 2017-02-01 17:37:03 +13:00
Daniel O'Connor
e8e1e33a07 Merge pull request #1172 from pozorvlak/install_d3
Install d3-rails gem in production and staging
2017-01-31 11:01:41 +10:30
Miles Gould
18e6e8510c Install d3-rails gem in production and staging
It was only being installed in development and test environments,
causing deployment failures.

Fixes #1170
2017-01-30 20:17:42 +00:00
Daniel O'Connor
64d7c2535b Merge pull request #1168 from Br3nda/likeable
Reviving Likeable
2017-01-27 12:30:36 +10:30
Daniel O'Connor
15106a051c Merge branch 'dev' into likeable 2017-01-27 12:05:13 +10:30
Daniel O'Connor
62fe72c9f4 Merge pull request #1143 from pozorvlak/bw/bar_graphs
[WIP] bar graphs
2017-01-27 12:01:03 +10:30
Daniel O'Connor
43519809f5 Merge branch 'dev' into bw/bar_graphs 2017-01-27 11:54:12 +10:30
Shiny
7731623397 Merge branch 'dev' into likeable 2017-01-27 14:21:53 +13:00
pozorvlak
3b3e14fadb Merge pull request #1161 from Br3nda/bw/pending-crops
Member can see crops they have requested
2017-01-26 11:21:24 +00:00
Daniel O'Connor
271242eca9 Merge branch 'dev' into bw/bar_graphs 2017-01-25 13:00:25 +10:30
Daniel O'Connor
a607fdc6ec Merge branch 'dev' into likeable 2017-01-25 12:58:55 +10:30
Daniel O'Connor
6d1bdf9ae1 Merge branch 'dev' into bw/pending-crops 2017-01-25 12:55:13 +10:30
Daniel O'Connor
25058d02fc Merge pull request #1164 from Br3nda/bw/link-from-harvest-to-planting
Link from harvest to planting, instead of garden
2017-01-25 12:54:42 +10:30
Shiny
b80e7f677c Merge branch 'dev' into likeable 2017-01-24 19:44:42 +13:00
pozorvlak
576426c30d Merge pull request #1166 from Br3nda/bw/fix-notify-sys-exit
Fix crashing on email send - HOTFIX to master
2017-01-23 17:54:19 +00:00
Shiny
c9b464771d Merge branch 'master' into bw/fix-notify-sys-exit 2017-01-23 21:50:22 +13:00
Shiny
76af02f2a5 Merge branch 'dev' into bw/bar_graphs 2017-01-23 20:18:19 +13:00
Shiny
346970b471 Merge branch 'dev' into bw/pending-crops 2017-01-23 20:17:44 +13:00
Shiny
e6d3c257e8 Merge branch 'dev' into bw/link-from-harvest-to-planting 2017-01-23 20:17:34 +13:00
Daniel O'Connor
7224ef8848 Merge pull request #1159 from Br3nda/bw/garden-display-fix
Fix display of gardens on smaller screens
2017-01-23 14:59:43 +10:30
Brenda Wallace
dd9a0071d2 Link from harvest to planting, instead of garden 2017-01-23 09:58:25 +13:00
Brenda Wallace
65b4b2d23e Feature spec for requested crops 2017-01-23 09:49:47 +13:00
Brenda Wallace
4fedc7f23f Member can see crops they have requested 2017-01-23 09:49:47 +13:00
Shiny
26b3e28171 Merge branch 'dev' into bw/garden-display-fix 2017-01-23 09:41:37 +13:00
Daniel O'Connor
29765c7bab Merge pull request #1160 from Br3nda/bw/fix-notify-sys-exit
change deliver_later to deliver_now, so we don't sys.exit() crash
2017-01-23 00:21:47 +10:30
Brenda Wallace
370938c9f9 change deliver_later to deliver_now, so we don't sys.exit() crash 2017-01-22 21:22:30 +13:00
Brenda Wallace
08d407f041 Fix display of gardens on smaller screens 2017-01-22 20:33:37 +13:00
Shiny
d6de147661 Merge branch 'dev' into bw/bar_graphs 2017-01-22 18:39:53 +13:00
Brenda Wallace
9cadbdec2b Regenerated schema file 2017-01-22 18:27:32 +13:00
Brenda Wallace
5e61be9853 Merge remote-tracking branch 'upstream/dev' into HEAD 2017-01-22 18:26:38 +13:00
Brenda Wallace
ff50ec65d0 Merge remote-tracking branch 'upstream/dev' into HEAD 2017-01-22 18:26:29 +13:00
Shiny
714b2580a3 Merge branch 'dev' into bw/bar_graphs 2017-01-18 11:15:09 +13:00
Shiny
22343385f6 Merge branch 'dev' into bw/bar_graphs 2017-01-14 18:26:48 +13:00
Miles Gould
d0351bad70 Merge branch 'dev' into bw/bar_graphs 2017-01-09 15:21:38 +00:00
Miles Gould
7ca371ae43 Merge remote-tracking branch 'mine/bw/bar_graphs' into bw/bar_graphs 2017-01-09 15:19:18 +00:00
Miles Gould
7fa0d22583 Graph real crop sunninesses from server
Works for me in superficial manual testing, but needs automated tests.
Also currently does two server round trips (one for planting locations
and one for sunninesses); it would be better to combine these into one,
or alternatively to create a "crop stats" API endpoint and calculate
sunniness stats in SQL.
2017-01-09 15:13:55 +00:00
Shiny
6e535f2403 Merge branch 'dev' into bw/bar_graphs 2017-01-08 11:10:21 +13:00
Miles Gould
885c9433ce Merge branch 'dev' into bw/bar_graphs 2017-01-05 11:39:10 +00:00
Miles Gould
b0c132c28f Replace literal RGB with variable in graph.css 2017-01-05 11:38:55 +00:00
Miles Gould
8765770071 Ignore spurious code duplication error in bar_*.js
The code in question is

```
  return root.append('g')
    .attr("class", "bar")
    .selectAll("rect")
    .data(bars.map(function(bar) { return bar.value; }))
    .enter()
```

in graphs/bar_group.js, and

```
    return d3.append('g')
      .attr("class", "bar-label")
      .selectAll("text")
      .data(bars.map(function(bar){ return bar.name;}))
      .enter()
      .append("text")
      .attr('x', -80)
```

in graphs/bar_label_group.js. I don't think it's worth unifying these.
2017-01-05 11:19:44 +00:00
Miles Gould
8083ae9052 Remove duplicate getBarValues() methods
I've replaced one with a getMaxValue() function, which is what we
actually want, and deleted the other.
2017-01-05 11:18:51 +00:00
Shiny
a95fca3682 Merge branch 'dev' into bw/bar_graphs 2017-01-03 22:42:58 +13:00
Shiny
0c8345d1e2 Merge branch 'dev' into bw/bar_graphs 2016-12-22 10:22:29 +13:00
Shiny
27520e9aa6 Merge branch 'dev' into bw/bar_graphs 2016-12-16 12:52:16 +13:00
Daniel O'Connor
3cdaa03e5d Merge branch 'dev' into likeable 2016-12-15 14:28:22 +10:30
Shiny
fe5a93160f Merge branch 'dev' into bw/bar_graphs 2016-12-10 21:39:11 +13:00
Daniel O'Connor
88ba4f9198 Rubocop 2016-12-09 12:19:38 +10:30
Daniel O'Connor
2594e5d334 Rubocop 2016-12-09 12:06:14 +10:30
Daniel O'Connor
ce9fc85d0b Rubocop 2016-12-09 12:04:13 +10:30
Daniel O'Connor
2499db77f1 Rubocop 2016-12-09 11:59:56 +10:30
Daniel O'Connor
8edbef3965 Rubocop 2016-12-09 11:56:53 +10:30
Daniel O'Connor
2e23675425 app/controllers/likes_controller.rb:2:3: C: Rails/ActionFilter: Prefer before_action over before_filter. 2016-12-09 11:52:46 +10:30
Daniel O'Connor
fef272e30f Merge remote-tracking branch 'upstream/dev' into likeable 2016-12-09 11:42:32 +10:30
Shiny
391d5bed5f Merge branch 'dev' into bw/bar_graphs 2016-12-09 07:29:55 +13:00
Shiny
8161e90fbd Merge branch 'dev' into bw/bar_graphs 2016-12-08 12:35:59 +13:00
Daniel O'Connor
a074e72b9b Merge branch 'dev' into bw/bar_graphs 2016-12-07 13:36:21 +10:30
Brenda Wallace
d4a496eb1c Removed duplicate variable assignment 2016-12-07 12:26:12 +13:00
Brenda Wallace
a23e241480 Eslint clean ups 2016-12-07 12:22:33 +13:00
Brenda Wallace
af424103f4 Code style fix up (comments only) 2016-12-07 11:34:17 +13:00
Brenda Wallace
d68cfe0486 Move the invocation into the parens that contain the function 2016-12-07 11:33:30 +13:00
Brenda Wallace
0f15095129 Fix up css style 2016-12-07 11:30:17 +13:00
Brenda Wallace
6e0e7e4de1 Merge remote-tracking branch 'upstream/dev' into bw/bar_graphs
Conflicts:
	CONTRIBUTORS.md
	Gemfile
	Gemfile.lock
	app/assets/javascripts/application.js
	app/assets/javascripts/crops.js.erb
	app/views/crops/show.html.haml
2016-12-07 11:17:30 +13:00
Daniel O'Connor
07f7bd24d5 Clean up 2016-07-09 21:54:26 +09:30
Daniel O'Connor
04074ff372 Reimplement ajax like/unlike behaviour 2016-07-09 21:53:33 +09:30
Daniel O'Connor
d3dac756d6 Merge remote-tracking branch 'upstream/dev' into likeable 2016-07-09 21:08:33 +09:30
Daniel O'Connor
6f9ae13757 Update spec to wait for the link to appear 2016-06-04 23:01:57 +09:30
Daniel O'Connor
0a33ae8d37 Add an ajax like and unlike (though it hides after the user action) 2016-06-04 22:49:08 +09:30
Daniel O'Connor
ac33816675 Update spec 2016-06-04 21:37:35 +09:30
Daniel O'Connor
77e95ad344 Shift to concerns 2016-06-04 21:02:50 +09:30
Daniel O'Connor
bb25cbe5e2 Merge branch 'dev' of github.com:Growstuff/growstuff into likeable 2016-06-04 21:00:52 +09:30
Marlena Compton
71c0bff3e0 add comments explaining each file per pull request 2015-03-06 07:03:06 -08:00
Marlena Compton
c7a71381b7 write test for tooltips 2015-03-03 06:49:16 -08:00
Marlena Compton
5a1fd19abc move bar color into the data 2015-03-03 05:49:13 -08:00
Marlena Compton
a48a6da494 refactored graph scale into width scale and height scale 2015-02-28 15:50:27 -08:00
Marlena Compton
b0a803a7a5 add h2 for sunniness chart and crop map 2015-02-26 06:41:24 -08:00
Marlena Compton
6e4bb58dfd change color when hovering over a bar 2015-02-26 06:26:38 -08:00
Marlena Compton
66b0f139a9 add tooltip to show data values 2015-02-26 06:07:23 -08:00
Marlena Compton
567562f132 fix merge conflicts in gemfile.lock 2015-02-10 06:44:22 -08:00
Marlena Compton
39feeb94d0 merge in changes from dev branch 2015-02-10 06:28:47 -08:00
Yoong Kang Lim
75ac2081b0 Merge branch 'dev' into likeable
Conflicts:
	db/schema.rb
2015-02-10 22:57:28 +11:00
Yoong Kang Lim
36a94156c1 Merge branch 'dev' into likeable
Conflicts:
	db/schema.rb
2015-02-10 22:54:45 +11:00
Yoong Kang Lim
e3db003bbc Added tests for the concern and member model 2015-02-10 20:18:26 +11:00
Yoong Kang Lim
33a66dce1f Starting stages of a like feature for posts. 2015-02-05 00:54:31 +11:00
Marlena Compton
a013385d35 add bits to get the labels in the right place 2015-01-31 08:02:51 -08:00
Marlena Compton
ba7ef3c85d all charts tests passing WOOT 2015-01-28 05:16:23 -08:00
Marlena Compton
73e144278e added chart to the page 2015-01-27 07:26:31 -08:00
Marlena Compton
e3d2a90af8 all tests by the y test is passing 2015-01-25 12:45:36 -08:00
Marlena Compton
1d5466fdfd all but one test passing and seeing that I need a how separate y scale 2015-01-24 16:23:09 -08:00
Marlena Compton
a749a9ca63 all tests working but 2 about to monkey with data again 2015-01-23 06:33:03 -08:00
Marlena Compton
6d8817d1fe fixing tests but some of them are green and render is working 2015-01-19 07:34:15 -08:00
Marlena Compton
1a845fdabc xscale working 2015-01-13 21:40:31 -08:00
Marlena Compton
e52c4f7d4b add group for graph and transform to accommodate labels 2014-12-22 10:24:33 -08:00
Marlena Compton
5f435b1e82 fix conflict in contributors file 2014-12-14 10:15:05 -08:00
Marlena Compton
f608685ac8 add names to contributors 2014-12-12 13:36:11 -08:00
Marlena Compton
dbbd37e59e BarGroup uses data object 2014-12-06 21:30:38 -08:00
Marlena Compton
482650dec6 bar label group and all tests passing 2014-12-06 21:16:22 -08:00
Marlena Compton
cc22b87cf1 barlabelgroup tests passing still horizontalbargraph tests to fix 2014-12-06 08:30:49 -08:00
Marlena Compton
8826b0137a changed growtuff to growstuff which fixed tests 2014-11-26 13:55:27 -08:00
Marlena Compton
d4d76b2e8d committing tests classes I thought I committed earlier :/ 2014-11-26 13:48:22 -08:00
Marlena Compton
994ee18f13 Merge remote-tracking branch 'upstream/master' 2014-11-23 14:36:21 -08:00
Marlena Compton
80532e94f1 Merge remote-tracking branch 'origin/dev' 2014-09-11 06:46:41 -07:00
202 changed files with 3015 additions and 955 deletions

View File

@@ -19,6 +19,9 @@ engines:
languages:
- ruby
- javascript
exclude_fingerprints:
- 16dbcb58d6caa7ccfe241417831ecfa6
- 7d7dca4f27f50e3084f203280073cc74
fixme:
enabled: true
exclude_fingerprints: # rubocop_todo filename

4
.haml-lint.yml Normal file
View File

@@ -0,0 +1,4 @@
linters:
LineLength:
max: 120

View File

@@ -37,7 +37,7 @@ Metrics/MethodLength:
# Remove the following once the code style matches
# Offense count: 59
Metrics/AbcSize:
Max: 38
Max: 32
# Offense count: 5
# Configuration parameters: CountComments.
@@ -47,7 +47,7 @@ Metrics/BlockLength:
# Offense count: 6
# Configuration parameters: CountComments.
Metrics/ClassLength:
Max: 275
Max: 269
# Offense count: 6
Metrics/CyclomaticComplexity:
@@ -58,7 +58,7 @@ Metrics/LineLength:
# Offense count: 8
Metrics/PerceivedComplexity:
Max: 10
Max: 9
# See https://github.com/bbatsov/rubocop/issues/3629
Rails/HttpPositionalArguments:
@@ -75,4 +75,4 @@ Style/FrozenStringLiteralComment:
Rails/Output:
Exclude:
- 'config/unicorn.rb'
- 'db/seeds.rb'
- 'db/seeds.rb'

View File

@@ -28,6 +28,7 @@ before_script:
- bundle exec rake assets:precompile
script:
- bundle exec rubocop --display-cop-names --rails
- bundle exec haml-lint app/views/account_types app/views/admin app/views/alternate_names app/views/account_types app/views/comments app/views/crops app/views/forums app/views/gardens app/views/harvests app/views/notifier app/views/orders app/views/photos
- script/gemfile_check
- bundle exec script/check_contributors_md
- bundle exec rake db:migrate --trace

View File

@@ -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)

View File

@@ -68,6 +68,9 @@ gem 'omniauth-facebook'
gem 'omniauth-flickr', '>= 0.0.15'
gem 'omniauth-twitter'
# For charting data
gem 'd3-rails'
# client for Elasticsearch. Elasticsearch is a flexible
# and powerful, distributed, real-time search and analytics engine.
# An example of the use in the project is fuzzy crop search.
@@ -116,8 +119,10 @@ group :development, :test do
gem 'database_cleaner', '~> 1.5.0'
gem 'factory_girl_rails' # for creating test data
gem 'haml-i18n-extractor'
gem 'haml_lint' # Checks haml files for goodness
gem 'haml-rails' # HTML templating language
gem 'i18n-tasks' # adds tests for finding missing and unused translations
gem 'jasmine' # javascript unit testing
gem 'poltergeist' # for headless JS testing
gem 'rspec-activemodel-mocks'
gem 'rspec-rails' # unit testing framework

View File

@@ -131,6 +131,8 @@ GEM
tins (~> 1.6)
csv_shaper (1.3.0)
activesupport (>= 3.0.0)
d3-rails (3.4.13)
railties (>= 3.1)
dalli (2.7.6)
database_cleaner (1.5.3)
debug_inspector (0.0.2)
@@ -215,6 +217,11 @@ GEM
haml (>= 4.0.6, < 5.0)
html2haml (>= 1.0.1)
railties (>= 4.0.1)
haml_lint (0.20.0)
haml (~> 4.0)
rake (>= 10, < 13)
rubocop (>= 0.47.0)
sysexits (~> 1.1)
hashie (3.4.6)
heroku-api (0.4.2)
excon (~> 0.45)
@@ -238,6 +245,12 @@ GEM
parser (>= 2.2.3.0)
term-ansicolor (>= 1.3.2)
terminal-table (>= 1.5.1)
jasmine (2.5.1)
jasmine-core (>= 2.5.1, < 3.0.0)
phantomjs
rack (>= 1.2.1)
rake
jasmine-core (2.5.2)
jquery-rails (4.2.2)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
@@ -322,6 +335,7 @@ GEM
parser (2.3.3.1)
ast (~> 2.2)
pg (0.19.0)
phantomjs (2.1.1.0)
plupload-rails (1.2.1)
rails (>= 3.1)
poltergeist (1.11.0)
@@ -456,6 +470,7 @@ GEM
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
sysexits (1.2.0)
term-ansicolor (1.4.0)
tins (~> 1.0)
terminal-table (1.7.3)
@@ -514,6 +529,7 @@ DEPENDENCIES
comfortable_mexican_sofa (~> 1.12.0)
coveralls
csv_shaper
d3-rails
dalli
database_cleaner (~> 1.5.0)
devise (>= 4.0.0)
@@ -533,8 +549,10 @@ DEPENDENCIES
haml
haml-i18n-extractor
haml-rails
haml_lint
heroku-api
i18n-tasks
jasmine
jquery-rails
jquery-ui-rails (~> 5.0.2)
js-routes

View File

@@ -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');
});

View 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;
}());

View 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;
}())

View 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;
}());

View 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;
}());

View 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;
}());

View 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");
}
});
});

View File

@@ -5,3 +5,4 @@
@import 'leaflet.markercluster.default'
@import 'custom_bootstrap/custom_bootstrap'
@import 'overrides'
@import 'graphs'

View File

@@ -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

View File

@@ -0,0 +1,2 @@
.bar rect:hover
fill: $graph-hover

View File

@@ -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

View File

@@ -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

View File

@@ -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 }

View File

@@ -6,11 +6,8 @@ class GardensController < ApplicationController
# GET /gardens.json
def index
@owner = Member.find_by(slug: params[:owner])
@gardens = if @owner
@owner.gardens.paginate(page: params[:page])
else
Garden.paginate(page: params[:page])
end
@show_all = params[:all] == '1'
@gardens = gardens
respond_to do |format|
format.html # index.html.erb
@@ -93,4 +90,12 @@ class GardensController < ApplicationController
params.require(:garden).permit(:name, :slug, :owner_id, :description, :active,
:location, :latitude, :longitude, :area, :area_unit)
end
def gardens
g = @owner ? @owner.gardens : Garden.all
g = g.active unless @show_all
g = g.includes(:owner).order(:name)
g = g.paginate(page: params[:page])
g
end
end

View File

@@ -0,0 +1,71 @@
class LikesController < ApplicationController
before_action :authenticate_member!, except: :index
respond_to :html, :json
def create
@like = Like.new
@like.member = current_member
@like.likeable = find_likeable
respond_to do |format|
if @like.save
format.html { redirect_to @like.likeable }
format.json do
render(
json: {
id: @like.likeable.id,
liked_by_member: true,
description: ActionController::Base.helpers.pluralize(@like.likeable.likes.count, "like"),
url: like_path(@like, format: :json)
},
status: 201
)
end
else
format.html do
flash[:error] = 'Unable to like'
redirect_to @like.likeable
end
end
end
end
def destroy
like = Like.find(params[:id])
likeable = like.likeable
respond_to do |format|
if like.destroy
format.html { redirect_to likeable }
format.json do
render(
json: {
id: likeable.id,
liked_by_member: false,
description: ActionController::Base.helpers.pluralize(likeable.likes.count, "like"),
url: likes_path(Like.new, "#{likeable.class.name.underscore}_id", likeable.id, format: :json)
},
status: 200
)
end
else
format.html do
flash[:error] = 'Unable to unlike'
redirect_to likeable
end
end
end
end
private
def find_likeable
params.each do |name, value|
return Regexp.last_match[1].classify.constantize.find(value) if name =~ /(.+)_id$/
end
end
def like_params
params.require(:like).permit(:member, :likeable)
end
end

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -7,13 +7,7 @@ class SeedsController < ApplicationController
def index
@owner = Member.find_by(slug: params[:owner])
@crop = Crop.find_by(slug: params[:crop])
@seeds = if @owner
@owner.seeds.includes(:owner, :crop).paginate(page: params[:page])
elsif @crop
@crop.seeds.includes(:owner, :crop).paginate(page: params[:page])
else
Seed.includes(:owner, :crop).paginate(page: params[:page])
end
@seeds = seeds(owner: @owner, crop: @crop)
respond_to do |format|
format.html # index.html.erb
@@ -109,4 +103,14 @@ class SeedsController < ApplicationController
:days_until_maturity_min, :days_until_maturity_max, :organic, :gmo,
:heirloom, :tradable_to, :slug)
end
def seeds(owner: nil, crop: nil)
if owner
owner.seeds
elsif crop
crop.seeds
else
Seed
end.includes(:owner, :crop).paginate(page: params[:page])
end
end

View File

@@ -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

View File

@@ -18,4 +18,8 @@ module CropsHelper
"You have an unknown quantity of seeds of this crop."
end
end
def crop_ebay_seeds_url(crop)
"http://rover.ebay.com/rover/1/705-53470-19255-0/1?icep_ff3=9&pub=5575213277&toolid=10001&campid=5337940151&customid=&icep_uq=#{URI.escape crop.name}&icep_sellerId=&icep_ex_kw=&icep_sortBy=12&icep_catId=181003&icep_minPrice=&icep_maxPrice=&ipn=psmain&icep_vectorid=229515&kwid=902099&mtid=824&kw=lg" # rubocop:disable Metrics/LineLength
end
end

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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

View File

@@ -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

View File

@@ -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
View 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

View File

@@ -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

View File

@@ -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

View File

@@ -112,6 +112,17 @@ class Planting < ActiveRecord::Base
planted_at.present? && current_date.to_date >= planted_at
end
def days_until_finished
return 0 if finished?
days = (finished_at - Date.current).to_i
days.positive? ? days : 0
end
def days_until_mature
days = ((planted_at + days_before_maturity) - Date.current).to_i
days.positive? ? days : 0
end
def percentage_grown(current_date = Date.current)
return nil unless days_before_maturity && planted?(current_date)

View File

@@ -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

View File

@@ -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

View File

@@ -1,4 +1,4 @@
-content_for :title, "Editing account type"
- content_for :title, "Editing account type"
= render 'form'

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,4 +1,4 @@
-content_for :title, 'Admin'
- content_for :title, 'Admin'
%h2 Manage
@@ -12,4 +12,4 @@
%h2 Orders
=render "admin/orders/searchform"
= render "admin/orders/searchform"

View File

@@ -1,4 +1,4 @@
-content_for :title, 'Newsletter subscribers'
- content_for :title, 'Newsletter subscribers'
%p
- @members.each do |m|

View File

@@ -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'

View File

@@ -1,3 +1,3 @@
-content_for :title, 'Admin Orders'
- content_for :title, 'Admin Orders'
=render "admin/orders/searchform"
= render "admin/orders/searchform"

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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

View File

@@ -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

View File

@@ -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'

View File

@@ -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')

View File

@@ -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)

View File

@@ -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'

View File

@@ -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)

View File

@@ -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'

View File

@@ -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' }

View File

@@ -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'

View File

@@ -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})

View File

@@ -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" }

View File

@@ -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 }

View File

@@ -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

View File

@@ -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'

View File

@@ -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 }

View File

@@ -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(", ")

View File

@@ -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" }

View File

@@ -1,6 +1,6 @@
%p
%small
- if crop.scientific_names.size > 0
- unless crop.scientific_names.empty?
%i
= crop.scientific_names.first.name
%br/

View File

@@ -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'

View File

@@ -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

View File

@@ -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.

View File

@@ -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'

View File

@@ -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'

View File

@@ -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 }

View File

@@ -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')

View File

@@ -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)

View File

@@ -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'

View 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

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -1,23 +1,25 @@
= form_for @forum, :html => { :class => 'form-horizontal', :role => "form" } do |f|
= form_for @forum, html: { class: 'form-horizontal', role: "form" } do |f|
- if @forum.errors.any?
#error_explanation
%h2= "#{pluralize(@forum.errors.size, "error")} prohibited this forum from being saved:"
%h2
= pluralize(@forum.errors.size, "error")
prohibited this forum from being saved:
%ul
- @forum.errors.full_messages.each do |msg|
%li= msg
.form-group
= f.label :name, :class => 'control-label col-md-2'
= f.label :name, class: 'control-label col-md-2'
.col-md-8
= f.text_field :name, :class => 'form-control'
= f.text_field :name, class: 'form-control'
.form-group
= f.label :description, :class => 'control-label col-md-2'
= f.label :description, class: 'control-label col-md-2'
.col-md-8
= f.text_area :description, :rows => 6, :class => 'form-control'
= f.text_area :description, rows: 6, class: 'form-control'
.form-group
= f.label :owner_id, :class => 'control-label col-md-2'
= f.label :owner_id, class: 'control-label col-md-2'
.col-md-8
= collection_select(:forum, :owner_id, Member.all, :id, :login_name, {}, :class => 'form-control')
= collection_select(:forum, :owner_id, Member.all, :id, :login_name, {}, class: 'form-control')
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit 'Save', :class => 'btn btn-primary'
= f.submit 'Save', class: 'btn btn-primary'

View File

@@ -2,15 +2,15 @@
- if can? :create, Forum
%p
= link_to "New forum", new_forum_path, :class => 'btn btn-default'
= link_to "New forum", new_forum_path, class: 'btn btn-default'
- @forums.each do |forum|
%h2= forum
%p
= localize_plural(forum.posts, Post)
|
=link_to "Visit forum", forum
= link_to "Visit forum", forum
|
=link_to "Post", new_post_path(:forum_id => forum.id)
=render :partial => "posts/summary", :locals => { :posts => forum.posts, :howmany => 4 }
= link_to "Post", new_post_path(forum_id: forum.id)
= render partial: "posts/summary", locals: { posts: forum.posts, howmany: 4 }

View File

@@ -1,7 +1,7 @@
- content_for :title, @forum.name
- content_for :opengraph do
- if @forum.description
= tag("meta", property: "og:description", content: strip_tags(@forum.description).split(' ')[0..20].join(' '))
= tag("meta", property: "og:description", content: og_description(@forum.description))
= tag("meta", property: "og:title", content: @forum.name)
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
@@ -18,18 +18,18 @@
#{ strip_tags(@forum.description) }
- if can? :edit, @forum
=link_to "Edit", edit_forum_path(@forum), :class => 'btn btn-default btn-xs'
= link_to "Edit", edit_forum_path(@forum), class: 'btn btn-default btn-xs'
- if can? :delete, @forum
= link_to 'Delete', @forum, :method => :delete, :data => { :confirm => 'Are you sure?' }
= link_to 'Delete', @forum, method: :delete, data: { confirm: 'Are you sure?' }
%h2
Posts
=link_to "Post something", new_post_path(:forum_id => @forum.id), :class => 'btn btn-primary'
= link_to "Post something", new_post_path(forum_id: @forum.id), class: 'btn btn-primary'
- if @forum.posts.size > 0
=render :partial => "posts/summary", :locals => { :posts => @forum.posts }
- else
- if @forum.posts.empty?
No posts yet.
- else
= render partial: "posts/summary", locals: { posts: @forum.posts }

View File

@@ -1,46 +1,50 @@
= required_field_help_text
= form_for(@garden, :html => {:class => "form-horizontal", :role => "form"}) do |f|
= form_for(@garden, html: { class: "form-horizontal", role: "form" }) do |f|
- if @garden.errors.any?
#error_explanation
%h2= "#{pluralize(@garden.errors.size, "error")} prohibited this garden from being saved:"
%h2
= pluralize(@garden.errors.size, "error")
prohibited this garden from being saved:
%ul
- @garden.errors.full_messages.each do |msg|
%li= msg
.form-group.required
= f.label :name, :class => 'control-label col-md-2'
= f.label :name, class: 'control-label col-md-2'
.col-md-8
= f.text_field :name, :class => 'form-control', :maxlength => 255, :required => "required"
= f.text_field :name, class: 'form-control', maxlength: 255, required: "required"
.form-group
= f.label :description, :class => 'control-label col-md-2'
= f.label :description, class: 'control-label col-md-2'
.col-md-8
= f.text_area :description, :rows => 6, :class => 'form-control'
= render :partial => 'shared/form_optional'
= f.text_area :description, rows: 6, class: 'form-control'
= render partial: 'shared/form_optional'
.form-group
= f.label :location, :class => 'control-label col-md-2'
= f.label :location, class: 'control-label col-md-2'
.col-md-8
= f.text_field :location, :value => @garden.location || current_member.location, :class => 'form-control', :maxlength => 255
= render :partial => 'shared/form_optional'
= f.text_field :location,
value: @garden.location || current_member.location,
class: 'form-control', maxlength: 255
= render partial: 'shared/form_optional'
%span.help-block
= t('.location_helper')
- if current_member.location.blank?
=link_to "Set your location now.", edit_member_registration_path
= link_to "Set your location now.", edit_member_registration_path
- else
=link_to "Change your location.", edit_member_registration_path
= link_to "Change your location.", edit_member_registration_path
.form-group
= f.label :area, :class => 'control-label col-md-2'
= f.label :area, class: 'control-label col-md-2'
.col-md-2
= f.number_field :area, :class => 'input-small form-control'
= render :partial => 'shared/form_optional'
= f.number_field :area, class: 'input-small form-control'
= render partial: 'shared/form_optional'
.col-md-2
= f.select(:area_unit, Garden::AREA_UNITS_VALUES, {:include_blank => false}, :class => 'form-control')
= f.select(:area_unit, Garden::AREA_UNITS_VALUES, { include_blank: false }, class: 'form-control')
.form-group
= f.label :active, 'Active? ', :class => 'control-label col-md-2'
= f.label :active, 'Active? ', class: 'control-label col-md-2'
.col-md-8
= f.check_box :active
You can mark a garden as inactive if you no longer use it. Note:
@@ -48,4 +52,4 @@
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit 'Save Garden', :class => 'btn btn-primary'
= f.submit 'Save Garden', class: 'btn btn-primary'

View File

@@ -0,0 +1,15 @@
- content_for :buttonbar do
- if current_member
= link_to 'My Gardens', gardens_by_owner_path(owner: current_member.slug), class: 'btn btn-default'
= link_to "Everyone's gardens", gardens_path, class: 'btn btn-default'
= link_to gardens_active_tickbox_path(@owner, show_all) do
= check_box_tag 'active', 'all', show_all
include in-active
- if can?(:create, Garden)
= link_to 'Add a garden', new_garden_path, class: 'btn btn-primary'
- unless current_member
= render partial: 'shared/signin_signup', locals: { to: 'add a new garden' }

View File

@@ -3,12 +3,14 @@
%h3.panel-title
= link_to display_garden_name(garden), garden
- if can? :edit, garden
%a.pull-right{:href => edit_garden_path(garden), :role => "button", :id => "edit_garden_glyphicon"}
%span.glyphicon.glyphicon-pencil{:title => "Edit"}
.panel-body{:id => "gardens_panel_body"}
%a.pull-right{ href: edit_garden_path(garden), role: "button", id: "edit_garden_glyphicon" }
%span.glyphicon.glyphicon-pencil{ title: "Edit" }
.panel-body{ id: "gardens_panel_body" }
.row
.col-md-4
= link_to image_tag((garden.default_photo ? garden.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => garden.name, :class => 'img'), garden
= link_to image_tag((garden.default_photo ? garden.default_photo.thumbnail_url : 'placeholder_150.png'),
alt: garden.name, class: 'img'),
garden_path(garden)
.col-md-8
%dl.dl-horizontal
%dt Name :
@@ -25,7 +27,8 @@
%dd= garden.active ? "Yes" : "No"
.col-md-12
%b
= "#{localize_plural(garden.plantings, Planting)} : "
= localize_plural(garden.plantings, Planting)
= ":"
= display_garden_plantings(garden.plantings.current)
- if garden.plantings.size > 2
%br

View File

@@ -1,32 +1,20 @@
- content_for :title, @owner ? "#{@owner}'s gardens" : "Everyone's gardens"
%p
- if can? :create, Garden
- if @owner
%p
- if @owner == current_member
= link_to 'Add a garden', new_garden_path, :class => 'btn btn-primary'
= link_to "View everyone's gardens", gardens_path, :class => 'btn btn-default'
- else # everyone's gardens
= link_to 'Add a garden', new_garden_path, :class => 'btn btn-primary'
- if current_member
= link_to 'View your gardens', gardens_by_owner_path(:owner => current_member.slug), :class => 'btn btn-default'
- else
= render :partial => 'shared/signin_signup', :locals => { :to => 'add a new garden' }
= render 'nav', owner: @owner, show_all: @show_all
%div.pagination
.pagination
= page_entries_info @gardens
= will_paginate @gardens
.row
- if @gardens.size > 0
- if @gardens.empty?
%p There are no gardens to display.
- else
- @gardens.each do |garden|
.col-md-6
=render :partial => 'gardens/thumbnail', :locals => {:garden => garden}
- else
%p There are no gardens to display.
= render partial: 'gardens/thumbnail', locals: { garden: garden }
%div.pagination
.pagination
= page_entries_info @gardens
= will_paginate @gardens

View File

@@ -1,31 +1,36 @@
=content_for :title, "#{@garden.owner}'s #{@garden}"
= content_for :title, "#{@garden.owner}'s #{@garden}"
- content_for :opengraph do
- @garden.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
- if @garden.description
= tag("meta", property: "og:description", content: @garden.description)
= tag("meta", property: "og:description", content: og_description(@garden.description))
= tag("meta", property: "og:title", content: "#{@garden.owner}'s #{@garden}")
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: request.original_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
.row
.col-md-9
- if can? :edit, @garden or can? :delete, @garden
- if can?(:edit, @garden) || can?(:delete, @garden)
%p.btn-group
- if can? :edit, @garden
- if @garden.active
= link_to "Plant something", new_planting_path(:garden_id => @garden.id), :class => 'btn btn-primary'
= link_to "Mark as inactive", garden_path(@garden, :garden => {:active => 0}), |
:method => :put, :class => 'btn btn-default', |
= link_to "Plant something", new_planting_path(garden_id: @garden.id), class: 'btn btn-primary'
= link_to "Mark as inactive", garden_path(@garden, garden: { active: 0 }),
method: :put, class: 'btn btn-default',
data: { confirm: 'All plantings associated with this garden will be marked as finished. Are you sure?' }
- else
= link_to "Mark as active", garden_path(@garden, :garden => {:active => 1}), :method => :put, :class => 'btn btn-default'
= link_to 'Edit garden', edit_garden_path(@garden), :class => 'btn btn-default'
- if can? :destroy, @garden
= link_to 'Delete garden', @garden, method: :delete, |
data: { confirm: 'All plantings associated with this garden will also be deleted. Are you sure?' }, :class => 'btn btn-default'
= link_to "Mark as active", garden_path(@garden, garden: { active: 1 }),
method: :put,
class: 'btn btn-default'
= link_to 'Edit garden', edit_garden_path(@garden), class: 'btn btn-default'
- if can?(:destroy, @garden)
= link_to 'Delete garden', @garden,
method: :delete,
data: { confirm: 'All plantings associated with this garden will also be deleted. Are you sure?' },
class: 'btn btn-default'
- if ! @garden.active
- unless @garden.active
.alert.alert-warning
This garden is inactive.
- if can? :edit, @garden
@@ -44,7 +49,7 @@
Why not
= link_to 'tell us more.', edit_garden_path(@garden)
- if @garden.photos.size > 0 or (can? :edit, @garden and can? :create, Photo)
- if !@garden.photos.empty? || (can?(:edit, @garden) && can?(:create, Photo))
.row-fluid
%h3 Photos
%p= localize_plural(@garden.photos, Photo)
@@ -52,53 +57,51 @@
%ul.thumbnails
- @garden.photos.each do |p|
.col-md-2.six-across
= render :partial => 'photos/thumbnail', :locals => { :photo => p }
= render partial: 'photos/thumbnail', locals: { photo: p }
.row-fluid
- if can? :create, Photo and can? :edit, @garden
- if can?(:create, Photo) && can?(:edit, @garden)
%p
= link_to "Add photo", new_photo_path(:type => "garden", :id => @garden.id), :class => 'btn btn-primary'
= link_to "Add photo", new_photo_path(type: "garden", id: @garden.id), class: 'btn btn-primary'
.row-fluid
%h3 What's planted here?
- if @garden.plantings.current.size > 0
- @garden.plantings.current.each.with_index do |planting_current, index_current|
= render partial: "plantings/thumbnail", locals: {:planting => planting_current}
- if @garden.plantings.current.empty?
%p Nothing is currently planted here.
- else
%p
Nothing is currently planted here.
- @garden.plantings.current.each.with_index do |planting_current, _|
= render partial: "plantings/thumbnail", locals: { planting: planting_current }
.row-fluid
%h3 Previously planted in this garden
- if @garden.plantings.finished.size > 0
- @garden.plantings.finished.each.with_index do |planting_finished|
= render partial: "plantings/thumbnail", locals: {:planting => planting_finished}
- if @garden.plantings.finished.empty?
%p Nothing has been planted here.
- else
%p
Nothing has been planted here.
- @garden.plantings.finished.each.with_index do |planting_finished|
= render partial: "plantings/thumbnail", locals: { planting: planting_finished }
.col-md-3
%h4 About this garden
%p
%strong Owner:
= link_to @garden.owner, @garden.owner
- if ! @garden.location.blank?
- unless @garden.location.blank?
%p
%strong Location:
= @garden.location
- if ! @garden.area.blank?
- unless @garden.area.blank?
%p
%strong Area:
= pluralize(@garden.area, @garden.area_unit)
%h4= "#{@garden.owner}'s gardens"
%h4 "#{@garden.owner}'s gardens"
%ul
- @garden.owner.gardens.active.each do |othergarden|
%li
- if @garden == othergarden
= @garden
- else
= link_to "#{othergarden}", garden_path(othergarden)
= link_to othergarden, garden_path(othergarden)
- if @garden.owner.gardens.inactive.size > 0
- unless @garden.owner.gardens.inactive.empty?
%h4= "Inactive gardens"
%ul
- @garden.owner.gardens.inactive.each do |othergarden|
@@ -106,7 +109,7 @@
- if @garden == othergarden
= @garden
- else
= link_to "#{othergarden}", garden_path(othergarden)
= link_to othergarden, garden_path(othergarden)
- if can? :create, @garden
= link_to 'Add New Garden', new_garden_path, :class => 'btn btn-default btn-xs'
= link_to 'Add New Garden', new_garden_path, class: 'btn btn-default btn-xs'

View File

@@ -1,63 +1,68 @@
= required_field_help_text
= form_for(@harvest, :html => {:class => "form-horizontal", :role => :form}) do |f|
= form_for(@harvest, html: { class: "form-horizontal", role: :form }) do |f|
- if @harvest.errors.any?
#error_explanation
%h2= "#{pluralize(@harvest.errors.size, "error")} prohibited this harvest from being saved:"
%h2
= pluralize(@harvest.errors.size, "error")
prohibited this harvest from being saved:"
%ul
- @harvest.errors.full_messages.each do |msg|
%li= msg
.form-group.required
= f.label :crop, 'What did you harvest?', :class => 'control-label col-md-2'
= f.label :crop, 'What did you harvest?', class: 'control-label col-md-2'
- if @planting
.col-md-8
= link_to @planting.crop.name, planting_path(@planting)
from
= link_to @planting.garden.name, garden_path(@planting.garden)
= link_to @planting.garden.name, garden_path(@planting.garden)
= f.hidden_field :planting_id, value: @planting.id
- else
.col-md-4
= auto_suggest @harvest, :crop, :class => 'form-control col-md-2', :default => @crop
= auto_suggest @harvest, :crop, class: 'form-control col-md-2', default: @crop
.col-md-4
= collection_select(:harvest, :plant_part_id, PlantPart.all, :id, :name, { :selected => @harvest.plant_part_id }, { :class => 'form-control', :prompt => 'e.g. fruit', :required => "required" })
= collection_select(:harvest, :plant_part_id, PlantPart.all,
:id, :name, { selected: @harvest.plant_part_id },
class: 'form-control', prompt: 'e.g. fruit', required: "required")
- unless @planting
%span.help-block.col-md-8
Can't find what you're looking for?
= link_to "Request new crops.", new_crop_path
.form-group
= f.label :harvested_at, 'When?', :class => 'control-label col-md-2'
= f.label :harvested_at, 'When?', class: 'control-label col-md-2'
.col-md-2
= f.text_field :harvested_at, :value => @harvest.harvested_at ? @harvest.harvested_at.to_s(:ymd) : '', :class => 'add-datepicker form-control'
= render :partial => 'shared/form_optional'
= f.text_field :harvested_at, value: @harvest.harvested_at ? @harvest.harvested_at.to_s(:ymd) : '',
class: 'add-datepicker form-control'
= render partial: 'shared/form_optional'
.form-group
= f.label :quantity, 'How many?', :class => 'control-label col-md-2'
= f.label :quantity, 'How many?', class: 'control-label col-md-2'
.col-md-2
-# Some browsers (eg Firefox for Android) assume "number" means
-# "integer" unless you specify step="any":
-# http://blog.isotoma.com/2012/03/html5-input-typenumber-and-decimalsfloats-in-chrome/
= f.number_field :quantity, :class => 'input-small form-control', :step => 'any'
= render :partial => 'shared/form_optional'
= f.number_field :quantity, class: 'input-small form-control', step: 'any'
= render partial: 'shared/form_optional'
.col-md-2
= f.select(:unit, Harvest::UNITS_VALUES, {:include_blank => false}, :class => 'input-medium form-control')
= f.select(:unit, Harvest::UNITS_VALUES, { include_blank: false }, class: 'input-medium form-control')
.form-group
= f.label :weight_quantity, 'Weighing (in total):', :class => 'control-label col-md-2'
= f.label :weight_quantity, 'Weighing (in total):', class: 'control-label col-md-2'
.col-md-2
= f.number_field :weight_quantity, :class => 'input-small form-control', :step => 'any'
= render :partial => 'shared/form_optional'
= f.number_field :weight_quantity, class: 'input-small form-control', step: 'any'
= render partial: 'shared/form_optional'
.col-md-2
= f.select(:weight_unit, Harvest::WEIGHT_UNITS_VALUES, {:include_blank => false}, :class => 'form-control')
= f.select(:weight_unit, Harvest::WEIGHT_UNITS_VALUES, { include_blank: false }, class: 'form-control')
.form-group
= f.label :description, 'Notes', :class => 'control-label col-md-2'
= f.label :description, 'Notes', class: 'control-label col-md-2'
.col-md-8
= f.text_area :description, :rows => 6, :class => 'form-control'
= render :partial => 'shared/form_optional'
= f.text_area :description, rows: 6, class: 'form-control'
= render partial: 'shared/form_optional'
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit 'Save', :class => 'btn btn-primary'
= f.submit 'Save', class: 'btn btn-primary'

View File

@@ -3,12 +3,14 @@
%h3.panel-title
= link_to "#{harvest.owner.login_name}'s #{harvest.crop.name} harvest", harvest
- if can? :edit, harvest
%a.pull-right{:href => edit_harvest_path(harvest), :role => "button", :id => "edit_harvest_glyphicon"}
%span.glyphicon.glyphicon-pencil{:title => "Edit"}
%a.pull-right{ href: edit_harvest_path(harvest), role: "button", id: "edit_harvest_glyphicon" }
%span.glyphicon.glyphicon-pencil{ title: "Edit" }
.panel-body
.row
.col-md-4
= link_to image_tag((harvest.default_photo ? harvest.default_photo.thumbnail_url : 'placeholder_150.png'), :alt => harvest.crop.name, :class => 'img'), harvest.crop
= link_to image_tag((harvest.default_photo ? harvest.default_photo.thumbnail_url : 'placeholder_150.png'),
alt: harvest.crop.name, class: 'img'),
harvest.crop
.col-md-8
%dl.dl-horizontal
%dt Crop :
@@ -23,5 +25,5 @@
%dt Description
%dd.truncate
= display_harvest_description(harvest)
= if not harvest.description.empty?
= if harvest.description.present?
- link_to "Read more", harvest_path(harvest)

View File

@@ -1,4 +1,5 @@
- content_for :title, @owner ? t('.title.owner_harvests', owner: @owner) : @crop ? t('.title.crop_harvests', crop: @crop.name) : t('.title.default')
- content_for :title, title('harvests', @owner, @crop)
- if @owner
= link_to "View #{@owner}'s profile >>", member_path(@owner)
@@ -11,33 +12,33 @@
- if @owner
%p
- if @owner == current_member
= link_to 'Add harvest', new_harvest_path, :class => 'btn btn-primary'
= link_to "View everyone's harvests", harvests_path, :class => 'btn btn-default'
= link_to 'Add harvest', new_harvest_path, class: 'btn btn-primary'
= link_to "View everyone's harvests", harvests_path, class: 'btn btn-default'
- else # everyone's harvests
= link_to 'Add harvest', new_harvest_path, :class => 'btn btn-primary'
= link_to 'Add harvest', new_harvest_path, class: 'btn btn-primary'
- if current_member
= link_to 'View your harvests', harvests_by_owner_path(:owner => current_member.slug), :class => 'btn btn-default'
= link_to 'View your harvests', harvests_by_owner_path(owner: current_member.slug), class: 'btn btn-default'
- else
= render :partial => 'shared/signin_signup', :locals => { :to => 'track your harvests' }
= render partial: 'shared/signin_signup', locals: { to: 'track your harvests' }
%div.pagination
.pagination
= page_entries_info @harvests
= will_paginate @harvests
.row
- if @harvests.size > 0
- unless @harvests.empty?
- @harvests.each do |harvest|
.col-md-6
=render :partial => 'harvests/thumbnail', :locals => {:harvest => harvest}
= render partial: 'harvests/thumbnail', locals: { harvest: harvest }
%div.pagination
.pagination
= page_entries_info @harvests
= will_paginate @harvests
%ul.list-inline
%li The data on this page is available in the following formats:
- if @owner
%li= link_to "CSV", harvests_by_owner_path(@owner, :format => 'csv')
%li= link_to "JSON", harvests_by_owner_path(@owner, :format => 'json')
%li= link_to "CSV", harvests_by_owner_path(@owner, format: 'csv')
%li= link_to "JSON", harvests_by_owner_path(@owner, format: 'json')
- else
%li= link_to "CSV", harvests_path(:format => 'csv')
%li= link_to "JSON", harvests_path(:format => 'json')
%li= link_to "CSV", harvests_path(format: 'csv')
%li= link_to "JSON", harvests_path(format: 'json')

View File

@@ -1,4 +1,4 @@
=content_for :title, "#{@harvest.crop} harvested by #{@harvest.owner}"
= content_for :title, "#{@harvest.crop} harvested by #{@harvest.owner}"
- content_for :opengraph do
- @harvest.photos.each do |photo|
= tag("meta", property: "og:image", content: photo.fullsize_url)
@@ -14,7 +14,7 @@
%b Owner:
= link_to @harvest.owner, @harvest.owner
&mdash;
= link_to "view all #{@harvest.owner}'s harvests", harvests_by_owner_path(:owner => @harvest.owner.slug)
= link_to "view all #{@harvest.owner}'s harvests", harvests_by_owner_path(owner: @harvest.owner.slug)
%p
%b Plant part:
- if @harvest.plant_part
@@ -27,36 +27,39 @@
- if @planting
%p
%b Garden:
%b Planting:
= link_to "#{@planting.crop.name} planted on #{@planting.planted_at}", planting_path(@planting)
in
= link_to @planting.garden, garden_path(@planting.garden)
%p
%b Quantity:
= display_quantity(@harvest)
- if can? :edit, @harvest or can? :destroy, @harvest
- if can?(:edit, @harvest) || can?(:destroy, @harvest)
%p
- if can? :edit, @harvest
=link_to 'Edit', edit_harvest_path(@harvest), :class => 'btn btn-default btn-xs'
= link_to 'Edit', edit_harvest_path(@harvest), class: 'btn btn-default btn-xs'
- if can? :destroy, @harvest
=link_to 'Delete', @harvest, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
= link_to 'Delete', @harvest, method: :delete, data: { confirm: 'Are you sure?' },
class: 'btn btn-default btn-xs'
.col-md-6
= render :partial => "crops/index_card", :locals => { :crop => @harvest.crop}
= render partial: "crops/index_card", locals: { crop: @harvest.crop }
%h2 Notes
:growstuff_markdown
#{ @harvest.description != "" ? @harvest.description : "No description given." }
#{ @harvest.description != "" ? strip_tags(@harvest.description) : "No description given." }
- if @harvest.photos.size > 0 or (can? :edit, @harvest and can? :create, Photo)
- if !@harvest.photos.empty? || (can?(:edit, @harvest) && can?(:create, Photo))
%h2 Pictures
%ul.thumbnails
- @harvest.photos.each do |p|
.col-md-2.six-across
= render :partial => 'photos/thumbnail', :locals => { :photo => p }
- if can? :create, Photo and can? :edit, @harvest
= render partial: 'photos/thumbnail', locals: { photo: p }
- if can?(:create, Photo) && can?(:edit, @harvest)
.col-md-2
.thumbnail(style='height: 220px')
%p{:style => 'text-align: center; padding-top: 50px'}
= link_to "Add photo", new_photo_path(:type => "harvest", :id => @harvest.id), :class => 'btn btn-primary'
.thumbnail{ style: 'height: 220px' }
%p{ style: 'text-align: center; padding-top: 50px' }
= link_to "Add photo", new_photo_path(type: "harvest", id: @harvest.id), class: 'btn btn-primary'

View File

@@ -6,10 +6,10 @@
.col-md-8.info
%p= t('.intro', site_name: ENV['GROWSTUFF_SITE_NAME'])
= render :partial => 'stats'
= render partial: 'stats'
.col-md-4.signup
%p= t('.perks')
%p= link_to(t('.sign_up'), new_member_registration_path, :class => 'btn btn-primary btn-lg')
%p= link_to(t('.sign_up'), new_member_registration_path, class: 'btn btn-primary btn-lg')
%p
%small
= t('.already_html', sign_in: link_to(t('.sign_in_linktext'), new_member_session_path))

View File

@@ -5,24 +5,24 @@
.hidden-xs
- Crop.interesting.first(8).each do |c|
.col-md-3
= render :partial => 'crops/thumbnail', :locals => { :crop => c }
= render partial: 'crops/thumbnail', locals: { crop: c }
.visible-xs
- Crop.interesting.first(3).each do |c|
.col-md-3
= render :partial => 'crops/thumbnail', :locals => { :crop => c }
= render partial: 'crops/thumbnail', locals: { crop: c }
.col-md-4.hidden-xs
- cache cache_key_for(Planting) do
%h2= t('.recently_planted')
= render :partial => 'plantings/list', :locals => { :plantings => Planting.interesting.first(6) }
= render partial: 'plantings/list', locals: { :plantings => Planting.interesting.first(6) }
.row
.col-md-12
- cache cache_key_for(Crop, 'recent') do
%p{ :style => 'margin-top: 11.25px' }
%p{ style: 'margin-top: 11.25px' }
%strong
#{t('.recently_added')}:
!= Crop.recent.limit(12).map {|c| link_to(c, c) }.join(", ")
%p.text-right
=link_to "#{t('.view_all')} »", crops_path
= link_to "#{t('.view_all')} »", crops_path

View File

@@ -2,7 +2,7 @@
- posts = Post.limit(6)
- if posts
=render :partial => "posts/summary", :locals => { :posts => posts, :howmany => 6 }
= render partial: "posts/summary", locals: {posts: posts, howmany: 6 }
- cache cache_key_for(Forum) do
- forums = Forum.all

Some files were not shown because too many files have changed in this diff Show More