c80_push 0.1.0.2 → 0.1.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b4d991e9e1a4d40ab4a2788f801fc5bda42e61d2
4
- data.tar.gz: 37d7c1a99822e278f8b2b4db16255fdd29a187a8
3
+ metadata.gz: b2bc7b9516f5f7edb8dffce344f1c2465c7dca6d
4
+ data.tar.gz: 5684422a46e41045c3de9a5ba094c8a8b9c2ab3c
5
5
  SHA512:
6
- metadata.gz: c88589031569da99e0158285b792473c6b0c1a580106b6830ad1ffaee861546c219a760983054d5d126da6acf185fb4bdfb8060ad8c2a6eceb171381de09d5f1
7
- data.tar.gz: 9a7b1e94d5105aed752b535222df57341519ae0e7fde738650edda28ccc362185b010eea44616551fbc6b039440b050f3d2bffdb2a59b05609be3d9bd67f595c
6
+ metadata.gz: 5bbd6b017f98a1d3c469f237d1aef3d936749e7a757db8c07f318e9375f6ada96b699a3d441f8566cc2674787bdca379187d9b5e5fe27a119afbe025116a8f9a
7
+ data.tar.gz: 1b5bcdc9f2b603a910bf9209ba040d0853dd91a5c7a9639a994b8f0e2aeae26f124dabd3154b0b0c25e0de116d0fdb43c9158f16234b60e56f21f881e6fd99a8
data/README.md CHANGED
@@ -2,13 +2,14 @@
2
2
 
3
3
  Добавляет функционал дилеров и офисов продаж.
4
4
  Это *ActiveAdmin* plugin.
5
- Использует *Bootstrap* и *Bootstrap Select*.
5
+ Использует *Bootstrap* и *Bootstrap Select*: как во *frontend*,
6
+ так и в *backend*.
6
7
 
7
8
  Содержит модели:
8
9
 
9
- * Дилер
10
- * Офис
11
- * Регион
10
+ * *Регион* (habtm Dealers)
11
+ * *Дилер* (has_many Offices)
12
+ * *Офис* (belongs_to Dealer)
12
13
 
13
14
  Добавляет пункт меню:
14
15
 
@@ -21,7 +22,7 @@
21
22
  Available helpers:
22
23
 
23
24
  * `c80_push_render_page_dealers`: отрисует js-компонент с yandex картой
24
- и фильтруемым списком дилеров слева.
25
+ и фильтруемым, кликабельным списком офисов слева.
25
26
 
26
27
  ## Installation
27
28
 
@@ -36,6 +37,8 @@ And then execute:
36
37
  ```bash
37
38
  $ bundle
38
39
  $ rake db:migrate
40
+ $ rails generate c80_push:install
41
+ $ rake db:seed:c80_push_02_fill_presets
39
42
  ```
40
43
 
41
44
  Add this line to host app's `application_controller.rb`:
@@ -49,7 +52,6 @@ Add these lines to host app's `active_admin.js.coffee`:
49
52
  ```js
50
53
  #= require bootstrap
51
54
  #= require bootstrap-select
52
- #= require c80_yax
53
55
  #= require c80_push_backend
54
56
  ```
55
57
 
@@ -67,10 +69,61 @@ Add these lines to host app's 'application.scss':
67
69
  @import "bootstrap-sprockets";
68
70
  @import "bootstrap";
69
71
  @import "bootstrap-select";
70
- @include "c80_push";
72
+ @import "c80_push";
71
73
  ```
72
74
 
73
- ## Процесс разработки JS функционала
75
+ ## Customization
76
+
77
+ Т.к. исходя из ТЗ было не ясно, есть ли у *Офисов* такие поля, как
78
+ сайт, email и регион, они были добавлены (на всякий случай), и поля
79
+ сделаны необязательными. И их можно "отключить", добавив в host app
80
+ такой файл `app/assets/stylesheets/custom/backend/c80_push/dealers.scss`:
81
+
82
+ ```scss
83
+ /* у Офисов скроем неиспользуемые поля */
84
+ body.admin_dealers {
85
+ &.edit, &.new {
86
+
87
+ li[id*='dealer_offices_attributes_'] {
88
+ &[id*='site_input'] {
89
+ display: none;
90
+ }
91
+ &[id*='email_input'] {
92
+ display: none;
93
+ }
94
+ &[id*='regions_input'] {
95
+ display: none;
96
+ }
97
+ }
98
+ }
99
+ }
100
+ ```
101
+
102
+ А сам файл подключить в `active_admin.scss`:
103
+
104
+ ```scss
105
+ @import "custom/backend/**/*";
106
+ ```
107
+
108
+ # TODO
109
+
110
+ * [X] Добавить валидацию поля `gps` модели *Office*.
111
+
112
+ - [ ] Попробовать подключить к `backend` *client side validation*.
113
+
114
+ * [X] Реализовать функционал цветных маркеров.
115
+
116
+ - [ ] Внутри `bootstrap selectpicker` должны рисоваться цветные прямоугольники:
117
+ [/formtastic/inputs/select_input.rb](https://github.com/justinfrench/formtastic/blob/master/lib/formtastic/inputs/select_input.rb),
118
+ [bootstrap selectpicker: option with data-content](https://stackoverflow.com/questions/26069286/bootstrap-with-select-list-that-contains-only-images)
119
+
120
+ * [ ] Вынести `*.rb` файлы, подлежащие кастомизации в `templates` (предварительно
121
+ определив, что может еще быть кастомизировано), наваять инсталлятор,
122
+ отметить это в `README`.
123
+
124
+ - [X] seeds
125
+
126
+ # Процесс разработки JS функционала
74
127
 
75
128
  Теперь пора заняться js.
76
129
 
@@ -92,13 +145,36 @@ Add these lines to host app's 'application.scss':
92
145
  * [X] При наведении/клике на `.li_office` - должна подсвечиваться соответствующая
93
146
  точка на карте.
94
147
 
95
- * [ ] Вставить из `psd` синий маркер.
148
+ * [X] Реализовать функционал цветных маркеров.
96
149
 
97
150
  * [X] Когда меняется регион:
98
151
 
99
152
  * [X] Должны отобразиться релевантные `.li_office`
100
153
  * [X] Должны отобразиться релевантные точки на карте.
101
154
 
155
+ ## Процесс добавления функционала "Цвет маркеров дилеров"
156
+
157
+ * [X] добавляем таблицу `Presets` с полями `preset_name`
158
+ и `color`, причём `color` я должен забить руками с помощью color picker
159
+ со страницы докуметации Яндекс.карты (`color` используется только в админке
160
+ для иллюстрации "что такое preset").
161
+
162
+ * [X] Таблица `Presets` должна быть habtm-связана с таблицей `:dealers`
163
+
164
+ * [X] Таблицу заполнить содержимым с помощью seed файла, пункт в админке не делать.
165
+
166
+ * [X] при сборке хеша для Яндекс.карт - собираем в него свойства меток
167
+
168
+ - [X] Если цвет не задан - по-умолчанию добавляем голубой
169
+
170
+ * в админке:
171
+
172
+ - [ ] в форме редактирования/создания: у каждого дилера должен быть селект, в котором видно как
173
+ и название `preset-а`, так и его цвет
174
+
175
+ * [X] на индексной странице: должен быть столбец, в котором выводится название
176
+ `preset-a` и его цвет
177
+
102
178
  ## Цитата из ТЗ
103
179
 
104
180
  > Данный раздел представляет собой список компаний, у которых указаны
@@ -114,11 +190,11 @@ Add these lines to host app's 'application.scss':
114
190
  > Выбрав тот или иной регион, пользователь видит слева от
115
191
  > интерактивной карты список компаний, а также адреса их офисов продаж.
116
192
  >
117
- > Офисы продаж ORIMA и копании-дилеры (и адреса их офисов продаж)
193
+ > Офисы продаж компании и копании-дилеры (и адреса их офисов продаж)
118
194
  > разграничены на интерактивной карте маркерами разного цвета.
119
195
  >
120
196
  > В списке слева от интерактивной карты сначала отображаются офисы
121
- > продаж компании ORIMA, а затем список компаний-дилеров
197
+ > продаж компании, а затем список компаний-дилеров
122
198
  > (и адресов их офисов продаж).
123
199
  >
124
200
  > С помощью инструментов панели управления сайтом можно создавать
@@ -8,6 +8,7 @@ ActiveAdmin.register C80Push::Dealer, as: 'Dealer' do
8
8
  :ord,
9
9
  :site,
10
10
  :email,
11
+ :preset_ids => [],
11
12
  :region_ids => [],
12
13
  :offices_attributes => [
13
14
  :id,
@@ -49,8 +50,8 @@ ActiveAdmin.register C80Push::Dealer, as: 'Dealer' do
49
50
  f.inputs 'Свойства' do
50
51
  f.input :title
51
52
  f.input :ord
52
- f.input :site, hint: I18n.t('c80_push.active_admin.hints.site')
53
- f.input :email, hint: I18n.t('c80_push.active_admin.hints.email')
53
+ f.input :site, hint: I18n.t('c80_push.active_admin.hints.dealer.site')
54
+ f.input :email, hint: I18n.t('c80_push.active_admin.hints.dealer.email')
54
55
  f.input :regions,
55
56
  :as => :select,
56
57
  :input_html => {
@@ -63,6 +64,24 @@ ActiveAdmin.register C80Push::Dealer, as: 'Dealer' do
63
64
  :multiple => false
64
65
  },
65
66
  :include_blank => true
67
+ f.input :presets,
68
+ :as => :select,
69
+ :collection => C80Push::Preset.all.map {|p| [p.title, p.id]},
70
+ # :collection => C80Push::Preset.all.map { |p|
71
+ # "<option value='#{p.id}'>#{p.title}</option>".html_safe
72
+ # },
73
+ # :collection => "<option></option>",
74
+ :input_html => {
75
+ :title => '',
76
+ :class => 'selectpicker',
77
+ :data => {
78
+ :size => 10,
79
+ :width => '600px'
80
+ },
81
+ :multiple => false
82
+ },
83
+ :include_blank => true,
84
+ :hint => "<a href='https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/option.presetStorage-docpage/' target='_blank'>Справка по цветам</a>".html_safe
66
85
 
67
86
  f.has_many :offices,
68
87
  :allow_destroy => true,
@@ -71,9 +90,9 @@ ActiveAdmin.register C80Push::Dealer, as: 'Dealer' do
71
90
  office.input :ord
72
91
  office.input :addr
73
92
  office.input :gps
74
- office.input :tel, hint: I18n.t('c80_push.active_admin.hints.tel')
75
- office.input :site, hint: I18n.t('c80_push.active_admin.hints.site')
76
- office.input :email, hint: I18n.t('c80_push.active_admin.hints.email')
93
+ office.input :tel, hint: I18n.t('c80_push.active_admin.hints.office.tel')
94
+ office.input :site, hint: I18n.t('c80_push.active_admin.hints.office.site')
95
+ office.input :email, hint: I18n.t('c80_push.active_admin.hints.office.email')
77
96
  office.input :regions,
78
97
  :as => :select,
79
98
  :input_html => {
@@ -9,11 +9,13 @@ function map_set_objects(region_id) {
9
9
 
10
10
  // соберём коллекцию точек
11
11
  var c = new ymaps.GeoObjectCollection();
12
- var icoords, iprops; // loop vars
12
+ var icoords, iprops, isetts; // loop vars
13
13
  for (var i = 0; i < n; i++) {
14
14
  icoords = arr['coords'][i];
15
15
  iprops = arr['props'][i];
16
- c.add(new ymaps.Placemark(icoords, iprops));
16
+ isetts = arr['setts'][i];
17
+ console.log(isetts);
18
+ c.add(new ymaps.Placemark(icoords, iprops, isetts));
17
19
  }
18
20
 
19
21
  // сначала уберём все точки
@@ -0,0 +1,5 @@
1
+ span.dealer_preset_span {
2
+ display: inline-block;
3
+ width: 100px;
4
+ height: 25px;
5
+ }
@@ -2,4 +2,4 @@
2
2
  *= require_self
3
3
  */
4
4
 
5
- //@import "c80_push/backend/**/*";
5
+ @import "c80_push/backend/**/*";
@@ -42,10 +42,11 @@ module C80Push
42
42
  res = "#{dealer.title}"
43
43
  res += "<br><sub>email: #{format_val(dealer.email)}</sub>"
44
44
  res += "<br><sub>site: #{format_val(dealer.site)}</sub>"
45
+ res += "<br><sub>цвет: #{format_dealer_preset_val(dealer)}</sub>"
45
46
  res.html_safe
46
47
  end
47
48
 
48
- private
49
+ # private
49
50
 
50
51
  def format_val(val)
51
52
  res = '-'
@@ -55,6 +56,19 @@ module C80Push
55
56
  "<span class='c80_md_link_color'>#{res}</span>".html_safe
56
57
  end
57
58
 
59
+ def format_dealer_preset_val(dealer)
60
+ res = '-'
61
+ if dealer.presets.count > 0
62
+ p = dealer.presets.first
63
+ res = format_preset_val(p)
64
+ end
65
+ res.html_safe
66
+ end
67
+
68
+ def format_preset_val(preset)
69
+ "<span class='dealer_preset_span' style='background-color:#{preset.color}'></span>"
70
+ end
71
+
58
72
  end
59
73
 
60
74
  end
@@ -32,12 +32,14 @@ module C80Push
32
32
  #
33
33
  # {
34
34
  # all: { - здесь собираем все офисы всех регионов (для лаконичности js)
35
- # coords: [],
36
- # props: []
35
+ # coords: [], - массив двух координат, например: [12.345, 12.345]
36
+ # props: [], - свойства объекта (офиса): тот текст, который выводится в balloon-e
37
+ # setts: [] - свойства метки (цвет)
37
38
  # }
38
39
  # <region_id>: [ - данные офисов разложены по регионам
39
40
  # coords: [],
40
- # props: []
41
+ # props: [],
42
+ # setts: []
41
43
  # ]
42
44
  # }
43
45
  #
@@ -46,14 +48,15 @@ module C80Push
46
48
  res = {
47
49
  all: {
48
50
  coords: [],
49
- props: []
51
+ props: [],
52
+ setts: []
50
53
  }
51
54
  }
52
55
 
53
56
  rdo.each do |region|
54
57
  region.dealers.each do |dealer|
55
58
  dealer.offices.each do |office|
56
- res[region.id] = { coords:[], props:[] } if res[region.id].nil?
59
+ res[region.id] = { coords:[], props:[], setts:[] } if res[region.id].nil?
57
60
 
58
61
  # координаты точки (это массив двух точек)
59
62
  gps = office.gps_arr
@@ -66,13 +69,20 @@ module C80Push
66
69
  id: office.id
67
70
  }
68
71
 
72
+ # свойства метки - цвет
73
+ setts = {
74
+ preset: "islands##{prepare_dealer_preset(dealer)}"
75
+ }
76
+
69
77
  # фиксируем в хэше региона
70
78
  res[region.id][:coords] << gps
71
79
  res[region.id][:props] << props
80
+ res[region.id][:setts] << setts
72
81
 
73
82
  # фиксируем в all-хэше
74
83
  res[:all][:coords] << gps
75
84
  res[:all][:props] << props
85
+ res[:all][:setts] << setts
76
86
 
77
87
  end
78
88
  # для удобства в js: зафиксируем кол-во офисов региона
@@ -104,5 +114,16 @@ module C80Push
104
114
  res
105
115
  end
106
116
 
117
+ # сформировать название preset-а Дилера
118
+ # для цветного маркера.
119
+ # По умолчанию вернёт `blueDotIcon`
120
+ def prepare_dealer_preset(dealer)
121
+ res = 'blueDotIcon'
122
+ unless dealer.presets.count.zero?
123
+ res = dealer.presets.first.title
124
+ end
125
+ res
126
+ end
127
+
107
128
  end
108
129
  end
@@ -1,6 +1,7 @@
1
1
  module C80Push
2
2
  class Dealer < ActiveRecord::Base
3
3
  has_and_belongs_to_many :regions
4
+ has_and_belongs_to_many :presets
4
5
  has_many :offices, :dependent => :destroy
5
6
  accepts_nested_attributes_for :offices,
6
7
  :reject_if => lambda { |attributes|
@@ -15,7 +15,8 @@ module C80Push
15
15
  :presence => true
16
16
 
17
17
  validates :gps,
18
- :presence => true
18
+ :presence => true,
19
+ :format => { with: /\A\d+\.\d+,\s*\d+\.\d+\z/ }
19
20
 
20
21
  validates :tel,
21
22
  :presence => true
@@ -0,0 +1,5 @@
1
+ module C80Push
2
+ class Preset < ActiveRecord::Base
3
+ has_and_belongs_to_many :dealer
4
+ end
5
+ end
@@ -24,4 +24,4 @@
24
24
  var offices = <%= ymap_hash.to_json.html_safe %>;
25
25
  </script>
26
26
 
27
- <script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
27
+ <script src="https://api-maps.yandex.ru/2.1/?load=package.standard&lang=ru-RU" type="text/javascript"></script>
@@ -2,8 +2,9 @@ ru:
2
2
  c80_push:
3
3
  active_admin:
4
4
  hints:
5
- site: 'Если сайтов несколько, перечислите их через запятую'
6
- email: 'Если адресов несколько, перечислите их через запятую'
5
+ dealer:
6
+ site: 'Если сайтов несколько, перечислите их через запятую'
7
+ email: 'Если адресов несколько, перечислите их через запятую'
7
8
  menu:
8
9
  dealer: 'Список дилеров'
9
10
  activerecord:
@@ -19,4 +20,13 @@ ru:
19
20
  site: 'Сайт(ы)'
20
21
  email: 'Email адрес(а)'
21
22
  regions: 'Регион'
22
- offices: 'Офисы'
23
+ presets: 'Цвет маркера на карте'
24
+ offices: 'Офисы'
25
+ errors:
26
+ models:
27
+ c80_push/dealer:
28
+ attributes:
29
+ ord:
30
+ blank: 'Не может быть пустым'
31
+ title:
32
+ blank: 'Не может быть пустым'
@@ -2,9 +2,10 @@ ru:
2
2
  c80_push:
3
3
  active_admin:
4
4
  hints:
5
- tel: 'Если номеров несколько, перечислите их через запятую'
6
- site: 'Если сайтов несколько, перечислите их через запятую'
7
- email: 'Если адресов несколько, перечислите их через запятую'
5
+ office:
6
+ tel: 'Если номеров несколько, перечислите их через запятую'
7
+ site: 'Если сайтов несколько, перечислите их через запятую'
8
+ email: 'Если адресов несколько, перечислите их через запятую'
8
9
  activerecord:
9
10
  models:
10
11
  office:
@@ -20,3 +21,18 @@ ru:
20
21
  site: 'Сайт(ы)'
21
22
  email: 'Email адрес(а)'
22
23
  regions: 'Регион'
24
+ errors:
25
+ models:
26
+ c80_push/office:
27
+ attributes:
28
+ ord:
29
+ blank: 'Не может быть пустым'
30
+ title:
31
+ blank: 'Не может быть пустым'
32
+ addr:
33
+ blank: 'Не может быть пустым'
34
+ gps:
35
+ blank: 'Не может быть пустым'
36
+ invalid: 'Неверный формат. Пример правильного значения: 12.1234,12.1234'
37
+ tel:
38
+ blank: 'Не может быть пустым'
@@ -0,0 +1,9 @@
1
+ class CreateC80PushPresets < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :c80_push_presets do |t|
4
+ t.string :title, null: false, limit: 90
5
+ t.string :color, null: false, limit: 10
6
+ t.timestamps null: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ class CreateC80PushJoinTableDealersPresets < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :c80_push_dealers_presets, :id => false do |t|
4
+ t.integer :dealer_id, :null => false
5
+ t.integer :preset_id, :null => false
6
+ end
7
+
8
+ add_index :c80_push_dealers_presets, [:dealer_id, :preset_id], name: 'too_long_push11'
9
+ add_index :c80_push_dealers_presets, [:preset_id, :dealer_id], name: 'too_long_push12'
10
+
11
+ end
12
+ end
@@ -1,3 +1,3 @@
1
1
  module C80Push
2
- VERSION = '0.1.0.2'
2
+ VERSION = '0.1.0.3'
3
3
  end
@@ -0,0 +1,20 @@
1
+ require 'rails/generators/base'
2
+ require 'rails/generators/resource_helpers'
3
+
4
+ module C80Push
5
+ module Generators
6
+ class InstallGenerator < Rails::Generators::Base
7
+ source_root File.expand_path('../templates', __FILE__)
8
+
9
+ def create_root_folder
10
+ # empty_directory 'app/helpers/c80_yax'
11
+ end
12
+
13
+ def copy_template_file
14
+ template 'seeds/c80_push_02_fill_presets.rb',
15
+ File.join('db/seeds', 'c80_push_02_fill_presets.rb')
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ # rake db:seed:c80_push_02_fill_presets
2
+
3
+ C80Push::Preset.delete_all
4
+ C80Push::Preset.create!([
5
+ {title:'blueDotIcon', color:'#1E98FF'},
6
+ {title:'redDotIcon', color:'#ED4543'},
7
+ {title:'darkOrangeDotIcon', color:'#E6761B'},
8
+ {title:'nightDotIcon', color:'#0E4779'},
9
+ {title:'darkBlueDotIcon', color:'#177BC9'},
10
+ {title:'pinkDotIcon', color:'#F371D1'},
11
+ {title:'grayDotIcon', color:'#B3B3B3'},
12
+ {title:'brownDotIcon', color:'#793D0E'},
13
+ {title:'darkGreenDotIcon', color:'#1BAD03'},
14
+ {title:'violetDotIcon', color:'#B51EFF'},
15
+ {title:'blackDotIcon', color:'#595959'},
16
+ {title:'yellowDotIcon', color:'#FFD21E'},
17
+ {title:'greenDotIcon', color:'#56DB40'},
18
+ {title:'orangeDotIcon', color:'#FF931E'},
19
+ {title:'lightBlueDotIcon', color:'#82CDFF'},
20
+ {title:'oliveDotIcon', color:'#97A100'}
21
+ ])
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: c80_push
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.2
4
+ version: 0.1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - C80609A
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-28 00:00:00.000000000 Z
11
+ date: 2017-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activeadmin
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: Добавляет функционал дилеров и офисов продаж
28
42
  email:
29
43
  - c080609a@gmail.com
@@ -49,6 +63,7 @@ files:
49
63
  - app/assets/javascripts/c80_push/lib_backend/init_select_picker.js
50
64
  - app/assets/javascripts/c80_push_backend.js.coffee
51
65
  - app/assets/stylesheets/c80_push.scss
66
+ - app/assets/stylesheets/c80_push/backend/dealer_preset_span.scss
52
67
  - app/assets/stylesheets/c80_push/c80_push_page_dealers/_layout.scss
53
68
  - app/assets/stylesheets/c80_push/c80_push_page_dealers/_style.scss
54
69
  - app/assets/stylesheets/c80_push/c80_push_page_dealers/map_dealers_list.scss
@@ -59,6 +74,7 @@ files:
59
74
  - app/models/c80_push/application_record.rb
60
75
  - app/models/c80_push/dealer.rb
61
76
  - app/models/c80_push/office.rb
77
+ - app/models/c80_push/preset.rb
62
78
  - app/models/c80_push/region.rb
63
79
  - app/views/c80_push/shared/_page_dealers.html.erb
64
80
  - app/views/c80_push/shared/_select_region.html.erb
@@ -72,9 +88,13 @@ files:
72
88
  - db/migrate/20170626125858_create_c80_push_regions.rb
73
89
  - db/migrate/20170626130000_create_c80_push_join_table_dealers_regions.rb
74
90
  - db/migrate/20170626130303_create_c80_push_join_table_offices_regions.rb
91
+ - db/migrate/20170630061313_create_c80_push_presets.rb
92
+ - db/migrate/20170630061515_create_c80_push_join_table_dealers_presets.rb
75
93
  - lib/c80_push.rb
76
94
  - lib/c80_push/engine.rb
77
95
  - lib/c80_push/version.rb
96
+ - lib/generators/c80_push/install_generator.rb
97
+ - lib/generators/c80_push/templates/seeds/c80_push_02_fill_presets.rb
78
98
  - lib/tasks/c80_push_tasks.rake
79
99
  homepage: https://github.com/c80609a/c80_push
80
100
  licenses: