c80_estate 0.1.0.30 → 0.1.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e3857fc46699fc58d3c711c7e401326e33ab30c4
4
- data.tar.gz: 372b4728b3864c02ac5f65c9251e668eea877bbe
3
+ metadata.gz: fab32649dd670b211fb2362cc860cd6de94322e5
4
+ data.tar.gz: c8a4986688706033bcd9ac5238ed39e56e8e3169
5
5
  SHA512:
6
- metadata.gz: 644c27549f9e4dd155869fcaacf5aa28e0ac0feb8feda0ecec90aa4d3bcfbf57a06c11a04905d4f2ae8a48c7e3c7d2f19e56e18b4fa110b4b45552d4e4bab4aa
7
- data.tar.gz: 37125ea18f0c041dd40475f370d12354128653d7fa18306411faf277477b7234b2ee07448362d5dfff6aa49166562a828156976b472b3e814e866fb0c15134ac
6
+ metadata.gz: a16049837e93cc0f89dfe085e30e763c447a29f8c4752ae5cc417a631ef1076e3c0c6ed3caa7af273d2d2254b485211d6b12e7aa7907a0083a8e8b08c84ddc43
7
+ data.tar.gz: 8f064118071720e7e47c0a61611c69449721b6fb6ab1401a3d5623540e5f3ed345f20e7e4c190f25f672876e91042b578e9033998316fe975defef30cdf05534
@@ -238,6 +238,10 @@ var fEdit = function () {
238
238
  var atype_id; // id подкатегории, которой принадлежит редактируемый предмет, извлекается из селекта $select_area_atype
239
239
  var $btn_add_area_prop; // кнопка "добавить свойство"
240
240
 
241
+ var init_price;
242
+ var init_price_area;
243
+ var init_square;
244
+
241
245
  // вернёт true, если найдёт в $item_props_container селект свойства atype_id
242
246
  var _fCheckSelect = function (atype_id) {
243
247
  var result = false;
@@ -250,6 +254,22 @@ var fEdit = function () {
250
254
  return result;
251
255
  };
252
256
 
257
+ // при входе на страницу - запомнить начальные значения
258
+ // они потом пригодятся если будем менять тип
259
+ var fGrabInitValues = function () {
260
+ init_price = $('ol.v_1').find('input[type=text]').addClass('highl').val();
261
+ init_price_area = $('ol.v_14').find('input[type=text]').addClass('highl').val();
262
+ init_square = $('ol.v_9').find('input[type=text]').addClass('highl').val();
263
+ };
264
+
265
+ // когда сменили тип, необходимо установить сохранённые значения
266
+ // в соотв. текстовые поля
267
+ var fSetInitValuesToInputs = function () {
268
+ $('ol.v_1').find('input[type=text]').val(init_price).addClass('highl');
269
+ $('ol.v_14').find('input[type=text]').val(init_price_area).addClass('highl');
270
+ $('ol.v_9').find('input[type=text]').val(init_square).addClass('highl');
271
+ };
272
+
253
273
  var fReqPropList = function (atype_id) {
254
274
  $.ajax({
255
275
  url: "/estate/get_atype_propnames",
@@ -361,6 +381,9 @@ var fEdit = function () {
361
381
  $fieldset.addClass('v_'+ielem["id"]);
362
382
  }
363
383
 
384
+ /*фиксируем начальные значения избранных свойств*/
385
+ fGrabInitValues();
386
+
364
387
  fLoadingHide();
365
388
 
366
389
  } else {
@@ -371,6 +394,152 @@ var fEdit = function () {
371
394
  });
372
395
  };
373
396
 
397
+ var fInitSelectListening = function () {
398
+
399
+ // допишем поясняющий текст "сначала выберите подкатегорию"
400
+ //var __fWelcomeTextAdd = function () {
401
+ // jsinit.$item_props_container_span.text("Характеристики [сначала выберите подкатегорию, тогда появятся свойства, присущие выбранной категории]");
402
+ //};
403
+ //
404
+ //удалим поясняющий текст "сначала выберите подкатегорию"
405
+ //var __fWelcomeTextRemove = function () {
406
+ // jsinit.$item_props_container_span.text("Характеристики");
407
+ //};
408
+
409
+ // удалим, возможно уже добавленные в форму, свойства
410
+ var __removeMayBeAddedProps = function () {
411
+ //$("a.has_many_remove").click();
412
+ $item_props_container.find('.inputs.has_many_fields').remove();
413
+ };
414
+
415
+ // запрашиваем список имён свойств указанной подкатегории
416
+ var __reqStrsubcatPropnames = function (atype_id) {
417
+ //jsinit._log("[_reqStrsubcatPropnames]: atype_id = " + atype_id);
418
+
419
+ $.ajax({
420
+ url: "/estate/get_atype_propnames",
421
+ data: { atype_id:atype_id },
422
+ dataType: "json",
423
+ type: 'POST'
424
+ }).done(function(data,result) {
425
+ //jsinit._log( data );
426
+
427
+ if (result == "success") {
428
+ console.log( "Кол-во свойств: " + data.length );
429
+
430
+ // удалим, возможно уже добавленные в форму, свойства
431
+ __removeMayBeAddedProps();
432
+ //return;
433
+
434
+ // количество свойств
435
+ var n = data.length;
436
+
437
+ // "цикловые" переменные
438
+ var $ifs, // fieldset,
439
+ $iselprop, // очередной селект "имя свойства"
440
+ $iinputprop, // очередной input "значение свойства"
441
+ $ifindbyid, // вспомогательная переменная: содержит результат поиска по id с помощью регулярки
442
+ ielem; // очередной элемент из data
443
+
444
+ for (var i=0; i<n; i++) {
445
+
446
+ // фиксируем объект с данными, описывающий свойство предмета
447
+ ielem = data[i];
448
+
449
+ // нажмём кнопку "Добавить Item prop"
450
+ $btn_add_area_prop.click();
451
+
452
+ // фиксируем добавленный в форму fieldset
453
+
454
+ //<fieldset class="inputs has_many_fields processed">
455
+ // <ol>
456
+ // <li id="area_item_props_attributes_37_prop_name_input">
457
+ // <select id="area_item_props_attributes_37_prop_name_id">
458
+ // <option value="37">Артикул</option>
459
+ // </select>
460
+ // </li>
461
+ // <li id="area_item_props_attributes_37_value_input">
462
+ // <input id="area_item_props_attributes_37_value" type="text">
463
+ // </li>
464
+ // </ol>
465
+ //</fieldset>
466
+
467
+ $ifs = $item_props_container.find("fieldset").not(".processed");
468
+ $ifs.addClass("processed");
469
+
470
+ $ifindbyid = $ifs.find('[id^="area_item_props_attributes_"]');
471
+
472
+ // находим в ifs селект, отвечающий за имя свойства
473
+ $iselprop = $ifindbyid.find('select');
474
+ //console.log(iselprop);
475
+
476
+ // находим в ifs input, отвечающий за значение свойства
477
+ $iinputprop = $ifindbyid.find('input');
478
+
479
+ // в этот селект жестоко предустанавливаем значение из data, дописываем единицу измерения
480
+ $iselprop.find("option")
481
+ .filter(function () {
482
+ //console.log($(this).val() + " vs " + ielem["id"]);
483
+ return $(this).val() == ielem["id"]; //return $(this).text() == ielem["title"];
484
+ })
485
+ .prop('selected', true)
486
+ .text(function () {
487
+ var t = $(this).text();
488
+ if (ielem["uom_title"] != null) {
489
+ t += ", " + ielem["uom_title"];
490
+ }
491
+ return t;
492
+ }); // дописываем в конец единицу измерения
493
+
494
+ //делаем его readonly
495
+ $iselprop.attr("disabled", true); // NOTE:: но в момент нажатия кнопки "Отправить" мы "разлачиваем" селект, чтобы параметры формы "правильно" отправлялись;
496
+
497
+ // в input "производитель" - ставим "-1" и прячем его от пользователя
498
+ //if (ielem["id"] == 36) {
499
+ // $iinputprop.val("-1");
500
+ // $ifs.css("display",'none');
501
+ //}
502
+ $ifs.find("> ol").addClass('v_' + ielem["id"]);
503
+ }
504
+
505
+ fLoadingHide();
506
+
507
+ fSetInitValuesToInputs();
508
+
509
+ } else {
510
+ alert( "done: не удалось получить данные о свойствах выбранной подкатегории." );
511
+ }
512
+
513
+ })
514
+ .fail(function(jqXHR, textStatus) {
515
+ alert( "fail: не удалось получить данные о свойствах выбранной подкатегории: " + textStatus );
516
+ })
517
+ .always(function() {
518
+ //alert( "complete" );
519
+ });
520
+ };
521
+
522
+ // слушает изменения селекта с типами
523
+ // инициирует запрос за "Именами Свойств" выбранного в селекте "Типа"
524
+ // показывает загрузчик
525
+ var __onSelectStrSubcatChange = function () {
526
+ var atype_id = $select_area_atype[0].value;
527
+ //console.log("[_onSelectStrSubcatChange]: atype_id = " + atype_id);
528
+ if (atype_id == '') {
529
+ __removeMayBeAddedProps();
530
+ //__fWelcomeTextAdd();
531
+ } else {
532
+ fLoadingShow();
533
+ __reqStrsubcatPropnames(atype_id);
534
+ //__fWelcomeTextRemove();
535
+ }
536
+ };
537
+
538
+ // начинаем слушать изменение селекта "тип" -
539
+ $select_area_atype.on("change", __onSelectStrSubcatChange);
540
+
541
+ };
542
+
374
543
  $(document).ready(function () {
375
544
 
376
545
  // инициализация
@@ -392,7 +561,7 @@ var fEdit = function () {
392
561
  $btn_add_area_prop = $item_props_container.find("a.has_many_add");
393
562
 
394
563
  // блокируем селект "тип"
395
- $select_area_atype.attr("disabled", true);
564
+ //$select_area_atype.attr("disabled", true);
396
565
 
397
566
  // блокируем селекты "свойства товара"
398
567
  $item_props_container.find("select").attr("disabled", true);
@@ -417,6 +586,8 @@ var fEdit = function () {
417
586
  }
418
587
  });
419
588
 
589
+ fInitSelectListening();
590
+
420
591
  });
421
592
 
422
593
  fLoadingShow();
@@ -119,14 +119,6 @@ body.admin_areas {
119
119
  box-shadow: none !important;
120
120
  }
121
121
 
122
- ol.v_1, ol.v_9, ol.v_14 {
123
- li.input.optional {
124
- input {
125
- background-color: rgba(255, 200, 127, 0.26) !important;
126
- }
127
- }
128
- }
129
-
130
122
  }
131
123
 
132
124
  }
@@ -31,6 +31,7 @@ module C80Estate
31
31
  validate :has_astatus?
32
32
 
33
33
  after_create :create_initial_sevent
34
+ after_update :check_and_remove_item_props, :if => :atype_id_changed?
34
35
  after_update :check_and_generate_sevent
35
36
 
36
37
  def self.all_areas
@@ -473,6 +474,15 @@ module C80Estate
473
474
 
474
475
  end
475
476
 
477
+ def check_and_remove_item_props
478
+ Rails.logger.debug '<check_and_remove_item_props> BEGIN'
479
+
480
+ clean_unrelated_item_props
481
+ clean_duplicated_item_props
482
+
483
+ Rails.logger.debug '<check_and_remove_item_props> END'
484
+ end
485
+
476
486
  private
477
487
 
478
488
  def self.open_spreadsheet(file)
@@ -486,5 +496,60 @@ module C80Estate
486
496
  end
487
497
  end
488
498
 
499
+ def clean_unrelated_item_props
500
+ # item_props = [ {area,prop_name} ]
501
+ # item_props.delete_all
502
+
503
+ # на этом этапе в запись уже помещены данные о новых свойствах
504
+ # тут необходимо пройтись по свойствам, выбрать те, которые не присущи новому типу,
505
+ # и удалить их
506
+
507
+ # находим PropNames присущие Типу
508
+ atype_prop_names = Atype.get_propnames(atype.id)
509
+ # [ {"id"=>37, "title"=>"Артикул", "is_excluded_from_filtering"=>1, "uom_title"=>nil},... ]
510
+
511
+ # составляем массив айдишников
512
+ atype_prop_names_ids = []
513
+ atype_prop_names.each do |prop_name|
514
+ # Rails.logger.debug "<clean_unrelated_item_props> prop_name = #{prop_name}"
515
+ # begin
516
+ atype_prop_names_ids << prop_name['id'].to_i
517
+ # rescue => e
518
+ # Rails.logger.debug "<clean_unrelated_item_props> [ERROR]: #{e}"
519
+ # end
520
+
521
+ end
522
+ # Rails.logger.debug "<clean_unrelated_item_props> atype_prop_names_ids = #{atype_prop_names_ids}"
523
+
524
+ # теперь обходим Item Props
525
+ # если айдишника PropName очередного ItemProp нет в списке PropNames присущих Типу,
526
+ # удаляем это ItemProp
527
+ item_props.each do |item_prop|
528
+ # Rails.logger.debug "<clean_unrelated_item_props> item_prop.prop_name.id = #{item_prop.prop_name.id}"
529
+ unless atype_prop_names_ids.include?(item_prop.prop_name.id.to_i)
530
+ Rails.logger.debug "<clean_unrelated_item_props> Удаляем '#{item_prop.prop_name.title}' из площади типа '#{atype.title}'."
531
+ item_prop.destroy
532
+ end
533
+ end
534
+
535
+ end
536
+
537
+ def clean_duplicated_item_props
538
+ # удаляем дубликаты
539
+ Rails.logger.debug "<clean_dublicated_item_props>"
540
+ item_props.each do |item_prop|
541
+ duplicates = item_props
542
+ .where(area_id: item_prop.area_id)
543
+ .where(prop_name_id: item_prop.prop_name_id)
544
+ .where.not(id: item_prop.id)
545
+ Rails.logger.debug "<clean_dublicated_item_props> #{item_prop.prop_name.title}: dublicates.count = #{duplicates.count}"
546
+
547
+ if duplicates.count > 0
548
+ Rails.logger.debug "<clean_dublicated_item_props> delete '#{item_prop.prop_name.title}', val: #{item_prop.value}"
549
+ duplicates.delete_all
550
+ end
551
+ end
552
+ end
553
+
489
554
  end
490
555
  end
@@ -7,6 +7,13 @@ module C80Estate
7
7
 
8
8
  before_save :before_save_format_value
9
9
 
10
+ def save(*args)
11
+ super
12
+ rescue ActiveRecord::RecordNotUnique => error
13
+ # post.errors[:base] << "You can only have one photo be your header photo"
14
+ false
15
+ end
16
+
10
17
  def self.all_uniq_values(prop_name_id)
11
18
  r = self.where(prop_name_id: prop_name_id)
12
19
  .map { |ip| ip.value.to_i }.uniq
@@ -1,3 +1,3 @@
1
1
  module C80Estate
2
- VERSION = '0.1.0.30'
2
+ VERSION = '0.1.0.31'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: c80_estate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.30
4
+ version: 0.1.0.31
5
5
  platform: ruby
6
6
  authors:
7
7
  - C80609A
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-08-05 00:00:00.000000000 Z
11
+ date: 2016-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler