auctify 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +229 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/config/auctify_manifest.js +1 -0
  6. data/app/assets/javascripts/folio/console/main_app.coffee +1 -0
  7. data/app/assets/stylesheets/auctify/application.css +15 -0
  8. data/app/assets/stylesheets/auctify/bidder_registrations.css +4 -0
  9. data/app/assets/stylesheets/auctify/bids.css +4 -0
  10. data/app/assets/stylesheets/auctify/sales.css +4 -0
  11. data/app/assets/stylesheets/auctify/sales_packs.css +4 -0
  12. data/app/assets/stylesheets/folio/console/_main_app.sass +1 -0
  13. data/app/assets/stylesheets/scaffold.css +80 -0
  14. data/app/cells/folio/console/atoms/previews/main_app.coffee +1 -0
  15. data/app/concerns/auctify/behavior/base.rb +20 -0
  16. data/app/concerns/auctify/behavior/buyer.rb +16 -0
  17. data/app/concerns/auctify/behavior/item.rb +27 -0
  18. data/app/concerns/auctify/behavior/seller.rb +36 -0
  19. data/app/concerns/auctify/sale/auction_callbacks.rb +44 -0
  20. data/app/controllers/auctify/api/v1/auctions_controller.rb +61 -0
  21. data/app/controllers/auctify/api/v1/base_controller.rb +22 -0
  22. data/app/controllers/auctify/api/v1/console/bids_controller.rb +37 -0
  23. data/app/controllers/auctify/application_controller.rb +8 -0
  24. data/app/controllers/auctify/bidder_registrations_controller.rb +65 -0
  25. data/app/controllers/auctify/bids_controller.rb +64 -0
  26. data/app/controllers/auctify/sales_controller.rb +75 -0
  27. data/app/controllers/auctify/sales_packs_controller.rb +75 -0
  28. data/app/helpers/auctify/application_helper.rb +10 -0
  29. data/app/helpers/auctify/bidder_registrations_helper.rb +6 -0
  30. data/app/helpers/auctify/bids_helper.rb +6 -0
  31. data/app/helpers/auctify/sales_helper.rb +15 -0
  32. data/app/helpers/auctify/sales_packs_helper.rb +6 -0
  33. data/app/jobs/auctify/application_job.rb +6 -0
  34. data/app/jobs/auctify/bidding_closer_job.rb +23 -0
  35. data/app/jobs/auctify/bidding_is_close_to_end_notifier_job.rb +29 -0
  36. data/app/mailers/auctify/application_mailer.rb +8 -0
  37. data/app/models/auctify/application_record.rb +14 -0
  38. data/app/models/auctify/behaviors.rb +27 -0
  39. data/app/models/auctify/bid.rb +72 -0
  40. data/app/models/auctify/bidder_registration.rb +84 -0
  41. data/app/models/auctify/sale/auction.rb +404 -0
  42. data/app/models/auctify/sale/base.rb +210 -0
  43. data/app/models/auctify/sale/retail.rb +97 -0
  44. data/app/models/auctify/sales_pack.rb +101 -0
  45. data/app/serializers/auctify/sale/auction_serializer.rb +46 -0
  46. data/app/services/auctify/bids_appender.rb +241 -0
  47. data/app/services/auctify/service_base.rb +78 -0
  48. data/app/types/auctify/minimal_bids_ladder_type.rb +77 -0
  49. data/app/views/auctify/api/v1/console/bids/index.html.erb +1 -0
  50. data/app/views/auctify/api/v1/console/bids/show.html.erb +1 -0
  51. data/app/views/auctify/bidder_registrations/_form.html.erb +27 -0
  52. data/app/views/auctify/bidder_registrations/edit.html.erb +6 -0
  53. data/app/views/auctify/bidder_registrations/index.html.erb +33 -0
  54. data/app/views/auctify/bidder_registrations/new.html.erb +5 -0
  55. data/app/views/auctify/bidder_registrations/show.html.erb +24 -0
  56. data/app/views/auctify/bids/_form.html.erb +32 -0
  57. data/app/views/auctify/bids/edit.html.erb +6 -0
  58. data/app/views/auctify/bids/index.html.erb +31 -0
  59. data/app/views/auctify/bids/new.html.erb +5 -0
  60. data/app/views/auctify/bids/show.html.erb +19 -0
  61. data/app/views/auctify/sales/_form.html.erb +32 -0
  62. data/app/views/auctify/sales/edit.html.erb +6 -0
  63. data/app/views/auctify/sales/index.html.erb +36 -0
  64. data/app/views/auctify/sales/new.html.erb +5 -0
  65. data/app/views/auctify/sales/show.html.erb +19 -0
  66. data/app/views/auctify/sales_packs/_form.html.erb +57 -0
  67. data/app/views/auctify/sales_packs/edit.html.erb +6 -0
  68. data/app/views/auctify/sales_packs/index.html.erb +40 -0
  69. data/app/views/auctify/sales_packs/new.html.erb +5 -0
  70. data/app/views/auctify/sales_packs/show.html.erb +44 -0
  71. data/app/views/layouts/auctify/application.html.erb +15 -0
  72. data/config/locales/auctify.cs.yml +121 -0
  73. data/config/locales/default.cs.yml +220 -0
  74. data/config/locales/default.en.yml +215 -0
  75. data/config/routes.rb +23 -0
  76. data/db/migrate/20210212163000_create_auctify_sales.rb +16 -0
  77. data/db/migrate/20210216151350_add_type_to_auctify_sales.rb +7 -0
  78. data/db/migrate/20210217101246_add_state_to_auctify_sales.rb +7 -0
  79. data/db/migrate/20210217110819_add_prices_to_auctify_sales.rb +9 -0
  80. data/db/migrate/20210222103031_add_published_at_to_auctify_sale.rb +7 -0
  81. data/db/migrate/20210223090240_create_auctify_bidder_registrations.rb +15 -0
  82. data/db/migrate/20210223152139_create_auctify_bids.rb +13 -0
  83. data/db/migrate/20210225103227_add_bid_steps_ladder_to_auctify_sales.rb +7 -0
  84. data/db/migrate/20210412114319_add_reserve_price_to_auctify_sales.rb +7 -0
  85. data/db/migrate/20210416140603_create_auctify_sales_packs.rb +17 -0
  86. data/db/migrate/20210416141111_add_pack_reference_to_auctify_sales.rb +7 -0
  87. data/db/migrate/20210419075003_add_ends_at_to_auctify_sales.rb +7 -0
  88. data/db/migrate/20210419082800_add_position_to_auctify_sales.rb +8 -0
  89. data/db/migrate/20210419083321_add_indexes.rb +12 -0
  90. data/db/migrate/20210421093652_add_number_to_auctify_sales.rb +7 -0
  91. data/db/migrate/20210423071326_removing_polymorphic_assoc_sale_to_item.rb +7 -0
  92. data/db/migrate/20210423071534_add_currently_ends_at_to_auctify_sales.rb +7 -0
  93. data/db/migrate/20210427121353_change_column_published_on_auctify_sale.rb +15 -0
  94. data/db/migrate/20210427122315_add_featured_to_auctify_sales.rb +7 -0
  95. data/db/migrate/20210428045651_add_sales_bool_indices.rb +9 -0
  96. data/db/migrate/20210428064615_allow_seller_to_be_nil.rb +13 -0
  97. data/db/migrate/20210429051508_add_sales_pack_start_and_end.rb +15 -0
  98. data/db/migrate/20210430080419_add_sales_slug.rb +11 -0
  99. data/db/migrate/20210503095704_add_cancelled_to_auctify_bids.rb +7 -0
  100. data/db/migrate/20210504072041_add_commission_and_contract_to_auctify_sales.rb +8 -0
  101. data/db/migrate/20210506064100_add_winner_to_auctify_sales.rb +7 -0
  102. data/db/migrate/20210506072438_add_bids_count_to_auctify_sales.rb +7 -0
  103. data/db/migrate/20210507085845_rename_bids_count_to_applied_bids_count.rb +7 -0
  104. data/db/migrate/20210510063146_add_dont_confirm_bids_to_registrations.rb +7 -0
  105. data/db/migrate/20210511081556_add_index_on_cancelled_on.rb +7 -0
  106. data/db/migrate/20210512162942_add_sold_at_to_auctify_sales.rb +7 -0
  107. data/db/migrate/20210607113440_add_commission_in_percent_to_sales_packs.rb +7 -0
  108. data/db/migrate/20210617062509_add_index_to_auctify_sales_currently_ends_at.rb +7 -0
  109. data/db/migrate/20210625125732_add_current_winner_to_auctify_sales.rb +7 -0
  110. data/lib/auctify.rb +7 -0
  111. data/lib/auctify/configuration.rb +43 -0
  112. data/lib/auctify/engine.rb +25 -0
  113. data/lib/auctify/version.rb +5 -0
  114. data/lib/tasks/auctify_tasks.rake +23 -0
  115. metadata +442 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c19c38113580070b4a0e6d9914b22c042fb3024e2a96193a7004fd61859985c3
4
+ data.tar.gz: '080f74640d3c40935a0faf304c120cb294e896e000ffa1cc822a769d077f3fbf'
5
+ SHA512:
6
+ metadata.gz: b5dc577b91bd6ba035187bbf272f52f744a6ee7832c90c998e27c7eb63324c98b7bfa1eecb259f21522d0dae8accde3ef112a8166d58bc2ece2a6cbfd6edafa2
7
+ data.tar.gz: 67f7b5f692569e542eaa5a59727e15c9e602a1d022c69156046acf7e343f4f5acecad42b1e7adfd44bc8b7bb317dcd293bb5aec7c4d9d6e28078b829e24dd8b7
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2021 foton
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,229 @@
1
+ # Auctify
2
+ Rails engine for auctions of items. Can be used on any ActiveRecord models.
3
+
4
+ ## Objects
5
+ - `:item` - object/model, which should be auctioned (from `main_app`)
6
+ - `:user` - source for `seller`, `owner`, `buyer` and `bidder` (from `main_app`)
7
+ - `sale` - sale of `:item`; can be direct `retail`, by `auction` or some other type
8
+ - `auction` for one `:item` (it is [Forward auction](https://en.wikipedia.org/wiki/Forward_auction)) (v češtině "Položka aukce")
9
+ - `seller` - person/company which sells `:item` in specific `sale`
10
+ - `bidder` - registered person/user allowed to bid in specific `auction`
11
+ - `buyer` - person/company which buys `:item` in specific `sale` ( eg. winner of auction)
12
+ - `bid` - one bid of one `bidder` in `auction`
13
+ - `sales_pack` - pack of sales(auctions), mostly time framed, Can have physical location or be online. (v češtině "Aukce")
14
+ - `auctioneer` - (needed?) company organizing `auction`
15
+
16
+ ## Relations
17
+ - `:item` 1 : 0-N `sale`, (sale time periods cannot overlap)
18
+ - `:item` N : 1 `owner` (can change in time)
19
+ - `sale` N : 1 `seller`
20
+ - `sale` N : 1 `buyer`
21
+ - `sale::auction` 1 : N `bidders` (trough `bidder_registrations`) 1 : N `bids`
22
+ - `sales_pack` 0-1 : N `sales` (`sales_pack` is optional for `sale`)
23
+ - `auction` N : 1 `auctioneer` (?)
24
+
25
+
26
+ ## Classes
27
+ ### Sales
28
+ - `Sale::Auction` - full body auction of one item for many registered buyer (as bidders)
29
+ - `Sale::Retail` - direct sale of item to one buyer
30
+
31
+ ## TODO
32
+ - generator to copy auction's views to main app (so they can be modified) (engine checks main_app views first)
33
+
34
+
35
+
36
+ ## Notices
37
+ `sale belongs_to item` polymorphic , STI typed
38
+ `sale belongs_to seller` polymorphic
39
+ `sale belongs_to buyer` polymorphic
40
+ `auction has_many bidder_registrations` (?bidders?)
41
+ `bidder_registration belongs buyer` polymorphic
42
+
43
+ If `item.owner` exists, it is used as `auction.seller` (or Select from all aucitfied sellers)
44
+
45
+ ## Features required
46
+
47
+ - if bidder adds bid in `:prolonging_limit` minutes before auction ends, end time is extended for `bid.time + prolonging_limit` (so auction end when there are no bids in last `:prolonging_limit` minutes)
48
+ - for each auction, there can be set of rules for minimal `bid` according to current `auctioned_price` (default can be `(1..Infinity) => 1`)
49
+ real example
50
+ ```
51
+ minimal_bids = {
52
+ (0...5_000) => 100,
53
+ (5_000...20_000) => 500,
54
+ (20_000...100_000) => 1_000,
55
+ (100_000...500_000) => 5_000,
56
+ (500_000...1_000_000) => 10_000,
57
+ (1_000_000...2_000_000) => 50_000,
58
+ (2_000_000..) => 100_000
59
+ }
60
+ ```
61
+ - first bid do not increase `auctioned_price` it stays on `base_price`
62
+ - bidder cannot "overbid" themselves (no following bids from same bidder)
63
+ - auctioneer can define format of auction numbers (eg. "YY#####") and sales_pack numbers
64
+ - there should be ability to follow `auction` (notification before end) or `item.author` (new item in auction)
65
+ - item can have category and user can select auction by categories.
66
+ - SalePack can be `(un)published /public`
67
+ - SalePack can be `open (adding items , bidding)/ closed(bidding ended)`
68
+ - auctioneer_commission is in % and adds to sold_price in checkout
69
+ - auction have `start_time` and `end_time`
70
+ - auction can be `highlighted` for cover pages
71
+ - auction stores all bids history even those cancelled by admin
72
+ - there should be two types of bid
73
+ - one with maximal price (amount => maximal bid price; placed in small bids as needed), system will increase bid automagicaly unless it reaches maximum
74
+ - second direct bid (amount => bid price; immediattely placed)
75
+ - sales numbering: YY#### (210001, 210002, …, 259999)
76
+
77
+
78
+
79
+
80
+
81
+ ## Usage
82
+ In `ActiveRecord` model use class method `auctify_as` with params `:buyer`,`:seller`, `:item`.
83
+ ```ruby
84
+ class User < ApplicationRecord
85
+ auctify_as :buyer, :seller # this will add method like `sales`, `puchases` ....
86
+ end
87
+
88
+ class Painting < ApplicationRecord
89
+ auctify_as :item # this will add method like `sales` ....
90
+ end
91
+ ```
92
+ `Auctify` expects that auctifyied model instances responds to `to_label` and `:item` to reponds to `owner` (which should lead to object auctified as `:seller`)!
93
+
94
+ ## Installation
95
+ 1. ### Add gem
96
+ Add this line to your application's Gemfile:
97
+
98
+ ```ruby
99
+ gem 'auctify'
100
+ ```
101
+
102
+ And then execute:
103
+ ```bash
104
+ $ bundle
105
+ ```
106
+
107
+ Or install it yourself as:
108
+ ```bash
109
+ $ gem install auctify
110
+ ```
111
+
112
+ 2. ### Auctify classes
113
+ ```ruby
114
+ class User < ApplicationRecord
115
+ auctify_as :buyer, :seller # this will add method like `sales`, `puchases` ....
116
+ end
117
+
118
+ class Painting < ApplicationRecord
119
+ auctify_as :item # this will add method like `sales` ....
120
+ end
121
+ ```
122
+
123
+ 3. ### Configure
124
+ - optional
125
+ ```ruby
126
+ Auctify.configure do |config|
127
+ config.autoregister_as_bidders_all_instances_of_classes = ["User"] # default is []
128
+ config.auction_prolonging_limit = 10.minutes # default is 1.minute
129
+ config.auctioneer_commission_in_percent = 10 # so buyer will pay: auction.current_price * ((100 + 10)/100)
130
+ config.autofinish_auction_after_bidding = true # after `auction.close_bidding!` immediatelly proces result to `auction.sold_in_auction!` or `auction.not_sold_in_auction!`; default false
131
+ config.when_to_notify_bidders_before_end_of_bidding = 30.minutes # default `nil` => no notifying
132
+ config.restrict_overbidding_yourself_to_max_price_increasing = false # default is `true` so only bids with `max_price` can be applied if You are winner.
133
+ end
134
+ ```
135
+
136
+ If model autified as `:buyer` responds to `:bidding_allowed?` , check is done before each `auction.bid!`. Also if `buyer.bidding_allowed? => true` , registration to auction is created on first bid.
137
+ 4. ### Callbacks
138
+ For available auction callback methods to override see `app/concerns/auctify/sale/auction_callbacks.rb`
139
+
140
+
141
+ 5. ### Use directly
142
+ ```ruby
143
+ banksy = User.find_by(nickname: "Banksy")
144
+ bidder1 = User.find_by(nickname: "Bidder1")
145
+ bidder2 = User.find_by(nickname: "Bidder2")
146
+ piece = Painting.find_by(title: "Love is in the bin")
147
+
148
+ piece.owner == banksy # => (not actually) :true
149
+
150
+ auction = banksy.offer_to_sale!(piece, { in: :auction, price: 100 })
151
+
152
+ auction.offered? # => :true
153
+ auction.item == piece # => :true
154
+ auction.seller == banksy # => :true
155
+ auction.offered_price # => 100.0
156
+
157
+ banksy.sales # => [auction]
158
+ banksy.auction_sales # => [auction]
159
+ banksy.retail_sales # => []
160
+
161
+ pieces.sales # => [auction]
162
+
163
+ auction.bidder_registrations # => [] unless config.autoregister_as_bidders_all_instances_of_classes is set
164
+ auction.bidder_registrations.create(bidder: bidder1) # => error, not allowed ("Aukce aktuálně nepovoluje nové registrace")
165
+
166
+ auction.accept_offer!
167
+
168
+ b1_reg = auction.bidder_registrations.create(bidder: bidder1)
169
+ b2_reg = auction.bidder_registrations.create(bidder: bidder2)
170
+
171
+ auction.bidder_registrations.size # => 2
172
+ auction.current_price # => nil
173
+
174
+ auction.start_sale!
175
+ auction.current_price # => 100.0
176
+
177
+ aucion.bid!(Auctify::Bid.new(registration: b1_reg, price: nil, max_price: 150))
178
+ # auction.bid_appended! is called after succesfull bid, You can override it
179
+ # auction.bid_not_appended!(errors) is called after unsuccesfull bid, You can override it
180
+
181
+ auction.current_price # => 100.0
182
+ auction.bidding_result.winner # => bidder1
183
+ auction.bidding_result.current_price # => 100.0
184
+ auction.bidding_result.current_minimal_bid # => 101.0 `auction.bid_steps_ladder` is empty, we increasing by 1
185
+
186
+ aucion.bid!(Auctify::Bid.new(registration: b2_reg, price: 145, max_price: nil))
187
+ # some auto bidding is done
188
+ auction.current_price # => 146.0
189
+ auction.bidding_result.winner # => bidder1
190
+ auction.bidding_result.current_price # => 146.0
191
+ auction.bidding_result.current_minimal_bid # => 147.0
192
+ auction.winner # => nil
193
+
194
+ aucion.bid!(Auctify::Bid.new(registration: b2_reg, price: 149, max_price: 155))
195
+ # some auto bidding is done
196
+ auction.current_price # => 151.0
197
+ auction.bidding_result.winner # => bidder2
198
+ auction.bidding_result.current_price # => 151.0
199
+ auction.bidding_result.current_minimal_bid # => 152.0
200
+
201
+ auction.close_bidding!
202
+ auction.bidding_ended? # => true
203
+ auction.buyer # => nil
204
+ auction.winner # => bidder2
205
+
206
+ auction.sold_in_auction!(buyer: bidder2, price: 149, sold_at: currently_ends_at) # it is verified against bids!
207
+
208
+ auction.auctioned_successfully? # => true
209
+ auction.buyer # => bidder2
210
+
211
+ # when all negotiations went well
212
+ auction.sell!
213
+
214
+ auction.sold? # => true
215
+ ```
216
+
217
+ Look into tests `test/models/auctify/sale/auction_bidding_test.rb` and `test/services/auctify/bid_appender_test.rb` for more info about bidding process.
218
+
219
+ To protect accidential deletions, many associations are binded with `dependent: restrict_with_error`. Correct order ofdeletion is `bids` => `sales` => `sales_packs`.
220
+
221
+
222
+
223
+ ## Contributing
224
+ Contribution directions go here.
225
+
226
+ ## License
227
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
228
+
229
+
data/Rakefile ADDED
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require "bundler/setup"
5
+ rescue LoadError
6
+ puts "You must `gem install bundler` and `bundle install` to run rake tasks"
7
+ end
8
+
9
+ require "rdoc/task"
10
+
11
+ RDoc::Task.new(:rdoc) do |rdoc|
12
+ rdoc.rdoc_dir = "rdoc"
13
+ rdoc.title = "Auctify"
14
+ rdoc.options << "--line-numbers"
15
+ rdoc.rdoc_files.include("README.md")
16
+ rdoc.rdoc_files.include("lib/**/*.rb")
17
+ end
18
+
19
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
20
+ load "rails/tasks/engine.rake"
21
+
22
+ load "rails/tasks/statistics.rake"
23
+
24
+ require "bundler/gem_tasks"
25
+
26
+ require "rake/testtask"
27
+
28
+ Rake::TestTask.new(:test) do |t|
29
+ t.libs << "test"
30
+ t.pattern = "test/**/*_test.rb"
31
+ t.verbose = false
32
+ end
33
+
34
+ task default: :test
@@ -0,0 +1 @@
1
+ //= link_directory ../stylesheets/auctify .css
@@ -0,0 +1 @@
1
+ # Override in main app
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1 @@
1
+ // Override in main app
@@ -0,0 +1,80 @@
1
+ body {
2
+ background-color: #fff;
3
+ color: #333;
4
+ margin: 33px;
5
+ }
6
+
7
+ body, p, ol, ul, td {
8
+ font-family: verdana, arial, helvetica, sans-serif;
9
+ font-size: 13px;
10
+ line-height: 18px;
11
+ }
12
+
13
+ pre {
14
+ background-color: #eee;
15
+ padding: 10px;
16
+ font-size: 11px;
17
+ }
18
+
19
+ a {
20
+ color: #000;
21
+ }
22
+
23
+ a:visited {
24
+ color: #666;
25
+ }
26
+
27
+ a:hover {
28
+ color: #fff;
29
+ background-color: #000;
30
+ }
31
+
32
+ th {
33
+ padding-bottom: 5px;
34
+ }
35
+
36
+ td {
37
+ padding: 0 5px 7px;
38
+ }
39
+
40
+ div.field,
41
+ div.actions {
42
+ margin-bottom: 10px;
43
+ }
44
+
45
+ #notice {
46
+ color: green;
47
+ }
48
+
49
+ .field_with_errors {
50
+ padding: 2px;
51
+ background-color: red;
52
+ display: table;
53
+ }
54
+
55
+ #error_explanation {
56
+ width: 450px;
57
+ border: 2px solid red;
58
+ padding: 7px 7px 0;
59
+ margin-bottom: 20px;
60
+ background-color: #f0f0f0;
61
+ }
62
+
63
+ #error_explanation h2 {
64
+ text-align: left;
65
+ font-weight: bold;
66
+ padding: 5px 5px 5px 15px;
67
+ font-size: 12px;
68
+ margin: -7px -7px 0;
69
+ background-color: #c00;
70
+ color: #fff;
71
+ }
72
+
73
+ #error_explanation ul li {
74
+ font-size: 12px;
75
+ list-style: square;
76
+ }
77
+
78
+ label {
79
+ display: block;
80
+ }
@@ -0,0 +1 @@
1
+ # Override in main app
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Auctify
4
+ module Behavior
5
+ module Base
6
+ extend ActiveSupport::Concern
7
+
8
+ def auctify_id
9
+ "#{self.class.name}@#{id}"
10
+ end
11
+
12
+ def object_from_auctify_id(auctify_id)
13
+ return nil if auctify_id.blank?
14
+
15
+ klass, id = auctify_id.to_s.split("@")
16
+ klass.constantize.find(id)
17
+ end
18
+ end
19
+ end
20
+ end