limloop commited on
Commit
df6bdf5
·
1 Parent(s): 751ca76

add feedback system

Browse files
Files changed (4) hide show
  1. README.md +2 -0
  2. locales/en.json +1 -35
  3. locales/ru.json +1 -35
  4. ui_components.py +20 -0
README.md CHANGED
@@ -18,6 +18,7 @@ license: mit
18
  [![Dataset](https://img.shields.io/badge/🗃️-Original_Dataset-ff69b4)](https://huggingface.co/datasets/loim/ru_fantasy_characters)
19
 
20
  ## ✨ Features
 
21
  - **Search** by name, description, or tags
22
  - **Filters**: absurdity, mood, tags
23
  - **RPG character cards** in Markdown (one-click copy)
@@ -54,6 +55,7 @@ license: mit
54
  [![Dataset](https://img.shields.io/badge/🗃️-Original_Dataset-ff69b4)](https://huggingface.co/datasets/loim/ru_fantasy_characters)
55
 
56
  ## ✨ Особенности
 
57
  - **Поиск** по имени, описанию или тегам
58
  - **Фильтры**: абсурдность, настроение, теги
59
  - **RPG-карточки** в формате Markdown (копирование в 1 клик)
 
18
  [![Dataset](https://img.shields.io/badge/🗃️-Original_Dataset-ff69b4)](https://huggingface.co/datasets/loim/ru_fantasy_characters)
19
 
20
  ## ✨ Features
21
+ - ***Now you can leave feedback!***
22
  - **Search** by name, description, or tags
23
  - **Filters**: absurdity, mood, tags
24
  - **RPG character cards** in Markdown (one-click copy)
 
55
  [![Dataset](https://img.shields.io/badge/🗃️-Original_Dataset-ff69b4)](https://huggingface.co/datasets/loim/ru_fantasy_characters)
56
 
57
  ## ✨ Особенности
58
+ - ***Теперь вы можете оставить отзыв!***
59
  - **Поиск** по имени, описанию или тегам
60
  - **Фильтры**: абсурдность, настроение, теги
61
  - **RPG-карточки** в формате Markdown (копирование в 1 клик)
locales/en.json CHANGED
@@ -1,35 +1 @@
1
- {
2
- "filter_lang": "Languages",
3
- "filter_all": "All",
4
- "filter_title": "🔮 Filters",
5
- "filter_search": "🔍 Search by name/description",
6
- "filter_sort_title": "Sorting",
7
- "filter_sort": ["By name (A→Z)", "By name (Z→A)", "By absurdity (↑)", "By absurdity (↓)", "Random (🎲)"],
8
- "filter_absurd": "Absurdity level",
9
- "filter_mood": "Mood",
10
- "filter_tags": "Tags",
11
- "main_not_found": "No characters found. Try adjusting the filters.",
12
- "main_counter": "Characters per page",
13
- "main_page": "Page",
14
- "main_found": "**Characters found:** {} (Page {}/{})",
15
- "pages_first": "⏪ First",
16
- "pages_before": "◀️ Back",
17
- "pages_next": "Next ▶️",
18
- "pages_last": "Last ⏩",
19
- "char_world": "🌍 World:",
20
- "char_mood": "🎭 Mood:",
21
- "char_absurd": "🌀 Absurdity:",
22
- "char_tags": "🏷️ Tags:",
23
- "char_desc": "📖 Description:",
24
- "char_style": "💬 Speech style:",
25
- "char_rpg_card": "📋 RPG card",
26
- "rpt_card_world": "World:",
27
- "rpt_card_name": "Name:",
28
- "rpt_card_desc": "Appearance:",
29
- "rpt_card_story": "Personality:",
30
- "rpt_card_style": "Speech:",
31
- "rpt_card_msg": "First message:",
32
- "rating_text": "Rating: 👍 {} | 👎 {}",
33
- "rating_like": "👍 Like",
34
- "rating_dislike": "👎 Dislike"
35
- }
 
1
+ {"filter_lang":"Languages","filter_all":"All","filter_title":"🔮 Filters","filter_search":"🔍 Search by name/description","filter_sort_title":"Sorting","filter_sort":["By name (A→Z)","By name (Z→A)","By absurdity (↑)","By absurdity (↓)","Random (🎲)"],"filter_absurd":"Absurdity level","filter_mood":"Mood","filter_tags":"Tags","main_not_found":"No characters found. Try adjusting the filters.","main_counter":"Characters per page","main_page":"Page","main_found":"**Characters found:** {} (Page {}/{})","pages_first":"⏪ First","pages_before":"◀️ Back","pages_next":"Next ▶️","pages_last":"Last ⏩","char_world":"🌍 World:","char_mood":"🎭 Mood:","char_absurd":"🌀 Absurdity:","char_tags":"🏷️ Tags:","char_desc":"📖 Description:","char_style":"💬 Speech style:","char_rpg_card":"📋 RPG card","rpt_card_world":"World:","rpt_card_name":"Name:","rpt_card_desc":"Appearance:","rpt_card_story":"Personality:","rpt_card_style":"Speech:","rpt_card_msg":"First message:","rating_text":"Rating: 👍 {} | 👎 {}","rating_like":"👍 Like","rating_dislike":"👎 Dislike","feedback_quest":"Would you like to leave feedback or suggest an improvement?","feedback_header":"Leave your feedback or suggest an improvement","feedback_rating":"Rate the project (1 - very poor, 5 - excellent)","feedback_comment_label":"Your comment","feedback_comment_help":"Leave your feedback or suggestion for improvement","feedback_send_btn":"Submit feedback","feedback_warn":"Please write a comment or select a rating before submitting","feedback_suc":"Thank you for your feedback!"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
locales/ru.json CHANGED
@@ -1,35 +1 @@
1
- {
2
- "filter_lang": "Языки",
3
- "filter_all": "Все",
4
- "filter_title": "🔮 Фильтры",
5
- "filter_search": "🔍 Поиск по имени/описанию",
6
- "filter_sort_title": "Сортировка",
7
- "filter_sort": ["По имени (А→Я)", "По имени (Я→А)", "По абсурдности (↑)", "По абсурдности (↓)", "Случайно (🎲)"],
8
- "filter_absurd": "Уровень абсурдности",
9
- "filter_mood": "Настроение",
10
- "filter_tags": "Теги",
11
- "main_not_found": "Персонажи не найдены. Попробуйте изменить фильтры.",
12
- "main_counter": "Персонажей на странице",
13
- "main_page": "Страница",
14
- "main_found": "**Найдено персонажей:** {} (Страница {}/{})",
15
- "pages_first": "⏪ Начало",
16
- "pages_before": "◀️ Назад",
17
- "pages_next": "Вперед ▶️",
18
- "pages_last": "Конец ⏩",
19
- "char_world": "🌍 Мир:",
20
- "char_mood": "🎭 Настроение:",
21
- "char_absurd": "🌀 Абсурдность:",
22
- "char_tags": "🏷️ Теги:",
23
- "char_desc": "📖 Описание:",
24
- "char_style": "💬 Стиль речи:",
25
- "char_rpg_card": "📋 RPG-карточка",
26
- "rpt_card_world": "Мир:",
27
- "rpt_card_name": "Имя:",
28
- "rpt_card_desc": "Внешность:",
29
- "rpt_card_story": "Характер:",
30
- "rpt_card_style": "Речь:",
31
- "rpt_card_msg": "Первая реплика:",
32
- "rating_text": "Рейтинг: 👍 {} | 👎 {}",
33
- "rating_like": "👍 Нравится",
34
- "rating_dislike": "👎 Не нравится"
35
- }
 
1
+ {"filter_lang":"Языки","filter_all":"Все","filter_title":"🔮 Фильтры","filter_search":"🔍 Поиск по имени/описанию","filter_sort_title":"Сортировка","filter_sort":["По имени (А→Я)","По имени (Я→А)","По абсурдности (↑)","По абсурдности (↓)","Случайно (🎲)"],"filter_absurd":"Уровень абсурдности","filter_mood":"Настроение","filter_tags":"Теги","main_not_found":"Персонажи не найдены. Попробуйте изменить фильтры.","main_counter":"Персонажей на странице","main_page":"Страница","main_found":"**Найдено персонажей:** {} (Страница {}/{})","pages_first":"⏪ Начало","pages_before":"◀️ Назад","pages_next":"Вперед ▶️","pages_last":"Конец ⏩","char_world":"🌍 Мир:","char_mood":"🎭 Настроение:","char_absurd":"🌀 Абсурдность:","char_tags":"🏷️ Теги:","char_desc":"📖 Описание:","char_style":"💬 Стиль речи:","char_rpg_card":"📋 RPG-карточка","rpt_card_world":"Мир:","rpt_card_name":"Имя:","rpt_card_desc":"Внешность:","rpt_card_story":"Характер:","rpt_card_style":"Речь:","rpt_card_msg":"Первая реплика:","rating_text":"Рейтинг: 👍 {} | 👎 {}","rating_like":"👍 Нравится","rating_dislike":"👎 Не нравится","feedback_quest":"Хотите оставить отзыв или предложить улучшение?","feedback_header":"Оставьте ваш отзыв или предложите улучшение","feedback_rating":"Оцените проект (1 - очень плохо, 5 - отлично)","feedback_comment_label":"Ваш комментарий","feedback_comment_help":"Оставьте ваш отзыв или предложение по улучшению","feedback_send_btn":"Отправить отзыв","feedback_warn":"Пожалуйста, напишите комментарий или выберите оценку перед отправкой","feedback_suc":"Спасибо за ваш отзыв!"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui_components.py CHANGED
@@ -113,8 +113,28 @@ def render_character_rating(locale, database, localS, row):
113
  localS.setItem("rated", st.session_state.rated)
114
  st.rerun()
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
  def render_main_content(locale, database, localS, filtered_df):
 
 
118
  """Рендеринг основного контента с пагинацией"""
119
  st.title("🧙 Fantasy Characters Explorer")
120
 
 
113
  localS.setItem("rated", st.session_state.rated)
114
  st.rerun()
115
 
116
+ def feedback_system(locale, database, localS):
117
+ if 'feedback_enabled' not in st.session_state:
118
+ st.session_state.feedback_enabled = False
119
+
120
+ if st.session_state.feedback_enabled:
121
+ st.header(locale["feedback_header"])
122
+ rating = st.slider(locale["feedback_rating"], 1, 5, 3)
123
+ comment = st.text_area(locale["feedback_comment_label"], help=locale["feedback_comment_help"])
124
+ if st.button(locale["feedback_send_btn"]):
125
+ if comment.strip() == "" and rating == 3:
126
+ st.warning(locale["feedback_warn"])
127
+ else:
128
+ upsert_data(database, "feedback", {"text": comment.strip(), "rating": rating})
129
+ st.success(locale["feedback_suc"])
130
+ else:
131
+ if st.button(locale["feedback_quest"]):
132
+ st.session_state.feedback_enabled = True
133
+ st.rerun()
134
 
135
  def render_main_content(locale, database, localS, filtered_df):
136
+ feedback_system(locale, database, localS)
137
+
138
  """Рендеринг основного контента с пагинацией"""
139
  st.title("🧙 Fantasy Characters Explorer")
140