feat(tags): remove tags section
This commit is contained in:
parent
f667327616
commit
d40dfd0e86
4 changed files with 4 additions and 96 deletions
|
@ -1,13 +1,12 @@
|
|||
use crate::components::editable_cell::EditableCell;
|
||||
use crate::components::editable_cell::InputType;
|
||||
use crate::components::tag_editor::TagEditor;
|
||||
use leptos::*;
|
||||
use serde::Deserialize;
|
||||
use uuid::Uuid;
|
||||
use leptos::logging::log;
|
||||
use crate::models::item::Item;
|
||||
use std::collections::HashMap;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::sync::Arc;
|
||||
use wasm_bindgen::JsCast;
|
||||
|
||||
#[derive(Deserialize, Clone, Debug)]
|
||||
|
@ -36,7 +35,6 @@ pub fn ItemsList(
|
|||
id: Uuid::new_v4().to_string(),
|
||||
name: String::new(),
|
||||
description: String::new(),
|
||||
tags: vec![],
|
||||
reviews: vec![],
|
||||
wikidata_id: None,
|
||||
custom_properties: HashMap::new(),
|
||||
|
@ -100,7 +98,6 @@ pub fn ItemsList(
|
|||
id: Uuid::new_v4().to_string(),
|
||||
name: String::new(),
|
||||
description: String::new(),
|
||||
tags: vec![],
|
||||
reviews: vec![],
|
||||
wikidata_id: None,
|
||||
custom_properties: HashMap::new(),
|
||||
|
@ -118,24 +115,6 @@ pub fn ItemsList(
|
|||
});
|
||||
};
|
||||
|
||||
// Add a new tag to an item
|
||||
let add_tag = move |index: usize, key: String, value: String| {
|
||||
set_items.update(|items| {
|
||||
if let Some(item) = items.get_mut(index) {
|
||||
item.tags.push((key, value));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Remove a tag from an item
|
||||
let remove_tag = move |item_index: usize, tag_index: usize| {
|
||||
set_items.update(|items| {
|
||||
if let Some(item) = items.get_mut(item_index) {
|
||||
item.tags.remove(tag_index);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Remove an item
|
||||
let remove_item = move |index: usize| {
|
||||
set_items.update(|items| {
|
||||
|
@ -144,7 +123,7 @@ pub fn ItemsList(
|
|||
};
|
||||
|
||||
// List of properties to display as rows
|
||||
let properties = vec!["Name", "Description", "Tags", "Actions"];
|
||||
let properties = vec!["Name", "Description", "Actions"];
|
||||
|
||||
view! {
|
||||
<div>
|
||||
|
@ -222,20 +201,12 @@ pub fn ItemsList(
|
|||
let label_for_display = suggestion.label.clone();
|
||||
let description_for_click = suggestion.description.clone().unwrap_or_default();
|
||||
let description_for_display = suggestion.description.clone().unwrap_or_default();
|
||||
let id = suggestion.id.clone();
|
||||
|
||||
// Tags for the item
|
||||
let tags = vec![
|
||||
("source".to_string(), "wikidata".to_string()),
|
||||
("wikidata_id".to_string(), id.clone()),
|
||||
];
|
||||
|
||||
let id = suggestion.id.clone();
|
||||
view! {
|
||||
<li class="editable-cell-suggestions-li" on:click=move |_| {
|
||||
set_items.update(|items| {
|
||||
if let Some(item) = items.get_mut(index) {
|
||||
item.description = description_for_click.clone();
|
||||
item.tags.extend(tags.clone());
|
||||
item.wikidata_id = Some(id.clone());
|
||||
item.name = label_for_click.clone();
|
||||
}
|
||||
|
@ -276,13 +247,6 @@ pub fn ItemsList(
|
|||
input_type=InputType::TextArea
|
||||
/>
|
||||
}.into_view(),
|
||||
"Tags" => view! {
|
||||
<TagEditor
|
||||
tags=item.tags.clone()
|
||||
on_add=move |key, value| add_tag(index, key, value)
|
||||
on_remove=Arc::new(Mutex::new(move |tag_index: usize| remove_tag(index, tag_index)))
|
||||
/>
|
||||
}.into_view(),
|
||||
"Actions" => view! {
|
||||
<button on:click=move |_| remove_item(index)>{ "Delete" }</button>
|
||||
}.into_view(),
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
pub mod item_form;
|
||||
pub mod items_list;
|
||||
pub mod editable_cell;
|
||||
pub mod tag_editor;
|
||||
pub mod editable_cell;
|
|
@ -1,54 +0,0 @@
|
|||
use leptos::*;
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
|
||||
|
||||
#[component]
|
||||
pub fn TagEditor(
|
||||
tags: Vec<(String, String)>,
|
||||
on_add: impl Fn(String, String) + 'static,
|
||||
on_remove: Arc<Mutex<dyn FnMut(usize) + Send + Sync>>,
|
||||
) -> impl IntoView {
|
||||
let (key, set_key) = create_signal(String::new());
|
||||
let (value, set_value) = create_signal(String::new());
|
||||
|
||||
let add_tag = move |_| {
|
||||
if !key.get().is_empty() && !value.get().is_empty() {
|
||||
on_add(key.get(), value.get());
|
||||
set_key.set(String::new());
|
||||
set_value.set(String::new());
|
||||
}
|
||||
};
|
||||
|
||||
view! {
|
||||
<div>
|
||||
<ul>
|
||||
{tags.iter().enumerate().map(|(index, (k, v))| {
|
||||
let on_remove = on_remove.clone();
|
||||
view! {
|
||||
<li>
|
||||
{format!("{}: {}", k, v)}
|
||||
<button on:click=move |_| {
|
||||
let mut on_remove = on_remove.lock().unwrap();
|
||||
on_remove(index);
|
||||
}>
|
||||
{ "Remove" }
|
||||
</button>
|
||||
</li>
|
||||
}
|
||||
}).collect::<Vec<_>>()}
|
||||
</ul>
|
||||
<input
|
||||
placeholder="Key"
|
||||
value={key.get()}
|
||||
on:input=move |e| set_key.set(event_target_value(&e))
|
||||
/>
|
||||
<input
|
||||
placeholder="Value"
|
||||
value={value.get()}
|
||||
on:input=move |e| set_value.set(event_target_value(&e))
|
||||
/>
|
||||
<button on:click=add_tag>{ "Add Tag" }</button>
|
||||
</div>
|
||||
}
|
||||
}
|
|
@ -7,7 +7,6 @@ pub struct Item {
|
|||
pub id: String,
|
||||
pub name: String,
|
||||
pub description: String,
|
||||
pub tags: Vec<(String, String)>,
|
||||
pub reviews: Vec<ReviewWithRating>,
|
||||
pub wikidata_id: Option<String>,
|
||||
pub custom_properties: HashMap<String, String>,
|
||||
|
|
Loading…
Add table
Reference in a new issue