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