c80_estate 0.1.0.30 → 0.1.0.31

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