c80_yax 0.1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/CODE_OF_CONDUCT.md +49 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +41 -0
  7. data/Rakefile +2 -0
  8. data/app/admin/c80_yax/items.rb +128 -0
  9. data/app/admin/c80_yax/prop_names.rb +90 -0
  10. data/app/admin/c80_yax/strsubcats.rb +128 -0
  11. data/app/admin/c80_yax/uoms.rb +35 -0
  12. data/app/admin/c80_yax/x_c80_yax.rb +5 -0
  13. data/app/assets/javascripts/backend/items.js +416 -0
  14. data/app/assets/javascripts/c80_yax.js.coffee +6 -0
  15. data/app/assets/javascripts/lib_backend/collapsable-groups.js +22 -0
  16. data/app/assets/javascripts/lib_backend/jalert.js +16 -0
  17. data/app/assets/stylesheets/c80_yax/backend/active_admin/admin_items.scss +152 -0
  18. data/app/assets/stylesheets/c80_yax/backend/collapsed.scss +56 -0
  19. data/app/assets/stylesheets/c80_yax/backend/jquery-my-dialog.scss +22 -0
  20. data/app/assets/stylesheets/c80_yax/lib/loading.scss +13 -0
  21. data/app/assets/stylesheets/c80_yax/mixins.scss +89 -0
  22. data/app/assets/stylesheets/c80_yax_backend.scss +7 -0
  23. data/app/controllers/c80_yax/admin_data_controller.rb +22 -0
  24. data/app/controllers/c80_yax/app_controller.rb +6 -0
  25. data/app/helpers/c80_yax/data_helper.rb +84 -0
  26. data/app/models/c80_yax/iphoto.rb +7 -0
  27. data/app/models/c80_yax/item.rb +169 -0
  28. data/app/models/c80_yax/item_prop.rb +83 -0
  29. data/app/models/c80_yax/prop.rb +5 -0
  30. data/app/models/c80_yax/prop_name.rb +32 -0
  31. data/app/models/c80_yax/strsubcat.rb +71 -0
  32. data/app/models/c80_yax/uom.rb +5 -0
  33. data/app/uploaders/c80_yax/iphoto_uploader.rb +41 -0
  34. data/bin/console +14 -0
  35. data/bin/setup +8 -0
  36. data/c80_yax.gemspec +26 -0
  37. data/config/locales/ru.yml +52 -0
  38. data/config/routes.rb +3 -0
  39. data/db/migrate/20161030061203_create_c80_yax_strsubcats.rb +12 -0
  40. data/db/migrate/20161030225354_create_c80_yax_items.rb +20 -0
  41. data/db/migrate/20161107202727_create_c80_yax_iphotos.rb +11 -0
  42. data/db/migrate/20161107210000_create_c80_yax_props.rb +15 -0
  43. data/db/migrate/20161108095505_create_c80_yax_uoms.rb +11 -0
  44. data/db/migrate/20161108095950_create_c80_yax_prop_names.rb +13 -0
  45. data/db/migrate/20161108100707_create_c80_yax_join_table_prop_names_strsubcats.rb +12 -0
  46. data/db/migrate/20161108102828_create_c80_yax_item_props.rb +13 -0
  47. data/db/seeds/c80_yax_01_fill_props.rb +11 -0
  48. data/lib/c80_yax/engine.rb +23 -0
  49. data/lib/c80_yax/version.rb +3 -0
  50. data/lib/c80_yax.rb +8 -0
  51. metadata +135 -0
@@ -0,0 +1,416 @@
1
+ "use strict";
2
+
3
+ var fCheckItemProperties = function () {
4
+
5
+ var result = true;
6
+
7
+ if ($("input#item_title").val().length == 0) {
8
+ jAlert('Укажите название.');
9
+ result = false;
10
+ }
11
+
12
+ if ($("select#item_strsubcat_id").val() == "") {
13
+ jAlert('Укажите подкатегорию.');
14
+ result = false;
15
+ }
16
+
17
+ var item_props_input_list = $("li.item_props").find("input");
18
+ var inputs_count = item_props_input_list.length;
19
+
20
+ if (inputs_count == 0) {
21
+ result = false;
22
+ jAlert('Не получится создать товар без характеристик.');
23
+ } else {
24
+ item_props_input_list.each(function () {
25
+ if ($(this).val() != '') {
26
+ inputs_count--;
27
+ }
28
+ });
29
+ if (inputs_count > 0) {
30
+ result = false;
31
+ jAlert('Заполните все характеристики товара.');
32
+ }
33
+ }
34
+
35
+
36
+
37
+ return result;
38
+ };
39
+
40
+ var jsinit = {
41
+
42
+ _debug:true,
43
+ $select_strsubcat: null,
44
+ $btn_add_item_prop: null, // кнопка "Добавить "
45
+ $item_props_container: null, // в этом контейнере живут fieldset-ы, каждый из которых соответствует одному свойству предмета
46
+ $item_props_container_span: null, // заголовок контейнера, в котором живут fieldset-ы свойств предмета
47
+
48
+ // допишем поясняющий текст "сначала выберите подкатегорию"
49
+ _fWelcomeTextAdd: function () {
50
+ jsinit.$item_props_container_span.text("Характеристики [сначала выберите подкатегорию, тогда появятся свойства, присущие выбранной категории]");
51
+ },
52
+
53
+ // удалим поясняющий текст "сначала выберите подкатегорию"
54
+ _fWelcomeTextRemove: function () {
55
+ jsinit.$item_props_container_span.text("Характеристики");
56
+ },
57
+
58
+ go: function () {
59
+ //jsinit._log("[go]");
60
+
61
+ jsinit.$select_strsubcat = $("select#item_strsubcat_id");
62
+ jsinit.$item_props_container = $("li.item_props");
63
+ jsinit.$item_props_container_span = jsinit.$item_props_container.parent().parent().find("> legend > span");
64
+ jsinit.$btn_add_item_prop = jsinit.$item_props_container.find("a.has_many_add");
65
+ jsinit.$btn_submin = $("fieldset.actions").find("input[name=commit]");
66
+
67
+ //jsinit.$btn_add_item_prop.css("display","none"); // прячем сразу кнопку "Добавить Item prop"
68
+ jsinit.$select_strsubcat.on("change", jsinit._onSelectStrSubcatChange);
69
+ jsinit._onSelectStrSubcatChange();
70
+
71
+ // в момент нажатия кнопки "отправить" - "разлачиваем" все селекты
72
+ jsinit.$btn_submin.click(function (e) {
73
+ if (fCheckItemProperties()) {
74
+ jsinit.$item_props_container.find("select").attr("disabled", false);
75
+ fLoadingShow();
76
+ } else {
77
+ e.preventDefault();
78
+ }
79
+ });
80
+
81
+ // пока пользователь не выбрал подкатегорию - допишем поясняющий текст "сначала выберите подкатегорию"
82
+ jsinit._fWelcomeTextAdd();
83
+
84
+ },
85
+
86
+ // слушает изменения селекта с подкатегориями
87
+ _onSelectStrSubcatChange: function () {
88
+ var strsubcat_id = jsinit.$select_strsubcat[0].value;
89
+ //jsinit._log("[_onSelectStrSubcatChange]: strsubcat_id = " + strsubcat_id);
90
+ if (strsubcat_id == '') {
91
+ jsinit._removeMayBeAddedProps();
92
+ jsinit._fWelcomeTextAdd();
93
+ } else {
94
+ fLoadingShow();
95
+ jsinit._reqStrsubcatPropnames(strsubcat_id);
96
+ jsinit._fWelcomeTextRemove();
97
+ }
98
+ },
99
+
100
+ // запрашиваем список имён свойств указанной подкатегории
101
+ _reqStrsubcatPropnames: function (strsubcat_id) {
102
+ //jsinit._log("[_reqStrsubcatPropnames]: strsubcat_id = " + strsubcat_id);
103
+
104
+ $.ajax({
105
+ url: "/admin_data_get_strsubcat_propnames",
106
+ data: { strsubcat_id:strsubcat_id },
107
+ dataType: "json",
108
+ type: 'POST'
109
+ }).done(function(data,result) {
110
+ //jsinit._log( data );
111
+
112
+ if (result == "success") {
113
+ jsinit._log( "Кол-во свойств: " + data.length );
114
+
115
+ // удалим, возможно уже добавленные в форму, свойства
116
+ jsinit._removeMayBeAddedProps();
117
+
118
+ // количество свойств
119
+ var n = data.length;
120
+
121
+ // "цикловые" переменные
122
+ var $ifs, // fieldset,
123
+ $iselprop, // очередной селект "имя свойства"
124
+ $iinputprop, // очередной input "значение свойства"
125
+ $ifindbyid, // вспомогательная переменная: содержит результат поиска по id с помощью регулярки
126
+ ielem; // очередной элемент из data
127
+
128
+ for (var i=0; i<n; i++) {
129
+
130
+ // фиксируем объект с данными, описывающий свойство предмета
131
+ ielem = data[i];
132
+
133
+ // нажмём кнопку "Добавить Item prop"
134
+ jsinit.$btn_add_item_prop.click();
135
+
136
+ // фиксируем добавленный в форму fieldset
137
+
138
+ //<fieldset class="inputs has_many_fields processed">
139
+ // <ol>
140
+ // <li id="item_item_props_attributes_37_prop_name_input">
141
+ // <select id="item_item_props_attributes_37_prop_name_id">
142
+ // <option value="37">Артикул</option>
143
+ // </select>
144
+ // </li>
145
+ // <li id="item_item_props_attributes_37_value_input">
146
+ // <input id="item_item_props_attributes_37_value" type="text">
147
+ // </li>
148
+ // </ol>
149
+ //</fieldset>
150
+
151
+ $ifs = jsinit.$item_props_container.find("fieldset").not(".processed");
152
+ $ifs.addClass("processed");
153
+
154
+ $ifindbyid = $ifs.find('[id^="item_item_props_attributes_"]');
155
+
156
+ // находим в ifs селект, отвечающий за имя свойства
157
+ $iselprop = $ifindbyid.find('select');
158
+ //console.log(iselprop);
159
+
160
+ // находим в ifs input, отвечающий за значение свойства
161
+ $iinputprop = $ifindbyid.find('input');
162
+
163
+ // в этот селект жестоко предустанавливаем значение из data, дописываем единицу измерения
164
+ $iselprop.find("option")
165
+ .filter(function () {
166
+ //console.log($(this).val() + " vs " + ielem["id"]);
167
+ return $(this).val() == ielem["id"]; //return $(this).text() == ielem["title"];
168
+ })
169
+ .prop('selected', true)
170
+ .text(function () {
171
+ var t = $(this).text();
172
+ if (ielem["uom_title"] != null) {
173
+ t += ", " + ielem["uom_title"];
174
+ }
175
+ return t;
176
+ }); // дописываем в конец единицу измерения
177
+
178
+ //делаем его readonly
179
+ $iselprop.attr("disabled", true); // NOTE:: но в момент нажатия кнопки "Отправить" мы "разлачиваем" селект, чтобы параметры формы "правильно" отправлялись;
180
+
181
+ // в input "бренд" - ставим "-1" и прячем его от пользователя
182
+ if (ielem["id"] == 36) {
183
+ $iinputprop.val("-1");
184
+ $ifs.css("display",'none');
185
+ }
186
+
187
+ }
188
+
189
+ fLoadingHide();
190
+
191
+ } else {
192
+ alert( "done: не удалось получить данные о свойствах выбранной подкатегории." );
193
+ }
194
+
195
+ })
196
+ .fail(function(jqXHR, textStatus) {
197
+ alert( "fail: не удалось получить данные о свойствах выбранной подкатегории: " + textStatus );
198
+ })
199
+ .always(function() {
200
+ //alert( "complete" );
201
+ });
202
+ },
203
+
204
+ // удалим, возможно уже добавленные в форму, свойства
205
+ _removeMayBeAddedProps: function () {
206
+ $("a.has_many_remove").click();
207
+ },
208
+
209
+ _log: function () {
210
+ if (jsinit._debug) {
211
+ //console.log(arguments[0]);
212
+ }
213
+ }
214
+
215
+ };
216
+
217
+ var fEdit = function () {
218
+
219
+ var $select_item_strsubcat; // селект подкатегории, которой принадлежит редактируемый предмет
220
+ var $item_props_container; // здесь живут селекты свойств
221
+ var $btn_submit;
222
+ var strsubcat_id; // id подкатегории, которой принадлежит редактируемый предмет, извлекается из селекта $select_item_strsubcat
223
+ var $btn_add_item_prop; // кнопка "добавить свойство"
224
+
225
+ // вернёт true, если найдёт в $item_props_container селект свойства strsubcat_id
226
+ var _fCheckSelect = function (strsubcat_id) {
227
+ var result = false;
228
+ var $selects = $item_props_container.find("fieldset").find('select');
229
+ $selects.each(function () {
230
+ if ($(this).val() == strsubcat_id) {
231
+ result = true;
232
+ }
233
+ });
234
+ return result;
235
+ };
236
+
237
+ var fReqPropList = function (strsubcat_id) {
238
+ $.ajax({
239
+ url: "/admin_data_get_strsubcat_propnames",
240
+ data: { strsubcat_id:strsubcat_id },
241
+ dataType: "json",
242
+ type: 'POST'
243
+ }).done(function (data,result) {
244
+ //data - это список свойств, которые должны быть у предмета
245
+ if (result == "success") {
246
+
247
+ /* обходим data, ищем соответствующие селекты,
248
+ * по ходу формируем список toAdd - индексы массива data
249
+ * отсутствующих свойств. Затем обрабатываем
250
+ * получившийся список и добавляем отсутствующие селекты. */
251
+
252
+ var toAdd = [];
253
+
254
+ // количество свойств
255
+ var n = data.length;
256
+
257
+ var ielem;
258
+
259
+ // обходим список свойств, которые должны быть у предмета
260
+ // и выясняем, кто отсутствует в форме
261
+ for (var i=0; i<n; i++) {
262
+
263
+ // фиксируем объект с данными
264
+ ielem = data[i];
265
+
266
+ // если такой селекта нет в форме - запомним id свойства
267
+ if (_fCheckSelect(ielem["id"])) {
268
+
269
+ } else {
270
+ toAdd.push(i);
271
+ }
272
+ }
273
+
274
+ var $ifs, $iselprop;
275
+
276
+ // теперь добавляем отсутствующие селекты
277
+ n = toAdd.length;
278
+ for (i = 0; i<n; i++) {
279
+ ielem = data[ toAdd[i] ];
280
+
281
+ // нажмём кнопку "Добавить Item prop"
282
+ $btn_add_item_prop.click();
283
+
284
+ // фиксируем добавленный в форму fieldset
285
+ $ifs = $item_props_container.find("fieldset").not(".was_before");
286
+ $ifs.addClass("was_before");
287
+
288
+ // находим в ifs селект, отвечающий за имя свойства
289
+ $iselprop = $ifs.find('[id^="item_item_props_attributes_"]').find('select');
290
+
291
+ // в этот селект жестоко предустанавливаем значение из data и делаем его readonly
292
+ $iselprop.find("option").filter(function () {
293
+ //console.log(this);
294
+ return $(this).val() == ielem["id"]; //return $(this).text() == ielem["title"];
295
+ }).prop('selected', true);
296
+ $iselprop.attr("disabled", true); // NOTE:: но в момент нажатия кнопки "Отправить" мы "разлачиваем" селект, чтобы параметры формы "правильно" отправлялись
297
+
298
+ }
299
+
300
+ /*дописываем единицы измерения всем селектам*/
301
+
302
+ // перед циклом: фиксируем все fieldset
303
+ $ifs = $item_props_container.find("fieldset");
304
+
305
+ // перед циклом: фиксируем все интерактивные элементы с таким id
306
+ var $ifindbyid = $ifs.find('[id^="item_item_props_attributes_"]');
307
+ $iselprop = $ifindbyid.find('select');
308
+
309
+ n = data.length;
310
+ for (i = 0; i<n; i++) {
311
+ ielem = data[i];
312
+
313
+ // находим селект, отвечающий за имя свойства и дописываем единицу измерения
314
+ $iselprop.find("option").filter(function () {
315
+ //console.log(this);
316
+ return $(this).val() == ielem["id"]; //return $(this).text() == ielem["title"];
317
+ }).text(function () {
318
+ var t = $(this).text();
319
+ if (ielem["uom_title"] != null) {
320
+ t += ", " + ielem["uom_title"]
321
+ }
322
+ return t;
323
+ });
324
+
325
+ // в input "бренд" - ставим "-1" и прячем весь fieldset от пользователя
326
+ if (ielem["id"] == 36) {
327
+ // находим опцию id=36 селекта "имя свойства"
328
+ var $opt = $iselprop.find("option").filter(function () {
329
+ var $t = $(this);
330
+ return $t.val() == 36 && $t.prop('selected');
331
+ });
332
+ // из этой опции добираемся до fieldset, который её содержит
333
+ var $fieldset = $opt.parent().parent().parent();
334
+ // а затем уже находим input
335
+ $fieldset.find("input").val("-1");
336
+ // прячем
337
+ $fieldset.css('display','none');
338
+
339
+ }
340
+
341
+ }
342
+
343
+ fLoadingHide();
344
+
345
+ } else {
346
+ alert( "done: не удалось получить данные о свойствах выбранной подкатегории." );
347
+ }
348
+ }).fail(function(jqXHR, textStatus) {
349
+ alert( "fail: не удалось получить данные о свойствах выбранной подкатегории: " + textStatus );
350
+ });
351
+ };
352
+
353
+ $(document).ready(function () {
354
+
355
+ // инициализация
356
+ $select_item_strsubcat = $('select#item_strsubcat_id');
357
+ $btn_submit = $("fieldset.actions").find("input[name=commit]");
358
+ $item_props_container = $("li.item_props");
359
+ strsubcat_id = $select_item_strsubcat[0].value;
360
+ $btn_add_item_prop = $item_props_container.find("a.has_many_add");
361
+
362
+ // блокируем селект "подкатегория"
363
+ $select_item_strsubcat.attr("disabled", true);
364
+
365
+ // блокируем селекты "свойства товара"
366
+ $item_props_container.find("select").attr("disabled", true);
367
+
368
+ // отмечаем уже имеющиеся fieldsets
369
+ $item_props_container.find("fieldset").each(function () {
370
+ $(this).addClass("was_before");
371
+ });
372
+
373
+ //совершаем запрос за свойствами, которые присущи данной подкатегории
374
+ fReqPropList(strsubcat_id);
375
+
376
+ // в момент нажатия кнопки "отправить" - "разлачиваем" все селекты
377
+ // и добавляем модальный предзагрузчик
378
+ $btn_submit.click(function (e) {
379
+ if (fCheckItemProperties()) {
380
+ $item_props_container.find("select").attr("disabled", false);
381
+ fLoadingShow();
382
+ //e.preventDefault(); // for debug
383
+ } else {
384
+ e.preventDefault();
385
+ }
386
+ });
387
+
388
+ var $link_dub_item = $('.dublicate_item');
389
+ var item_id = window.location.href.split('/items/')[1].split('/edit')[0]; // localhost:3000/admin/items/19/edit
390
+ $link_dub_item.data('item-id',item_id);
391
+ $link_dub_item.click(function (e) {
392
+
393
+ e.preventDefault();
394
+ fLoadingShow();
395
+
396
+ $.ajax({
397
+ url: '/dublicate_item',
398
+ type: 'POST',
399
+ data: {
400
+ item_id: item_id
401
+ },
402
+ dataType: 'script'
403
+ })
404
+
405
+ });
406
+
407
+ });
408
+
409
+ fLoadingShow();
410
+ };
411
+
412
+ YOUR_APP.items = {
413
+ edit: fEdit,
414
+ "new": jsinit.go//,
415
+ //create: jsinit.go
416
+ };
@@ -0,0 +1,6 @@
1
+
2
+ #= require lib_backend/collapsable-groups
3
+ #= require lib_backend/jalert
4
+
5
+ # require ./backend/init # это должно быть включено в host app
6
+ #= require_tree ./backend
@@ -0,0 +1,22 @@
1
+ var fHandleClickCollapsed = function () {
2
+ $(document).ready(function () {
3
+ $('.collapsed legend').bind('click', function (e) {
4
+
5
+ // на тот случай, если внутрь легенды положена ссылка "например" и кликнули по этой ссылке
6
+ if ($(e.target).attr('href') != undefined) return;
7
+
8
+ var $tp = $(this).parent();
9
+ var $t = $tp.find("ol");
10
+
11
+ if ($t.css('display') == 'none') {
12
+ $t.css('display', 'block');
13
+ $tp.addClass('shown');
14
+ } else {
15
+ $t.css('display', 'none');
16
+ $tp.removeClass('shown');
17
+ }
18
+
19
+ });
20
+ });
21
+ };
22
+ fHandleClickCollapsed();
@@ -0,0 +1,16 @@
1
+
2
+ var jAlert = function (message) {
3
+ $('<div id="dialog" class="my-dialog" title="Ошибка"><p>'+message+'</p></div>').dialog({
4
+ dialogClass: "no-close",
5
+ modal: true,
6
+ buttons: [
7
+ {
8
+ text: "OK",
9
+ buttonClass: 'nn',
10
+ click: function() {
11
+ $( this ).dialog( "close" );
12
+ }
13
+ }
14
+ ]
15
+ });
16
+ };
@@ -0,0 +1,152 @@
1
+ //---[ товары ]---------------------------------------------------------------------------------------------------------
2
+
3
+ body.admin_items {
4
+ &.edit, &.new, &.create { // create появляется только тогда, когда есть ошибка в создаваемом продукте
5
+
6
+ // здесь живут фото товара
7
+ li.iphotos.has_many_container {
8
+ @include clearfx;
9
+ padding-left: 20%;
10
+ margin-bottom: 15px;
11
+
12
+ h3 { display: none; }
13
+
14
+ // блок с фоткой, кнопкой "удалить", file-инпутом
15
+ fieldset.inputs.has_many_fields {
16
+ display: inline-block;
17
+ margin-right: 15px;
18
+ float: left;
19
+ position: relative;
20
+ background-color: transparent;
21
+ @include shdw(0.0);
22
+
23
+ ol {
24
+ li {
25
+
26
+ &.file {
27
+ padding-bottom: 0;
28
+ }
29
+
30
+ &.has_many_delete {
31
+ padding-top: 0;
32
+ }
33
+
34
+ label {
35
+ padding: 0;
36
+ &.label {
37
+ display: none;
38
+ }
39
+ }
40
+
41
+ input[type=file] {
42
+ width: 200px;
43
+ overflow: hidden;
44
+ }
45
+
46
+ p.inline-hints {
47
+ margin: 0 !important;
48
+ }
49
+
50
+ }
51
+ }
52
+ }
53
+
54
+ a.button.has_many_add {
55
+ clear: both;
56
+ float: left;
57
+ display: block;
58
+ position: relative;
59
+ }
60
+
61
+ }
62
+
63
+ // в этом контейнере живут fieldset-ы, каждый из которых соответствует одному свойству предмета
64
+ li.item_props.has_many_container {
65
+ padding-top: 0;
66
+ padding-left: 0 !important;
67
+ padding-right: 0 !important;
68
+
69
+ // прячем h3
70
+ h3 {
71
+ display: none;
72
+ }
73
+ // прячем сразу кнопку "Добавить Item prop"
74
+ a.has_many_add {
75
+ display: none;
76
+ }
77
+ // прячем кнопку "убрать свойство"
78
+ a.has_many_remove {
79
+ display: none;
80
+ }
81
+
82
+ // приводим в табличный вид внешний вид
83
+ fieldset.inputs.has_many_fields {
84
+ margin: 0;
85
+ padding-left: 20%;
86
+ @include shdw(0.0);
87
+ border: none;
88
+ border-radius: 0;
89
+
90
+ // прячем лейблы
91
+ label {
92
+ display: none;
93
+ }
94
+
95
+ li.select, li.input {
96
+ float: left;
97
+ padding: 3px;
98
+ clear: none !important;
99
+ }
100
+
101
+ /* Здесь живут PropNames: Объём, Цена... */
102
+ select {
103
+ text-align: right;
104
+ float: left;
105
+ width: 100%;
106
+
107
+ &:disabled {
108
+ color: #4C4C4C;
109
+ }
110
+ }
111
+
112
+ /* Здесь живут значения PropNames - пользователь может изменить их */
113
+ input {
114
+ float: left;
115
+ width: 400px !important;
116
+ }
117
+
118
+ }
119
+
120
+ }
121
+
122
+ /*стилизуем чекбоксы*/
123
+ form fieldset > ol > li.boolean {
124
+ height: auto;
125
+
126
+ &#item_is_main_input {
127
+ }
128
+
129
+ &#item_is_sale_input {
130
+ }
131
+
132
+ label {
133
+ font-weight: bold;
134
+ color: #5E6469;
135
+ }
136
+
137
+ }
138
+
139
+ /*p.inline-hints {
140
+ color: #74b1b2;
141
+ padding-left: 50px;
142
+ }*/
143
+
144
+ // спрячем артефакты: ненужные legend.label
145
+ // li#item_galleries_input {
146
+ // fieldset.choices {
147
+ // legend.label { display:none; }
148
+ // }
149
+ // }
150
+
151
+ }
152
+ }
@@ -0,0 +1,56 @@
1
+ .collapsed {
2
+ cursor: pointer;
3
+
4
+ legend {
5
+ position: relative;
6
+
7
+ > span {
8
+ padding-left: 25px;
9
+ }
10
+
11
+ &:after {
12
+ position: absolute;
13
+ top: 6px;
14
+ left: 10px;
15
+ color: #959595;
16
+
17
+ text-transform: uppercase;
18
+ font-size: 12px;
19
+ font-family: FontAwesome;
20
+ font-style: normal;
21
+ font-weight: normal;
22
+ content: '\f138';
23
+ }
24
+ }
25
+
26
+ ol {
27
+ display: none;
28
+ > li {
29
+ > fieldset.choices {
30
+ > legend.label {
31
+ opacity: 0;
32
+ }
33
+ }
34
+ }
35
+ }
36
+
37
+ &.shown {
38
+ legend {
39
+ &:after {
40
+ content: '\f13a';
41
+ }
42
+ }
43
+ }
44
+
45
+ &:hover {
46
+ legend {
47
+ span {
48
+ color:black;
49
+ }
50
+ &:after {
51
+ color: black;
52
+ }
53
+ }
54
+ }
55
+
56
+ }
@@ -0,0 +1,22 @@
1
+ .no-close .ui-dialog-titlebar-close {
2
+ display: none;
3
+ }
4
+
5
+ .my-dialog {
6
+ height: 50px !important;
7
+ p {
8
+ padding: 5px 10px 3px;
9
+ font-size: 15px;
10
+ color: #ac0000;
11
+ font-weight: bold;
12
+ text-align: center;
13
+ }
14
+ }
15
+
16
+ body.admin_items.edit {
17
+ .ui-dialog .ui-dialog-buttonpane button:last-child {
18
+ display: block;
19
+ margin: 0 auto;
20
+ }
21
+
22
+ }