c80_yax 0.1.0.1

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