Browse Source

Ticket #5004 - Data Lists: Add possibility to change item's Icon in the Studio builder.

AntonLV 1 year ago
parent
commit
4d1c0662de

+ 100 - 94
modules/boonex/english/data/langs/system/en.xml

@@ -783,91 +783,92 @@
   <string name="_adm_form_btn_reports_hide"><![CDATA[Hide]]></string>
   <string name="_adm_form_btn_reports_unhide"><![CDATA[Unhide]]></string>
   
-	<string name="_adm_form_btn_search_forms_edit"><![CDATA[Edit search form]]></string>
+    <string name="_adm_form_btn_search_forms_edit"><![CDATA[Edit search form]]></string>
     <string name="_adm_form_btn_search_forms_fields_edit"><![CDATA[Edit search field]]></string>
     <string name="_adm_form_btn_search_forms_fields_reset"><![CDATA[Reset]]></string>
     <string name="_adm_form_btn_search_forms_sortable_fields_reset"><![CDATA[Reset]]></string>
     <string name="_adm_form_btn_search_forms_save"><![CDATA[Save]]></string>
     <string name="_adm_form_btn_search_forms_cancel"><![CDATA[Cancel]]></string>
-	<string name="_adm_form_dsc_displays_title"><![CDATA[Name of the form display mode. Displayed in Studio only.]]></string>
-	<string name="_adm_form_dsc_field_attrs_max"><![CDATA[Enter numeric value]]></string>
-	<string name="_adm_form_dsc_field_attrs_min"><![CDATA[Enter numeric value]]></string>
-	<string name="_adm_form_dsc_field_attrs_src"><![CDATA[Enter correct image URL]]></string>
-	<string name="_adm_form_dsc_field_attrs_step"><![CDATA[Enter numeric value]]></string>
-	<string name="_adm_form_dsc_field_caption"><![CDATA[Item name displayed on site]]></string>
-	<string name="_adm_form_dsc_field_caption_block_header"><![CDATA[Title for the group of fields]]></string>
-	<string name="_adm_form_dsc_field_caption_system"><![CDATA[Field title, displayed in Studio only.]]></string>
-	<string name="_adm_form_dsc_field_checker_error_captcha"><![CDATA[Error message to display if text doesn't match with text on the image]]></string>
-	<string name="_adm_form_dsc_field_checker_params_preg"><![CDATA[Use standard <a href="http://en.wikipedia.org/wiki/Regular_expression" target="_blank">regular expression</a>. Example: #^[A-Za-z0-9]{3,16}$#]]></string>
-	<string name="_adm_form_dsc_field_collapsed"><![CDATA[Pack down the group of this field by default]]></string>
-	<string name="_adm_form_dsc_field_html"><![CDATA[Select type of HTML editor]]></string>
-        <string name="_adm_form_dsc_field_icon"><![CDATA[You may use font icon, SVG or Emoji code here]]></string>
-	<string name="_adm_form_dsc_field_info"><![CDATA[Enter field description (optional)]]></string>
-        <string name="_adm_form_dsc_field_help"><![CDATA[Enter help information for the field (optional)]]></string>
-  <string name="_adm_form_dsc_field_privacy"><![CDATA[Check it if privacy settings can be changed for the field]]></string>
-  <string name="_adm_form_dsc_field_rateable"><![CDATA[Make this field rateable]]></string>
-	<string name="_adm_form_dsc_field_required"><![CDATA[Check it if the field should have value]]></string>
-	<string name="_adm_form_dsc_field_unique"><![CDATA[Check it if the field should have unique value]]></string>
-	<string name="_adm_form_dsc_field_value_button"><![CDATA[Enter button title here]]></string>
-	<string name="_adm_form_dsc_field_value_checkbox"><![CDATA[Send this data if checkbox is checked and form is submitted]]></string>
-	<string name="_adm_form_dsc_field_value_reset"><![CDATA[Button title (this button type is used to reset the form to its default state)]]></string>
-	<string name="_adm_form_dsc_field_value_submit"><![CDATA[Button title (this button type is used to send in the form data)]]></string>
-	<string name="_adm_form_dsc_field_visible_for_levels"><![CDATA[Select user levels that can see this menu item]]></string>
-	<string name="_adm_form_dsc_field_db_pass"><![CDATA[Select how field's data will be processed before saving in the database]]></string>
-	<string name="_adm_form_dsc_forms_title"><![CDATA[Name of the form. Displayed in Studio only.]]></string>
-	<string name="_adm_form_dsc_pre_lists_title"><![CDATA[List Name for Studio use only]]></string>
-	<string name="_adm_form_dsc_pre_values_empty"><![CDATA[You can use it for items like "Please select..." which can't be submitted.]]></string>
-	<string name="_adm_form_dsc_pre_values_lkey"><![CDATA[Item name displayed on site]]></string>
-	<string name="_adm_form_dsc_search_forms_fields_search_type"><![CDATA[The type of control element in search form]]></string>
+    <string name="_adm_form_dsc_displays_title"><![CDATA[Name of the form display mode. Displayed in Studio only.]]></string>
+    <string name="_adm_form_dsc_field_attrs_max"><![CDATA[Enter numeric value]]></string>
+    <string name="_adm_form_dsc_field_attrs_min"><![CDATA[Enter numeric value]]></string>
+    <string name="_adm_form_dsc_field_attrs_src"><![CDATA[Enter correct image URL]]></string>
+    <string name="_adm_form_dsc_field_attrs_step"><![CDATA[Enter numeric value]]></string>
+    <string name="_adm_form_dsc_field_caption"><![CDATA[Item name displayed on site]]></string>
+    <string name="_adm_form_dsc_field_caption_block_header"><![CDATA[Title for the group of fields]]></string>
+    <string name="_adm_form_dsc_field_caption_system"><![CDATA[Field title, displayed in Studio only.]]></string>
+    <string name="_adm_form_dsc_field_checker_error_captcha"><![CDATA[Error message to display if text doesn't match with text on the image]]></string>
+    <string name="_adm_form_dsc_field_checker_params_preg"><![CDATA[Use standard <a href="http://en.wikipedia.org/wiki/Regular_expression" target="_blank">regular expression</a>. Example: #^[A-Za-z0-9]{3,16}$#]]></string>
+    <string name="_adm_form_dsc_field_collapsed"><![CDATA[Pack down the group of this field by default]]></string>
+    <string name="_adm_form_dsc_field_html"><![CDATA[Select type of HTML editor]]></string>
+    <string name="_adm_form_dsc_field_icon"><![CDATA[You may use font icon, SVG or Emoji code here]]></string>
+    <string name="_adm_form_dsc_field_info"><![CDATA[Enter field description (optional)]]></string>
+    <string name="_adm_form_dsc_field_help"><![CDATA[Enter help information for the field (optional)]]></string>
+    <string name="_adm_form_dsc_field_privacy"><![CDATA[Check it if privacy settings can be changed for the field]]></string>
+    <string name="_adm_form_dsc_field_rateable"><![CDATA[Make this field rateable]]></string>
+    <string name="_adm_form_dsc_field_required"><![CDATA[Check it if the field should have value]]></string>
+    <string name="_adm_form_dsc_field_unique"><![CDATA[Check it if the field should have unique value]]></string>
+    <string name="_adm_form_dsc_field_value_button"><![CDATA[Enter button title here]]></string>
+    <string name="_adm_form_dsc_field_value_checkbox"><![CDATA[Send this data if checkbox is checked and form is submitted]]></string>
+    <string name="_adm_form_dsc_field_value_reset"><![CDATA[Button title (this button type is used to reset the form to its default state)]]></string>
+    <string name="_adm_form_dsc_field_value_submit"><![CDATA[Button title (this button type is used to send in the form data)]]></string>
+    <string name="_adm_form_dsc_field_visible_for_levels"><![CDATA[Select user levels that can see this menu item]]></string>
+    <string name="_adm_form_dsc_field_db_pass"><![CDATA[Select how field's data will be processed before saving in the database]]></string>
+    <string name="_adm_form_dsc_forms_title"><![CDATA[Name of the form. Displayed in Studio only.]]></string>
+    <string name="_adm_form_dsc_pre_lists_title"><![CDATA[List Name for Studio use only]]></string>
+    <string name="_adm_form_dsc_pre_values_empty"><![CDATA[You can use it for items like "Please select..." which can't be submitted.]]></string>
+    <string name="_adm_form_dsc_pre_values_lkey"><![CDATA[Item name displayed on site]]></string>
+    <string name="_adm_form_dsc_pre_values_icon"><![CDATA[Icon to show in a list (if supported)]]></string>
+    <string name="_adm_form_dsc_search_forms_fields_search_type"><![CDATA[The type of control element in search form]]></string>
     <string name="_adm_form_dsc_search_forms_title"><![CDATA[Name of the search form. Displayed in Studio only.]]></string>
-	<string name="_adm_form_err_cannot_process_action"><![CDATA[Cannot process action. It does not have an associated handler.]]></string>
-	<string name="_adm_form_err_displays_edit"><![CDATA[Cannot update display]]></string>
-	<string name="_adm_form_err_displays_title"><![CDATA[Enter title, more than 3 characters]]></string>
-	<string name="_adm_form_err_field_add"><![CDATA[Cannot add new field]]></string>
-        <string name="_adm_form_err_field_add_already_exists"><![CDATA[Field with similar name already exists]]></string>
-	<string name="_adm_form_err_field_add_not_allowed"><![CDATA[Fields cannot be added in this form]]></string>
-  <string name="_adm_form_err_field_select_nested_form"><![CDATA[Nested form must be selected.]]></string>
-	<string name="_adm_form_err_field_caption"><![CDATA[A name with at least 3 characters is required.]]></string>
-        <string name="_adm_form_err_field_caption_system"><![CDATA[A name with at least 3 characters is required.]]></string>
-	<string name="_adm_form_err_field_checker_error"><![CDATA[You need to enter error message]]></string>
-	<string name="_adm_form_err_field_checker_func"><![CDATA[Check Function should be selected]]></string>
-	<string name="_adm_form_err_field_checker_params_length_max"><![CDATA[Enter Max Value, non-zero integer number]]></string>
-	<string name="_adm_form_err_field_checker_params_length_min"><![CDATA[Enter Min Value, non-zero integer number]]></string>
-	<string name="_adm_form_err_field_checker_params_preg"><![CDATA[Enter valid regular expression]]></string>
-	<string name="_adm_form_err_field_edit"><![CDATA[Cannot update field]]></string>
-	<string name="_adm_form_err_field_show_to"><![CDATA[Cannot update field]]></string>
-	<string name="_adm_form_err_field_value_doublerange"><![CDATA[Default value should be empty or looks like 12-23]]></string>
-	<string name="_adm_form_err_field_value_number"><![CDATA[Use numeric characters only]]></string>
-	<string name="_adm_form_err_field_values"><![CDATA[You need to select a data set from the list.]]></string>
-	<string name="_adm_form_err_forms_edit"><![CDATA[Cannot update form]]></string>
-	<string name="_adm_form_err_forms_title"><![CDATA[Enter name, more than 3 characters]]></string>
-        <string name="_adm_form_err_labels_add"><![CDATA[Cannot add label]]></string>
-        <string name="_adm_form_err_labels_edit"><![CDATA[Cannot update label]]></string>
-        <string name="_adm_form_err_labels_value"><![CDATA[Label should have unique non-empty value.]]></string>
-	<string name="_adm_form_err_missing_params"><![CDATA[The required parameters are missing.]]></string>
-	<string name="_adm_form_err_pre_lists_create"><![CDATA[Cannot add list]]></string>
-	<string name="_adm_form_err_pre_lists_edit"><![CDATA[Cannot update list]]></string>
-	<string name="_adm_form_err_pre_lists_title"><![CDATA[Enter title, more than 3 characters]]></string>
-	<string name="_adm_form_err_pre_values_create"><![CDATA[Cannot add item]]></string>
-	<string name="_adm_form_err_pre_values_create_forbidden"><![CDATA[This list is already used. It's impossible to add non-numeric, or less than 1, or more than {0} values in it.]]></string>
-	<string name="_adm_form_err_pre_values_delete"><![CDATA[Cannot delete item]]></string>
-	<string name="_adm_form_err_pre_values_edit"><![CDATA[Cannot update item]]></string>
-	<string name="_adm_form_err_pre_values_lkey"><![CDATA[Enter title, more than one character]]></string>
-	<string name="_adm_form_err_search_forms_essential"><![CDATA[The field is essential. Please fill in.]]></string>
+    <string name="_adm_form_err_cannot_process_action"><![CDATA[Cannot process action. It does not have an associated handler.]]></string>
+    <string name="_adm_form_err_displays_edit"><![CDATA[Cannot update display]]></string>
+    <string name="_adm_form_err_displays_title"><![CDATA[Enter title, more than 3 characters]]></string>
+    <string name="_adm_form_err_field_add"><![CDATA[Cannot add new field]]></string>
+    <string name="_adm_form_err_field_add_already_exists"><![CDATA[Field with similar name already exists]]></string>
+    <string name="_adm_form_err_field_add_not_allowed"><![CDATA[Fields cannot be added in this form]]></string>
+    <string name="_adm_form_err_field_select_nested_form"><![CDATA[Nested form must be selected.]]></string>
+    <string name="_adm_form_err_field_caption"><![CDATA[A name with at least 3 characters is required.]]></string>
+    <string name="_adm_form_err_field_caption_system"><![CDATA[A name with at least 3 characters is required.]]></string>
+    <string name="_adm_form_err_field_checker_error"><![CDATA[You need to enter error message]]></string>
+    <string name="_adm_form_err_field_checker_func"><![CDATA[Check Function should be selected]]></string>
+    <string name="_adm_form_err_field_checker_params_length_max"><![CDATA[Enter Max Value, non-zero integer number]]></string>
+    <string name="_adm_form_err_field_checker_params_length_min"><![CDATA[Enter Min Value, non-zero integer number]]></string>
+    <string name="_adm_form_err_field_checker_params_preg"><![CDATA[Enter valid regular expression]]></string>
+    <string name="_adm_form_err_field_edit"><![CDATA[Cannot update field]]></string>
+    <string name="_adm_form_err_field_show_to"><![CDATA[Cannot update field]]></string>
+    <string name="_adm_form_err_field_value_doublerange"><![CDATA[Default value should be empty or looks like 12-23]]></string>
+    <string name="_adm_form_err_field_value_number"><![CDATA[Use numeric characters only]]></string>
+    <string name="_adm_form_err_field_values"><![CDATA[You need to select a data set from the list.]]></string>
+    <string name="_adm_form_err_forms_edit"><![CDATA[Cannot update form]]></string>
+    <string name="_adm_form_err_forms_title"><![CDATA[Enter name, more than 3 characters]]></string>
+    <string name="_adm_form_err_labels_add"><![CDATA[Cannot add label]]></string>
+    <string name="_adm_form_err_labels_edit"><![CDATA[Cannot update label]]></string>
+    <string name="_adm_form_err_labels_value"><![CDATA[Label should have unique non-empty value.]]></string>
+    <string name="_adm_form_err_missing_params"><![CDATA[The required parameters are missing.]]></string>
+    <string name="_adm_form_err_pre_lists_create"><![CDATA[Cannot add list]]></string>
+    <string name="_adm_form_err_pre_lists_edit"><![CDATA[Cannot update list]]></string>
+    <string name="_adm_form_err_pre_lists_title"><![CDATA[Enter title, more than 3 characters]]></string>
+    <string name="_adm_form_err_pre_values_create"><![CDATA[Cannot add item]]></string>
+    <string name="_adm_form_err_pre_values_create_forbidden"><![CDATA[This list is already used. It's impossible to add non-numeric, or less than 1, or more than {0} values in it.]]></string>
+    <string name="_adm_form_err_pre_values_delete"><![CDATA[Cannot delete item]]></string>
+    <string name="_adm_form_err_pre_values_edit"><![CDATA[Cannot update item]]></string>
+    <string name="_adm_form_err_pre_values_lkey"><![CDATA[Enter title, more than one character]]></string>
+    <string name="_adm_form_err_search_forms_essential"><![CDATA[The field is essential. Please fill in.]]></string>
     <string name="_adm_form_err_search_forms_fields_edit"><![CDATA[Cannot update the search form field.]]></string>
     <string name="_adm_from_err_search_forms_fields_reset"><![CDATA[Cannot reset the search form.]]></string>
     <string name="_adm_from_err_search_forms_sortable_fields_reset"><![CDATA[Cannot reset the search form.]]></string>
     <string name="_adm_form_err_search_forms_edit"><![CDATA[Cannot update the selected search form.]]></string>
     <string name="_adm_form_err_search_forms_title"><![CDATA[Enter name, more than 3 characters]]></string>
-	<string name="_adm_form_txt_all_modules"><![CDATA[All Modules]]></string>
-	<string name="_adm_form_txt_confirm_delete"><![CDATA[Are you sure you want to delete this field? It will be deleted from all Displays! You may just turn it off instead.]]></string>
-  <string name="_adm_form_txt_audit_added"><![CDATA[Added]]></string>
-  <string name="_adm_form_txt_audit_profile"><![CDATA[Profile]]></string>
-  <string name="_adm_form_txt_audit_content"><![CDATA[Content]]></string>
-  <string name="_adm_form_txt_audit_module"><![CDATA[Module]]></string>
-  <string name="_adm_form_txt_audit_author_content"><![CDATA[Content's author]]></string>
-  <string name="_adm_pgt_txt_audit_context"><![CDATA[Context]]></string>
-  <string name="_adm_pgt_txt_audit_action"><![CDATA[Action]]></string>
+    <string name="_adm_form_txt_all_modules"><![CDATA[All Modules]]></string>
+    <string name="_adm_form_txt_confirm_delete"><![CDATA[Are you sure you want to delete this field? It will be deleted from all Displays! You may just turn it off instead.]]></string>
+    <string name="_adm_form_txt_audit_added"><![CDATA[Added]]></string>
+    <string name="_adm_form_txt_audit_profile"><![CDATA[Profile]]></string>
+    <string name="_adm_form_txt_audit_content"><![CDATA[Content]]></string>
+    <string name="_adm_form_txt_audit_module"><![CDATA[Module]]></string>
+    <string name="_adm_form_txt_audit_author_content"><![CDATA[Content's author]]></string>
+    <string name="_adm_pgt_txt_audit_context"><![CDATA[Context]]></string>
+    <string name="_adm_pgt_txt_audit_action"><![CDATA[Action]]></string>
 
   <string name="_adm_form_txt_badges_text"><![CDATA[Text]]></string>
   <string name="_adm_form_txt_badges_view"><![CDATA[View]]></string>
@@ -1059,26 +1060,31 @@
         <string name="_adm_form_err_categories_value"><![CDATA[Category should have unique non-empty value.]]></string>
       
   
-  <string name="_adm_form_txt_pre_lists_country"><![CDATA[Country]]></string>
-	<string name="_adm_form_txt_pre_lists_create_popup"><![CDATA[Add New List]]></string>
-	<string name="_adm_form_txt_pre_lists_edit_popup"><![CDATA[Edit "{0}" List]]></string>
-	<string name="_adm_form_txt_pre_lists_gl_module"><![CDATA[Module]]></string>
-	<string name="_adm_form_txt_pre_lists_gl_title"><![CDATA[System Name]]></string>
-	<string name="_adm_form_txt_pre_lists_gl_use_for_sets"><![CDATA[Use For Sets]]></string>
-	<string name="_adm_form_txt_pre_lists_gl_values"><![CDATA[Values]]></string>
-	<string name="_adm_form_txt_pre_lists_language"><![CDATA[Language]]></string>
-        <string name="_adm_form_txt_pre_lists_currency"><![CDATA[Currency]]></string>
-	<string name="_adm_form_txt_pre_lists_manage_values"><![CDATA[Manage values]]></string>
-	<string name="_adm_form_txt_pre_lists_n_values"><![CDATA[{0} items]]></string>
-	<string name="_adm_form_txt_pre_lists_no"><![CDATA[No]]></string>
-	<string name="_adm_form_txt_pre_lists_sex"><![CDATA[Sex]]></string>
-	<string name="_adm_form_txt_pre_lists_title"><![CDATA[System Name]]></string>
-	<string name="_adm_form_txt_pre_lists_yes"><![CDATA[Yes]]></string>
-	<string name="_adm_form_txt_pre_values_create_popup"><![CDATA[Add New Item]]></string>
-	<string name="_adm_form_txt_pre_values_edit_popup"><![CDATA[Edit "{0}" Item]]></string>
-	<string name="_adm_form_txt_pre_values_empty"><![CDATA[Use empty value for this item]]></string>
-	<string name="_adm_form_txt_pre_values_gl_lkey"><![CDATA[Title]]></string>
-	<string name="_adm_form_txt_pre_values_lkey"><![CDATA[Title]]></string>
+    <string name="_adm_form_txt_pre_lists_country"><![CDATA[Country]]></string>
+    <string name="_adm_form_txt_pre_lists_create_popup"><![CDATA[Add New List]]></string>
+    <string name="_adm_form_txt_pre_lists_edit_popup"><![CDATA[Edit "{0}" List]]></string>
+    <string name="_adm_form_txt_pre_lists_gl_module"><![CDATA[Module]]></string>
+    <string name="_adm_form_txt_pre_lists_gl_title"><![CDATA[System Name]]></string>
+    <string name="_adm_form_txt_pre_lists_gl_use_for_sets"><![CDATA[Use For Sets]]></string>
+    <string name="_adm_form_txt_pre_lists_gl_values"><![CDATA[Values]]></string>
+    <string name="_adm_form_txt_pre_lists_language"><![CDATA[Language]]></string>
+    <string name="_adm_form_txt_pre_lists_currency"><![CDATA[Currency]]></string>
+    <string name="_adm_form_txt_pre_lists_manage_values"><![CDATA[Manage values]]></string>
+    <string name="_adm_form_txt_pre_lists_n_values"><![CDATA[{0} items]]></string>
+    <string name="_adm_form_txt_pre_lists_no"><![CDATA[No]]></string>
+    <string name="_adm_form_txt_pre_lists_sex"><![CDATA[Sex]]></string>
+    <string name="_adm_form_txt_pre_lists_title"><![CDATA[System Name]]></string>
+    <string name="_adm_form_txt_pre_lists_yes"><![CDATA[Yes]]></string>
+    <string name="_adm_form_txt_pre_values_create_popup"><![CDATA[Add New Item]]></string>
+    <string name="_adm_form_txt_pre_values_edit_popup"><![CDATA[Edit "{0}" Item]]></string>
+    <string name="_adm_form_txt_pre_values_empty"><![CDATA[Use empty value for this item]]></string>
+    <string name="_adm_form_txt_pre_values_gl_lkey"><![CDATA[Title]]></string>
+    <string name="_adm_form_txt_pre_values_lkey"><![CDATA[Title]]></string>
+    <string name="_adm_form_txt_pre_values_icon"><![CDATA[Icon]]></string>
+    <string name="_adm_form_txt_pre_values_icon_type"><![CDATA[Icon Type]]></string>
+    <string name="_adm_form_txt_pre_values_icon_type_emoji"><![CDATA[Emoji]]></string>
+    <string name="_adm_form_txt_pre_values_icon_type_icon"><![CDATA[Icon]]></string>
+    <string name="_adm_form_txt_pre_values_icon_type_image"><![CDATA[Image (inline SVG)]]></string>
     <string name="_adm_form_txt_search_forms_edit_popup"><![CDATA[Edit "{0}" Search Form]]></string>
     <string name="_adm_form_txt_search_forms_fields"><![CDATA[Fields]]></string>
     <string name="_adm_form_txt_search_forms_sortable_fields"><![CDATA[Sortable Fields]]></string>

+ 6 - 0
modules/boonex/russian/data/langs/system/ru.xml

@@ -811,6 +811,7 @@
     <string name="_adm_form_dsc_pre_lists_title"><![CDATA[Название списка для использования только в Студии]]></string>
     <string name="_adm_form_dsc_pre_values_empty"><![CDATA[Вы можете использовать его для элементов, таких как "Пожалуйста, выберите...", которые не могут быть отправлены.]]></string>
     <string name="_adm_form_dsc_pre_values_lkey"><![CDATA[Название злемента, отображаемое на сайте]]></string>
+    <string name="_adm_form_dsc_pre_values_icon"><![CDATA[Значок для отображения в списке (если поддерживается)]]></string>
     <string name="_adm_form_dsc_search_forms_fields_search_type"><![CDATA[Тип элемента управления в форме поиска]]></string>
     <string name="_adm_form_dsc_search_forms_title"><![CDATA[Название Формы поиска. Отображается только в Студии.]]></string>
     <string name="_adm_form_err_cannot_process_action"><![CDATA[Невозможно выполнить действие. Отсутствует связанный обработчик.]]></string>
@@ -1062,6 +1063,11 @@
 	<string name="_adm_form_txt_pre_values_empty"><![CDATA[Использовать пустое значение для данного элемента]]></string>
 	<string name="_adm_form_txt_pre_values_gl_lkey"><![CDATA[Заголовок]]></string>
 	<string name="_adm_form_txt_pre_values_lkey"><![CDATA[Заголовок]]></string>
+        <string name="_adm_form_txt_pre_values_icon"><![CDATA[Иконка]]></string>
+        <string name="_adm_form_txt_pre_values_icon_type"><![CDATA[Тип иконки]]></string>
+        <string name="_adm_form_txt_pre_values_icon_type_emoji"><![CDATA[Emoji]]></string>
+        <string name="_adm_form_txt_pre_values_icon_type_icon"><![CDATA[Иконка]]></string>
+        <string name="_adm_form_txt_pre_values_icon_type_image"><![CDATA[Изображение (встроенный SVG)]]></string>
 	<string name="_adm_form_txt_search_forms_edit_popup"><![CDATA[Редактировать "{0}" форму поиска]]></string>
     <string name="_adm_form_txt_search_forms_sortable_fields"><![CDATA[Поля для сортировки]]></string>
     <string name="_adm_form_txt_search_forms_fields"><![CDATA[Поля]]></string>

+ 4 - 0
studio/classes/BxDolStudioFormsPreValues.php

@@ -16,6 +16,8 @@ class BxDolStudioFormsPreValues extends BxTemplStudioGrid
     protected $sList;
     protected $aList;
 
+    protected $aIconTypes;
+
     public function __construct ($aOptions, $oTemplate = false)
     {
         parent::__construct ($aOptions, $oTemplate);
@@ -36,6 +38,8 @@ class BxDolStudioFormsPreValues extends BxTemplStudioGrid
             $this->aList = array();
             $this->oDb->getLists(array('type' => 'by_key', 'value' => $this->sList), $this->aList, false);
         }
+
+        $this->aIconTypes = ['icon', 'emoji', 'image'];
     }
 
     protected function _getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage)

+ 67 - 59
studio/js/forms_values.js

@@ -6,9 +6,9 @@
  * @{
  */
 function BxDolStudioFormsPreValues(oOptions) {
-	this.sActionsUrl = oOptions.sActionUrl;
-	this.sPageUrl = oOptions.sPageUrl;
-	this.sObjNameGrid = oOptions.sObjNameGrid;
+    this.sActionsUrl = oOptions.sActionUrl;
+    this.sPageUrl = oOptions.sPageUrl;
+    this.sObjNameGrid = oOptions.sObjNameGrid;
     this.sObjName = oOptions.sObjName == undefined ? 'oBxDolStudioFormsValues' : oOptions.sObjName;
     this.sAnimationEffect = oOptions.sAnimationEffect == undefined ? 'fade' : oOptions.sAnimationEffect;
     this.iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
@@ -17,68 +17,76 @@ function BxDolStudioFormsPreValues(oOptions) {
     this.sTextSearchInput = oOptions.sTextSearchInput == undefined ? '' : oOptions.sTextSearchInput;
 }
 
+BxDolStudioFormsPreValues.prototype.onChangeIconType = function(oSource) {
+    var oItems = $(oSource).parents('form:first').find('.bx-pre-values-icon');
+    if(!oItems || !oItems.length)
+        return;
+
+    oItems.hide().filter('.bx-pre-values-icon.bx-pvi-' + $(oSource).val()).show();
+};
+
 BxDolStudioFormsPreValues.prototype.onChangeModule = function() {
-	var $this = this;
-	var oDate = new Date();
-	var sModule = $('#bx-grid-module-' + this.sObjNameGrid).val();
-
-	this.reloadGrid();
-
-	bx_loading($('body'), true);
-
-	$.post(
-		this.sPageUrl,
-		{
-			form_action: 'get_lists',
-			form_module: sModule,
-			_t: oDate.getTime()
-		},
-		function(oData) {
-			bx_loading($('body'), false);
-
-			if(oData.code != 0) {
-				bx_alert(oData.message);
-				return;
-			}
-
-			$('#' + $(oData.content).attr('id')).replaceWith(oData.content);
-		},
-		'json'
-	);
+    var $this = this;
+    var oDate = new Date();
+    var sModule = $('#bx-grid-module-' + this.sObjNameGrid).val();
+
+    this.reloadGrid();
+
+    bx_loading($('body'), true);
+
+    $.post(
+        this.sPageUrl,
+        {
+            form_action: 'get_lists',
+            form_module: sModule,
+            _t: oDate.getTime()
+        },
+        function(oData) {
+            bx_loading($('body'), false);
+
+            if(oData.code != 0) {
+                bx_alert(oData.message);
+                return;
+            }
+
+            $('#' + $(oData.content).attr('id')).replaceWith(oData.content);
+        },
+        'json'
+    );
 };
 
 BxDolStudioFormsPreValues.prototype.onChangeList = function() {
-	this.reloadGrid($('#bx-grid-module-' + this.sObjNameGrid).val(), $('#bx-grid-list-' + this.sObjNameGrid).val());
+    this.reloadGrid($('#bx-grid-module-' + this.sObjNameGrid).val(), $('#bx-grid-list-' + this.sObjNameGrid).val());
 };
 
 BxDolStudioFormsPreValues.prototype.reloadGrid = function(sModule, sList) {
-	var bReload = false;
-
-	if(!sModule) 
-		sList = '';
-
-	var oSearch = $('#bx-form-element-keyword');
-	var oActions = $("[bx_grid_action_independent]");
-	if(!sList) {
-		oSearch.hide();
-		oActions.addClass('bx-btn-disabled');
-	}
-	else {
-		oSearch.show();
-		oActions.removeClass('bx-btn-disabled');
-	}
-
-	if(glGrids[this.sObjNameGrid]._oQueryAppend['module'] != sModule) {
-		glGrids[this.sObjNameGrid]._oQueryAppend['module'] = sModule;
-		bReload = true;
-	}
-
-	if(glGrids[this.sObjNameGrid]._oQueryAppend['list'] != sList) {
-		glGrids[this.sObjNameGrid]._oQueryAppend['list'] = sList;
-		bReload = true;
-	}
-
-	if(bReload)
-		glGrids[this.sObjNameGrid].reload(0);
+    var bReload = false;
+
+    if(!sModule) 
+        sList = '';
+
+    var oSearch = $('#bx-form-element-keyword');
+    var oActions = $("[bx_grid_action_independent]");
+    if(!sList) {
+        oSearch.hide();
+        oActions.addClass('bx-btn-disabled');
+    }
+    else {
+        oSearch.show();
+        oActions.removeClass('bx-btn-disabled');
+    }
+
+    if(glGrids[this.sObjNameGrid]._oQueryAppend['module'] != sModule) {
+        glGrids[this.sObjNameGrid]._oQueryAppend['module'] = sModule;
+        bReload = true;
+    }
+
+    if(glGrids[this.sObjNameGrid]._oQueryAppend['list'] != sList) {
+        glGrids[this.sObjNameGrid]._oQueryAppend['list'] = sList;
+        bReload = true;
+    }
+
+    if(bReload)
+        glGrids[this.sObjNameGrid].reload(0);
 };
 /** @} */

+ 122 - 4
studio/template/scripts/BxBaseStudioFormsPreValues.php

@@ -27,7 +27,7 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
         $sAction = 'add';
 
         if(!$this->canAdd()) {
-            echoJson(array());
+            echoJson([]);
             exit;
         }
 
@@ -83,6 +83,53 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
                         'error' => _t('_adm_form_err_pre_values_lkey'),
                     ),
                 ),
+                'icon_type' => [
+                    'type' => 'select',
+                    'name' => 'icon_type',
+                    'caption' => _t('_adm_form_txt_pre_values_icon_type'),
+                    'info' => '',
+                    'values' => [
+                        ['key' => '', 'value' => _t('_sys_please_select')],
+                        ['key' => 'icon', 'value' => _t('_adm_form_txt_pre_values_icon_type_icon')],
+                        ['key' => 'emoji', 'value' => _t('_adm_form_txt_pre_values_icon_type_emoji')],
+                        ['key' => 'image', 'value' => _t('_adm_form_txt_pre_values_icon_type_image')]
+                    ],
+                    'value' => '',
+                    'required' => '0',
+                    'attrs' => [
+                        'onchange' => 'javascript:' . $this->getJsObject() . '.onChangeIconType(this)'
+                    ]
+                ],
+                'icon_icon' => [
+                    'type' => 'text',
+                    'name' => 'icon_icon',
+                    'caption' => _t('_adm_form_txt_pre_values_icon'),
+                    'info' => _t('_adm_form_dsc_pre_values_icon'),
+                    'value' => '',
+                    'required' => '0',
+                    'code' => 1,
+                    'tr_attrs' => ['class' => 'bx-pre-values-icon bx-pvi-icon', 'style' => 'display:none']
+                ],
+                'icon_emoji' => [
+                    'type' => 'textarea',
+                    'name' => 'icon_emoji',
+                    'caption' => _t('_adm_form_txt_pre_values_icon'),
+                    'info' => _t('_adm_form_dsc_pre_values_icon'),
+                    'value' => '',
+                    'required' => '0',
+                    'code' => 1,
+                    'tr_attrs' => ['class' => 'bx-pre-values-icon bx-pvi-emoji', 'style' => 'display:none']
+                ],
+                'icon_image' => [
+                    'type' => 'textarea',
+                    'name' => 'icon_image',
+                    'caption' => _t('_adm_form_txt_pre_values_icon'),
+                    'info' => _t('_adm_form_dsc_pre_values_icon'),
+                    'value' => '',
+                    'required' => '0',
+                    'code' => 1,
+                    'tr_attrs' => ['class' => 'bx-pre-values-icon bx-pvi-image', 'style' => 'display:none']
+                ],
                 'Empty' => array(
                     'type' => 'checkbox',
                     'name' => 'Empty',
@@ -116,6 +163,17 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
         $oForm->initChecker();
 
         if($oForm->isSubmittedAndValid()) {
+            $aAdd = ['LKey2' => '', 'Order' => $this->oDb->getValuesOrderMax($this->sList) + 1];
+
+            if(($sIconType = $oForm->getCleanValue('icon_type'))) {
+                $aData['use'] = $sIconType;
+                foreach($this->aIconTypes as $sType)
+                    if(($sIcon = $oForm->getCleanValue('icon_' . $sType)))
+                        $aData[$sType] = $sIcon;
+
+                $aAdd['Data'] = serialize($aData);
+            }
+
             if($oForm->getCleanValue('Empty') == 'on')
                 BxDolForm::setSubmittedValue('Value', '', $oForm->aFormAttrs['method']);
 
@@ -131,7 +189,7 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
                 }
             }
 
-            $iId = (int)$oForm->insert(array('LKey2' => '', 'Order' => $this->oDb->getValuesOrderMax($this->sList) + 1));
+            $iId = (int)$oForm->insert($aAdd);
             if($iId != 0)
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
             else
@@ -157,12 +215,16 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
 
         $aValue = $this->_getItem('getValues');
         if($aValue === false) {
-            echoJson(array());
+            echoJson([]);
             exit;
         }
 
         $bUseInSets = (int)$this->aList['use_for_sets'] == 1;
 
+        $aData = !empty($aValue['Data']) && bx_is_serialized($aValue['Data']) ? unserialize($aValue['Data']) : [];
+
+        $sIconType = !empty($aData['use']) ? $aData['use'] : '';
+
         bx_import('BxTemplStudioFormView');
 
         $aForm = array(
@@ -205,6 +267,53 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
                         'error' => _t('_adm_form_err_pre_values_lkey'),
                     ),
                 ),
+                'icon_type' => [
+                    'type' => 'select',
+                    'name' => 'icon_type',
+                    'caption' => _t('_adm_form_txt_pre_values_icon_type'),
+                    'info' => '',
+                    'values' => [
+                        ['key' => '', 'value' => _t('_sys_please_select')],
+                        ['key' => 'icon', 'value' => _t('_adm_form_txt_pre_values_icon_type_icon')],
+                        ['key' => 'emoji', 'value' => _t('_adm_form_txt_pre_values_icon_type_emoji')],
+                        ['key' => 'image', 'value' => _t('_adm_form_txt_pre_values_icon_type_image')]
+                    ],
+                    'value' => $sIconType,
+                    'required' => '0',
+                    'attrs' => [
+                        'onchange' => 'javascript:' . $this->getJsObject() . '.onChangeIconType(this)'
+                    ]
+                ],
+                'icon_icon' => [
+                    'type' => 'text',
+                    'name' => 'icon_icon',
+                    'caption' => _t('_adm_form_txt_pre_values_icon'),
+                    'info' => _t('_adm_form_dsc_pre_values_icon'),
+                    'value' => !empty($aData['icon']) ? $aData['icon'] : '',
+                    'required' => '0',
+                    'code' => 1,
+                    'tr_attrs' => ['class' => 'bx-pre-values-icon bx-pvi-icon', 'style' => $sIconType != 'icon' ? 'display:none' : '']
+                ],
+                'icon_emoji' => [
+                    'type' => 'textarea',
+                    'name' => 'icon_emoji',
+                    'caption' => _t('_adm_form_txt_pre_values_icon'),
+                    'info' => _t('_adm_form_dsc_pre_values_icon'),
+                    'value' => !empty($aData['emoji']) ? $aData['emoji'] : '',
+                    'required' => '0',
+                    'code' => 1,
+                    'tr_attrs' => ['class' => 'bx-pre-values-icon bx-pvi-emoji', 'style' => $sIconType != 'emoji' ? 'display:none' : '']
+                ],
+                'icon_image' => [
+                    'type' => 'textarea',
+                    'name' => 'icon_image',
+                    'caption' => _t('_adm_form_txt_pre_values_icon'),
+                    'info' => _t('_adm_form_dsc_pre_values_icon'),
+                    'value' => !empty($aData['image']) ? $aData['image'] : '',
+                    'required' => '0',
+                    'code' => 1,
+                    'tr_attrs' => ['class' => 'bx-pre-values-icon bx-pvi-image', 'style' => $sIconType != 'image' ? 'display:none' : '']
+                ],
                 'Empty' => array(
                     'type' => 'checkbox',
                     'name' => 'Empty',
@@ -239,7 +348,16 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
         $oForm->initChecker();
 
         if($oForm->isSubmittedAndValid()) {
-            $aAdd = array();
+            $aAdd = [];
+
+            if(($sIconType = $oForm->getCleanValue('icon_type'))) {
+                $aData['use'] = $sIconType;
+                foreach($this->aIconTypes as $sType)
+                    if(($sIcon = $oForm->getCleanValue('icon_' . $sType)))
+                        $aData[$sType] = $sIcon;
+
+                $aAdd['Data'] = serialize($aData);
+            }
 
             $bEmpty = $oForm->getCleanValue('Empty') == 'on';
             if($bEmpty && !empty($aValue['value']))

+ 12 - 2
template/category_list.html

@@ -1,8 +1,18 @@
 <div class="bx-category-list">
     <bx_if:show_all>
         <div class="bx-category-list-item"><a href="__url__">__name__</a></div>
-    </bx_if:show_all>    
+    </bx_if:show_all>
     <bx_repeat:cats>
-        <div class="bx-category-list-item __selected_class__"><a href="__url__">__name__</a> (__num__)</div>
+        <div class="bx-category-list-item __selected_class__">
+            <a class="flex items-center" href="__url__">
+                <bx_if:show_icon>
+                    <span class="bx-cli-icon">
+                        <bx_if:show_icon_font><i class="sys-icon __icon_name__"></i></bx_if:show_icon_font>
+                        <bx_if:show_icon_html>__icon_code__</bx_if:show_icon_html>
+                    </span>
+                </bx_if:show_icon>
+                <span class="bx-cli-text">__name__ (__num__)</span>
+            </a>
+        </div>
     </bx_repeat:cats>
 </div>

+ 9 - 0
template/css/tailwind.css

@@ -1245,6 +1245,15 @@
         @apply hover:bg-gray-100 dark:hover:bg-gray-600;
     }
 
+    /* Common elements: Categories */
+    .bx-cli-icon,
+    .bx-cli-icon > * {
+        @apply flex items-center justify-center h-6 w-6 text-gray-500 text-lg;
+    }
+    .bx-cli-icon {
+        @apply ltr:mr-3 rtl:ml-3;
+    }
+
     /* Common elements: Comments */
     .bx-artificer .cmt .bx-base-general-unit-meta-username {
         @apply text-gray-700 dark:text-gray-200 hover:text-gray-900 dark:hover:text-white;

+ 61 - 16
template/scripts/BxBaseCategory.php

@@ -67,9 +67,17 @@ class BxBaseCategory extends BxDolCategory
 
     public function getCategoryIcon($sValue)
     {
-        return 'star';
+        $a = BxDolForm::getDataItems($this->_aObject['list_name'], false, BX_DATA_VALUES_ALL);
+        if(!$a || !isset($a[$sValue]))
+            return '';
+
+        $aData = $this->_getCategoryData($a[$sValue]);
+        if(empty($aData) || !is_array($aData))
+            return '';
+
+        return $this->_getCategoryIcon($aData);
     }
-            
+
     public function getCategoryTitle($sValue)
     {
     	$a = BxDolForm::getDataItems($this->_aObject['list_name']);
@@ -116,11 +124,11 @@ class BxBaseCategory extends BxDolCategory
         $aContextInfo = bx_get_page_info();
 
         $mProfileContextId = false;
-        if ($aContextInfo !== false)
+        if($aContextInfo !== false)
             $mProfileContextId = $aContextInfo['context_profile_id'];
 
-        $a = BxDolForm::getDataItems($this->_aObject['list_name']);
-        if (!$a)
+        $a = BxDolForm::getDataItems($this->_aObject['list_name'], false, BX_DATA_VALUES_ALL);
+        if(!$a)
             return $bAsArray ? [] : '';
 
         $aVars = [
@@ -134,20 +142,42 @@ class BxBaseCategory extends BxDolCategory
             ]
         ];
 
-        foreach ($a as $sValue => $sName) {
-            if (!is_numeric($sValue) && !$sValue)
+        foreach ($a as $sValue => $aCategory) {
+            if(!is_numeric($sValue) && !$sValue)
                 continue;
-            
+
             $iNum = $this->getItemsNum($sValue, ['context_id' => $mProfileContextId]);
-            if (!$bDisplayEmptyCats && !$iNum)
+            if(!$bDisplayEmptyCats && !$iNum)
                 continue;
-            
+
+            $aData = $this->_getCategoryData($aCategory);
+
+            $sIconType = $this->_getCategoryIconType($aData);
+            $sIcon = $this->_getCategoryIcon($aData);
+            $bIcon = !empty($sIcon);
+
             $aVars['bx_repeat:cats'][] = [
                 'url' => $this->getCategoryUrl($sValue, ($mProfileContextId ? ['context_id' => $mProfileContextId] : [])),
-                'name' => $sName,
+                'name' => _t($aCategory['LKey']),
                 'value' => $sValue,
                 'num' => $iNum,
-                'icon' => $this->getCategoryIcon($sValue),
+                'bx_if:show_icon' => [
+                    'condition' => $bIcon,
+                    'content' => [
+                        'bx_if:show_icon_font' => [
+                            'condition' => $bIcon && $sIconType == 'icon',
+                            'content' => [
+                                'icon_name' => $sIcon,
+                            ]
+                        ],
+                        'bx_if:show_icon_html' => [
+                            'condition' => $bIcon && in_array($sIconType, ['emoji', 'image']),
+                            'content' => [
+                                'icon_code' => $sIcon,
+                            ]
+                        ],
+                    ]
+                ],
                 'selected_class' => $sValue == bx_get('category') ? 'bx-category-list-item-selected' : '',
             ];
         }
@@ -155,13 +185,28 @@ class BxBaseCategory extends BxDolCategory
         if(bx_is_api())
             return [bx_api_get_block('categories_list',  $aVars['bx_repeat:cats'])];
 
-        if ($bAsArray)
+        if($bAsArray)
             return $aVars;
 
-        if (!$aVars['bx_repeat:cats'])
-            return '';
+        return !empty($aVars['bx_repeat:cats']) ? $this->_oTemplate->parseHtmlByName('category_list.html', $aVars) : '';
+    }
+
+    protected function _getCategoryIconType($aData)
+    {
+        return !empty($aData['use']) ? $aData['use'] : '';
+    }
+
+    protected function _getCategoryIcon($aData)
+    {
+        return !empty($aData['use']) && !empty($aData[$aData['use']]) ? $aData[$aData['use']] : '';
+    }
+    
+    protected function _getCategoryData($aCategory)
+    {
+        if(is_array($aCategory['Data']))
+            return $aCategory['Data'];
 
-        return $this->_oTemplate->parseHtmlByName('category_list.html', $aVars);
+        return !empty($aCategory['Data']) && bx_is_serialized($aCategory['Data']) ? unserialize($aCategory['Data']) : [];
     }
 }