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 +4 -4
- data/app/assets/javascript/c80_estate/backend/admin/src/areas.js +172 -1
- data/app/assets/stylesheets/c80_estate/backend/admin_areas.scss +0 -8
- data/app/models/c80_estate/area.rb +65 -0
- data/app/models/c80_estate/item_prop.rb +7 -0
- data/lib/c80_estate/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fab32649dd670b211fb2362cc860cd6de94322e5
|
|
4
|
+
data.tar.gz: c8a4986688706033bcd9ac5238ed39e56e8e3169
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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();
|
|
@@ -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
|
data/lib/c80_estate/version.rb
CHANGED
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.
|
|
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-
|
|
11
|
+
date: 2016-08-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|