gradio-checkboxgroupmarkdown 0.0.2__tar.gz → 0.0.4__tar.gz

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 (24) hide show
  1. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/PKG-INFO +199 -138
  2. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/README.md +198 -137
  3. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/backend/gradio_checkboxgroupmarkdown/checkboxgroupmarkdown.py +3 -1
  4. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/backend/gradio_checkboxgroupmarkdown/checkboxgroupmarkdown.pyi +2 -0
  5. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/backend/gradio_checkboxgroupmarkdown/templates/component/index.js +5405 -4728
  6. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/backend/gradio_checkboxgroupmarkdown/templates/component/style.css +1 -1
  7. gradio_checkboxgroupmarkdown-0.0.4/demo/app.py +211 -0
  8. gradio_checkboxgroupmarkdown-0.0.2/demo/app.py → gradio_checkboxgroupmarkdown-0.0.4/demo/old_origin_demo_app.py +1 -1
  9. gradio_checkboxgroupmarkdown-0.0.4/demo/space.py +334 -0
  10. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/frontend/Index.svelte +48 -0
  11. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/frontend/package-lock.json +890 -33
  12. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/frontend/package.json +1 -0
  13. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/pyproject.toml +1 -1
  14. gradio_checkboxgroupmarkdown-0.0.2/demo/space.py +0 -286
  15. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/.gitignore +0 -0
  16. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/backend/gradio_checkboxgroupmarkdown/__init__.py +0 -0
  17. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/backend/gradio_checkboxgroupmarkdown/templates/example/index.js +0 -0
  18. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/backend/gradio_checkboxgroupmarkdown/templates/example/style.css +0 -0
  19. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/demo/__init__.py +0 -0
  20. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/demo/css.css +0 -0
  21. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/demo/requirements.txt +0 -0
  22. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/frontend/Example.svelte +0 -0
  23. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/frontend/gradio.config.js +0 -0
  24. {gradio_checkboxgroupmarkdown-0.0.2 → gradio_checkboxgroupmarkdown-0.0.4}/frontend/tsconfig.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gradio_checkboxgroupmarkdown
3
- Version: 0.0.2
3
+ Version: 0.0.4
4
4
  Summary: Gradio component for CheckboxGroup with Markdown
5
5
  Author-email: YOUR NAME <YOUREMAIL@domain.com>
6
6
  License-Expression: Apache-2.0
@@ -48,168 +48,216 @@ pip install gradio_checkboxgroupmarkdown
48
48
  ## Usage
49
49
 
50
50
  ```python
51
-
52
- import gradio as gr
53
-
54
-
55
- from typing import List
56
51
  import gradio as gr
57
- from dataclasses import dataclass
58
52
  import random
53
+ from typing import List, Dict
59
54
  from gradio_checkboxgroupmarkdown import CheckboxGroupMarkdown
60
55
 
61
- # Define two different sets of choices
62
- ai_choices = [
63
- {
64
- "id": "art_101",
65
- "title": "Understanding Neural Networks",
66
- "content": "# Understanding Neural Networks\nThis article explains the basics of neural networks, their architecture, and how they learn from data.",
67
- "selected": False
68
- },
69
- {
70
- "id": "art_102",
71
- "title": "A Gentle Introduction to Transformers",
72
- "content": "# A Gentle Introduction to Transformers\nTransformers have revolutionized NLP. Learn about attention mechanisms, encoder-decoder architecture, and more.",
73
- "selected": False
74
- },
75
- {
76
- "id": "art_103",
77
- "title": "Reinforcement Learning Basics",
78
- "content": "# Reinforcement Learning Basics\nAn overview of RL concepts like agents, environments, rewards, and policies.",
79
- "selected": False
80
- }
81
- ]
56
+ def generate_test_articles():
57
+ topics = ["Machine Learning", "Deep Learning", "Neural Networks", "Computer Vision",
58
+ "Natural Language Processing"]
59
+
60
+ subtopics = ["Introduction", "Tutorial", "Case Study"]
61
+
62
+ articles = []
63
+ for i in range(10):
64
+ topic = random.choice(topics)
65
+ subtopic = random.choice(subtopics)
66
+ article_id = f"art_{i+1:02d}"
67
+
68
+ title = f"{topic}: {subtopic}"
69
+ content = f"""# {title}
70
+ This article covers {topic.lower()} {subtopic.lower()}.
71
+ Key points:
72
+ - Basic concepts
73
+ - Implementation tips
74
+ - Practical examples"""
75
+
76
+ articles.append({
77
+ "id": article_id,
78
+ "title": title,
79
+ "content": content,
80
+ "selected": False
81
+ })
82
+
83
+ return articles
82
84
 
83
- ml_choices = [
84
- {
85
- "id": "art_104",
86
- "title": "Machine Learning Fundamentals",
87
- "content": "# Machine Learning Fundamentals\nLearn about supervised, unsupervised, and reinforcement learning approaches.",
88
- "selected": False
89
- },
90
- {
91
- "id": "art_105",
92
- "title": "Deep Learning vs Traditional ML",
93
- "content": "# Deep Learning vs Traditional ML\nUnderstand the key differences between deep learning and traditional machine learning.",
94
- "selected": False
95
- },
96
- {
97
- "id": "art_106",
98
- "title": "Feature Engineering",
99
- "content": "# Feature Engineering\nMaster the art of creating meaningful features from raw data.",
100
- "selected": False
101
- }
102
- ]
85
+ def search_articles(search_text: str, master_articles: List[Dict]) -> List[Dict]:
86
+ print("search_articles")
87
+
88
+ """Search articles based on input text"""
89
+ if not search_text.strip():
90
+ return master_articles
91
+
92
+ search_terms = search_text.lower().split()
93
+ filtered_articles = []
94
+
95
+ for article in master_articles:
96
+ text_to_search = (article["title"] + " " + article["content"]).lower()
97
+ if all(term in text_to_search for term in search_terms):
98
+ filtered_articles.append(article)
99
+
100
+ return filtered_articles
103
101
 
104
- # def sentence_builder(selected):
105
- # if not selected:
106
- # return "You haven't selected any articles yet."
102
+ def update_filtered_articles(search_text: str, master_articles: List[Dict]):
103
+ print("update_filtered_articles")
107
104
 
108
- # if isinstance(selected[0], dict) and "title" in selected[0]:
109
- # formatted_choices = []
110
- # for choice in selected:
111
- # formatted_choices.append(
112
- # f"ID: {choice['id']}\nTitle: {choice['title']}\nContent: {choice['content']}"
113
- # )
114
- # return "Selected articles are:\n\n" + "\n\n".join(formatted_choices)
115
- # else:
116
- # return "Selected articles are:\n\n- " + "\n- ".join(selected)
117
-
118
- def sentence_builder(selected):
119
- print("\nIn sentence_builder:")
120
- print("Selected items:", selected)
105
+ """Update the first CheckboxGroupMarkdown with filtered articles"""
106
+ filtered = search_articles(search_text, master_articles)
121
107
 
122
- if not selected:
123
- return "You haven't selected any articles yet."
108
+ return {
109
+ filtered_checkbox: gr.update(
110
+ choices=filtered,
111
+ value=[art["id"] for art in filtered if art["selected"]]
112
+ ),
113
+ filtered_checkbox_state: filtered
114
+ }
124
115
 
125
- if isinstance(selected[0], dict) and "title" in selected[0]:
126
- formatted_choices = []
127
- for choice in selected:
128
- print(f"Processing choice: {choice}")
129
- formatted_choices.append(
130
- f"ID: {choice['id']}\nTitle: {choice['title']}\nContent: {choice['content']}"
131
- )
132
- return "Selected articles are:\n\n" + "\n\n".join(formatted_choices)
133
- else:
134
- return "Selected articles are:\n\n- " + "\n- ".join(selected)
135
-
136
- def update_choices(choice_type: str):
137
- if choice_type == "AI":
138
- return gr.update(choices=ai_choices, value=[]), ""
139
- elif choice_type == "ML":
140
- return gr.update(choices=ml_choices, value=["art_106"]), ""
141
- else: # Random mix
142
- mixed_choices = random.sample(ai_choices + ml_choices, 3)
143
- return gr.update(choices=mixed_choices, value=[]), ""
144
-
145
- # def update_choices(choice_type: str):
146
- # if choice_type == "AI":
147
- # choices = [{**c, "selected": False} for c in ai_choices]
148
- # return gr.update(choices=choices, value=[]), ""
149
- # elif choice_type == "ML":
150
- # choices = [{**c, "selected": c["id"] == "art_106"} for c in ml_choices]
151
- # return gr.update(choices=choices, value=["art_106"]), ""
152
- # else: # Random mix
153
- # mixed = random.sample(ai_choices + ml_choices, 3)
154
- # choices = [{**c, "selected": False} for c in mixed]
155
- # return gr.update(choices=choices, value=[]), ""
116
+ def update_selected_checkbox_articles(selected_choices, filtered_checkbox, master_articles: List[Dict]):
117
+ print("handle_deselect_articles")
118
+
119
+ """Update master articles by removing unselected ones"""
120
+ # Get IDs of articles that remain selected
121
+ selected_ids = {choice["id"] for choice in selected_choices}
122
+
123
+ # Update selection status in master_articles
124
+ for article in master_articles:
125
+ article["selected"] = article["id"] in selected_ids
126
+
127
+ # Update selection status in filtered_checkbox
128
+ for article in filtered_checkbox:
129
+ article["selected"] = article["id"] in selected_ids
130
+
131
+ # Get selected articles for second tab
132
+ selected_articles = [
133
+ {
134
+ "id": art["id"],
135
+ "title": art["title"],
136
+ "content": art["content"],
137
+ "selected": True
138
+ }
139
+ for art in master_articles
140
+ if art["selected"]
141
+ ]
142
+
143
+ return [
144
+ gr.update(
145
+ choices=selected_articles,
146
+ value=[art["id"] for art in selected_articles]
147
+ ),
148
+ gr.update(
149
+ value=[art["id"] for art in filtered_checkbox if art["selected"]]
150
+ ),
151
+ master_articles,
152
+ filtered_checkbox
153
+ ]
154
+
155
+ def update_filtered_checkbox_articles(selected_choices, filtered_checkbox, master_articles: List[Dict]):
156
+ print("update_selected_articles")
157
+
158
+ """Update the second CheckboxGroupMarkdown when selections change in the first one"""
159
+ # Get IDs of newly selected articles
160
+ selected_ids = {choice["id"] for choice in selected_choices}
161
+
162
+ # Update selection status in filtered_checkbox_state
163
+ for article in filtered_checkbox:
164
+ if article["id"] in selected_ids:
165
+ article["selected"] = True
166
+ else:
167
+ article["selected"] = False
168
+
169
+ # Update selection status in master_articles based on filtered_checkbox
170
+ filtered_articles_dict = {art["id"]: art["selected"] for art in filtered_checkbox}
171
+ for article in master_articles:
172
+ if article["id"] in filtered_articles_dict:
173
+ article["selected"] = filtered_articles_dict[article["id"]]
174
+
175
+ # Get all selected articles for the second component
176
+ selected_articles = [
177
+ {
178
+ "id": art["id"],
179
+ "title": art["title"],
180
+ "content": art["content"],
181
+ "selected": True
182
+ }
183
+ for art in master_articles
184
+ if art["selected"]
185
+ ]
186
+
187
+ return {
188
+ selected_checkbox: gr.update(
189
+ choices=selected_articles,
190
+ value=[art["id"] for art in selected_articles]
191
+ ),
192
+ filtered_checkbox_state: filtered_checkbox,
193
+ master_articles_state: master_articles
194
+ }
156
195
 
196
+ # Create the Gradio interface
157
197
  with gr.Blocks() as demo:
158
- gr.Markdown("## Interactive Article Selection Demo")
198
+ gr.Markdown("## Article Search and Selection Demo")
159
199
 
160
- with gr.Row():
161
- with gr.Column(scale=1):
162
- gr.Markdown("### Change Article Categories")
163
- with gr.Row():
164
- ai_btn = gr.Button("AI Articles", variant="primary")
165
- ml_btn = gr.Button("ML Articles", variant="secondary")
166
- mix_btn = gr.Button("Random Mix", variant="secondary")
200
+ # Create state to hold master articles list
201
+ master_articles_state = gr.State(generate_test_articles())
202
+ filtered_checkbox_state = gr.State(master_articles_state.value)
203
+ print("generate articles")
167
204
 
205
+ # Search bar
168
206
  with gr.Row():
169
- with gr.Column(scale=2):
170
- checkbox_group = CheckboxGroupMarkdown(
171
- choices=ai_choices, # Start with AI choices
172
- label="Select Articles",
173
- info="Choose articles to include in your collection",
207
+ search_input = gr.Textbox(
208
+ label="Search Articles",
209
+ placeholder="Enter search terms...",
210
+ show_label=True
211
+ )
212
+ search_button = gr.Button("Search")
213
+
214
+ # Tabs for the two CheckboxGroupMarkdown components
215
+ with gr.Tabs() as tabs:
216
+ with gr.Tab("Search Results"):
217
+ filtered_checkbox = CheckboxGroupMarkdown(
218
+ choices=master_articles_state.value,
219
+ label="Available Articles",
220
+ info="Select articles to add to your collection",
174
221
  type="all",
175
- # value=["art_101"]
222
+ value=[art["id"] for art in master_articles_state.value if art["selected"]],
223
+ buttons=["select_all", "deselect_all"]
176
224
  )
225
+ print("filtered_checkbox")
177
226
 
178
- with gr.Column(scale=1):
179
- output_text = gr.Textbox(
180
- label="Selected Articles",
181
- placeholder="Make selections to see results...",
182
- info="Selected articles will be displayed here",
183
- lines=10
227
+ with gr.Tab("Selected Collection"):
228
+ selected_checkbox = CheckboxGroupMarkdown(
229
+ choices=[art for art in master_articles_state.value if art["selected"]],
230
+ label="Your Selected Articles",
231
+ info="Your curated collection of articles",
232
+ type="all",
233
+ value=[art["id"] for art in master_articles_state.value if art["selected"]],
234
+ buttons=["select_all", "deselect_all"]
184
235
  )
236
+ print("selected_checkbox")
185
237
 
186
238
  # Event handlers
187
- checkbox_group.change(
188
- fn=sentence_builder,
189
- inputs=checkbox_group,
190
- outputs=output_text
239
+ search_button.click(
240
+ fn=update_filtered_articles,
241
+ inputs=[search_input, master_articles_state],
242
+ # outputs=[filtered_checkbox, master_articles_state]
243
+ outputs=[filtered_checkbox, filtered_checkbox_state]
191
244
  )
192
245
 
193
- # Button click handlers to update choices
194
- ai_btn.click(
195
- fn=lambda: update_choices("AI"),
196
- inputs=None,
197
- outputs=[checkbox_group, output_text],
198
- )
199
-
200
- ml_btn.click(
201
- fn=lambda: update_choices("ML"),
202
- inputs=None,
203
- outputs=[checkbox_group, output_text],
246
+ filtered_checkbox.select(
247
+ fn=update_filtered_checkbox_articles,
248
+ inputs=[filtered_checkbox, filtered_checkbox_state, master_articles_state],
249
+ outputs=[selected_checkbox, filtered_checkbox_state, master_articles_state]
204
250
  )
205
-
206
- mix_btn.click(
207
- fn=lambda: update_choices("MIX"),
208
- inputs=None,
209
- outputs=[checkbox_group, output_text],
251
+
252
+ selected_checkbox.select(
253
+ fn=update_selected_checkbox_articles,
254
+ inputs=[selected_checkbox, filtered_checkbox_state, master_articles_state],
255
+ outputs=[selected_checkbox, filtered_checkbox, master_articles_state, filtered_checkbox_state]
210
256
  )
257
+ print("Block")
258
+
211
259
 
212
- if __name__ == '__main__':
260
+ if __name__ == "__main__":
213
261
  demo.launch()
214
262
  ```
215
263
 
@@ -271,6 +319,19 @@ ChoiceType
271
319
  <td align="left">Type of value to be returned by component. "value" returns the list of strings of the choices selected, "index" returns the list of indices of the choices selected.</td>
272
320
  </tr>
273
321
 
322
+ <tr>
323
+ <td align="left"><code>buttons</code></td>
324
+ <td align="left" style="width: 25%;">
325
+
326
+ ```python
327
+ Optional[List[str]]
328
+ ```
329
+
330
+ </td>
331
+ <td align="left"><code>None</code></td>
332
+ <td align="left">None</td>
333
+ </tr>
334
+
274
335
  <tr>
275
336
  <td align="left"><code>label</code></td>
276
337
  <td align="left" style="width: 25%;">