From 6c6f6b3352fc442a283c6045bef3378b9eaf1041 Mon Sep 17 00:00:00 2001 From: Repellent Date: Mon, 16 Mar 2026 23:42:32 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=8F=D0=BC=20=D0=98=D0=B7?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=81=D0=BA=D0=B0=D0=B4=20=D0=B8=20=D0=9C=D0=B5=D0=B3?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B8=D0=B7=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=BE=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=D0=BC=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20=D0=B8=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BA=D0=B0=D0=BC=20/=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/templates/css/main.css | 4 +-- fields/image_cascade/lang/ru.txt | 8 ++++- fields/image_cascade/tpl/field.tpl | 45 +++++++++++++++++++++++++-- fields/image_mega/lang/ru.txt | 8 ++++- fields/image_mega/tpl/field.tpl | 49 ++++++++++++++++++++++++++++-- 5 files changed, 104 insertions(+), 10 deletions(-) diff --git a/admin/templates/css/main.css b/admin/templates/css/main.css index 20db152..a691d2f 100644 --- a/admin/templates/css/main.css +++ b/admin/templates/css/main.css @@ -375,8 +375,8 @@ input, textarea { box-sizing:border-box; } .blackBtn:hover { background-position: 0 -25px; } .blackBtn:active { background-position: 0 -50px; } -.greyishBtn { background: url(../images/ui/greyishBtn.png) repeat-x 0 0; border: 1px solid #4f5a68; color: #fff; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454; } -.greyishBtn:hover { background-position: 0 -25px; } +.greyishBtn { background: url(../images/ui/greyishBtn.png) repeat-x 0 0; border: 1px solid #4f5a68; color: #F0F0F0 !important; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454; } +.greyishBtn:hover { background-position: 0 -25px; color: #FFF !important; } .greyishBtn:active { background-position: 0 -50px; } .greenBtn { background: url(../images/ui/greenBtn.png) repeat-x 0 0; border: 1px solid #418d4f; color: #fff; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454; } diff --git a/fields/image_cascade/lang/ru.txt b/fields/image_cascade/lang/ru.txt index f74e7c3..4bc047c 100644 --- a/fields/image_cascade/lang/ru.txt +++ b/fields/image_cascade/lang/ru.txt @@ -24,4 +24,10 @@ resp_m_m = "Кол-во загружаемых файлов превышает resp_m_h = "Ошибка" max_f_f = "Макимальное кол-во загружаемых файлов: " max_f_h = "Ошибка" -max_f_t = "Превышено максимальное число файлов,
для одновременной загрузки" \ No newline at end of file +max_f_t = "Превышено максимальное число файлов,
для одновременной загрузки" +sort_titel = "Сортировать:" +sort_A_Z = "По алфавиту (A-Z, 1-9)" +sort_F_A_Z = "По имени (A-Z, 1-9)" +sort_F_Z_A = "По имени (Z-A, 9-1)" +sort_file = "Файл" +sort_title = "Заголовок" \ No newline at end of file diff --git a/fields/image_cascade/tpl/field.tpl b/fields/image_cascade/tpl/field.tpl index 957fb17..4c6a944 100644 --- a/fields/image_cascade/tpl/field.tpl +++ b/fields/image_cascade/tpl/field.tpl @@ -17,6 +17,39 @@ var del_all_h = '{#del_all_h#}'; var max_f_t = '{#max_f_t#}'; var max_f_h = '{#max_f_h#}'; + + /** + * Сортировка для Каскада + */ + function cascadSortItems(fieldId, docId, direction, type = 'url') { + let container = $('#cascad_' + docId + '_' + fieldId + ' .cascad_sortable'); + let items = container.find('.cascad_item').get(); + + items.sort(function(a, b) { + let valA, valB; + if (type === 'descr') { + valA = $(a).find('textarea[name*="[descr]"]').val().trim().toLowerCase(); + valB = $(b).find('textarea[name*="[descr]"]').val().trim().toLowerCase(); + + if (valA === '' && valB !== '') return 1; + if (valA !== '' && valB === '') return -1; + } else { + valA = $(a).find('input[id^="image__"]').val().toLowerCase(); + valB = $(b).find('input[id^="image__"]').val().toLowerCase(); + } + + if (direction === 'asc') { + return valA.localeCompare(valB, undefined, { numeric: true, sensitivity: 'base' }); + } else { + return valB.localeCompare(valA, undefined, { numeric: true, sensitivity: 'base' }); + } + }); + + $.each(items, function(i, li) { + container.append(li); + }); + container.fadeOut(100).fadeIn(100); + } {assign var=cascad_new value="load" scope="global"} {/if} @@ -42,12 +75,20 @@  |  [?] {/if} + +  |  + {#sort_titel#} {#sort_file#} + [A-Z] + [Z-A] + +  |  + {#place#}: + [A-Z]
{foreach from=$images key=key item=image} -
@@ -57,8 +98,6 @@
- {/foreach}
- \ No newline at end of file diff --git a/fields/image_mega/lang/ru.txt b/fields/image_mega/lang/ru.txt index 1f496fa..6e2e292 100644 --- a/fields/image_mega/lang/ru.txt +++ b/fields/image_mega/lang/ru.txt @@ -27,4 +27,10 @@ img_title = "Заголовок" img_description = "Описание" img_link = "Ссылка" from_file = "Файл" -from_docs = "Документ" \ No newline at end of file +from_docs = "Документ" +sort_titel = "Сортировать:" +sort_A_Z = "По алфавиту (A-Z, 1-9)" +sort_F_A_Z = "По имени (A-Z, 1-9)" +sort_F_Z_A = "По имени (Z-A, 9-1)" +sort_file = "Файл" +sort_title = "Заголовок" \ No newline at end of file diff --git a/fields/image_mega/tpl/field.tpl b/fields/image_mega/tpl/field.tpl index 1677329..d18c2f7 100644 --- a/fields/image_mega/tpl/field.tpl +++ b/fields/image_mega/tpl/field.tpl @@ -21,6 +21,42 @@ mega_max_f_h = '{#max_f_h#}', mega_from_file = '{#from_file#}', mega_from_docs = '{#from_docs#}'; + + /** + * Универсальная сортировка элементов + */ + function megaSortItems(fieldId, docId, direction, type = 'url') { + let container = $('#mega_' + docId + '_' + fieldId + ' .mega_sortable'); + let items = container.find('.mega_item').get(); + + items.sort(function(a, b) { + let valA, valB; + if (type === 'title') { + valA = $(a).find('textarea[name*="[title]"]').val().trim().toLowerCase(); + valB = $(b).find('textarea[name*="[title]"]').val().trim().toLowerCase(); + + // Если сортируем по заголовку, пустые поля всегда уходят в конец + if (valA === '' && valB !== '') return 1; + if (valA !== '' && valB === '') return -1; + } else { + valA = $(a).find('input[id^="image__"]').val().toLowerCase(); + valB = $(b).find('input[id^="image__"]').val().toLowerCase(); + } + + if (direction === 'asc') { + return valA.localeCompare(valB, undefined, { numeric: true, sensitivity: 'base' }); + } else { + return valB.localeCompare(valA, undefined, { numeric: true, sensitivity: 'base' }); + } + }); + + $.each(items, function(i, li) { + container.append(li); + }); + + // Визуальный отклик (мигание) + container.fadeOut(100).fadeIn(100); + } {assign var=mega_new value="load" scope="global"} {/if} @@ -46,15 +82,24 @@ [?] {/if} {if $dir_uploaded} +  |  Show folder {/if} + +  |  + {#sort_titel#} {#sort_file#} + [A-Z] + [Z-A] + +  |  + {#sort_title#} + [A-Z]
{foreach from=$images key=key item=image} -
@@ -76,8 +121,6 @@ {#from_docs#}
- {/foreach} - \ No newline at end of file