c80_yax 0.1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +2 -0
- data/app/admin/c80_yax/items.rb +128 -0
- data/app/admin/c80_yax/prop_names.rb +90 -0
- data/app/admin/c80_yax/strsubcats.rb +128 -0
- data/app/admin/c80_yax/uoms.rb +35 -0
- data/app/admin/c80_yax/x_c80_yax.rb +5 -0
- data/app/assets/javascripts/backend/items.js +416 -0
- data/app/assets/javascripts/c80_yax.js.coffee +6 -0
- data/app/assets/javascripts/lib_backend/collapsable-groups.js +22 -0
- data/app/assets/javascripts/lib_backend/jalert.js +16 -0
- data/app/assets/stylesheets/c80_yax/backend/active_admin/admin_items.scss +152 -0
- data/app/assets/stylesheets/c80_yax/backend/collapsed.scss +56 -0
- data/app/assets/stylesheets/c80_yax/backend/jquery-my-dialog.scss +22 -0
- data/app/assets/stylesheets/c80_yax/lib/loading.scss +13 -0
- data/app/assets/stylesheets/c80_yax/mixins.scss +89 -0
- data/app/assets/stylesheets/c80_yax_backend.scss +7 -0
- data/app/controllers/c80_yax/admin_data_controller.rb +22 -0
- data/app/controllers/c80_yax/app_controller.rb +6 -0
- data/app/helpers/c80_yax/data_helper.rb +84 -0
- data/app/models/c80_yax/iphoto.rb +7 -0
- data/app/models/c80_yax/item.rb +169 -0
- data/app/models/c80_yax/item_prop.rb +83 -0
- data/app/models/c80_yax/prop.rb +5 -0
- data/app/models/c80_yax/prop_name.rb +32 -0
- data/app/models/c80_yax/strsubcat.rb +71 -0
- data/app/models/c80_yax/uom.rb +5 -0
- data/app/uploaders/c80_yax/iphoto_uploader.rb +41 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/c80_yax.gemspec +26 -0
- data/config/locales/ru.yml +52 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20161030061203_create_c80_yax_strsubcats.rb +12 -0
- data/db/migrate/20161030225354_create_c80_yax_items.rb +20 -0
- data/db/migrate/20161107202727_create_c80_yax_iphotos.rb +11 -0
- data/db/migrate/20161107210000_create_c80_yax_props.rb +15 -0
- data/db/migrate/20161108095505_create_c80_yax_uoms.rb +11 -0
- data/db/migrate/20161108095950_create_c80_yax_prop_names.rb +13 -0
- data/db/migrate/20161108100707_create_c80_yax_join_table_prop_names_strsubcats.rb +12 -0
- data/db/migrate/20161108102828_create_c80_yax_item_props.rb +13 -0
- data/db/seeds/c80_yax_01_fill_props.rb +11 -0
- data/lib/c80_yax/engine.rb +23 -0
- data/lib/c80_yax/version.rb +3 -0
- data/lib/c80_yax.rb +8 -0
- 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,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
|
+
}
|