using System.Collections.Generic; using System.Data; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System; using System.Windows.Media; using System.Threading.Tasks; using System.Globalization; using System.Text; namespace PipefyProspUpdate { public partial class Home : Page { public Home() { InitializeComponent(); ProgressBar.Value = 100; Loaded += Page_Loaded; } private async void Page_Loaded(object sender, RoutedEventArgs e) { await LoadSuggestions(); } private async Task LoadSuggestions() { if (AppState.Instance.Suggestions!.Count == 0) { await App.LoadSuggestions(); } string _uf = AppState.Instance.selectedUF ?? "Paraná (PR)"; UFComboBox.ItemsSource = AppState.Instance.Suggestions!.AsEnumerable() .Select(x => x.UF!.ToString()) .Distinct() .ToList(); UFComboBox.SelectedItem = _uf; UpdateSuggestionsLists(); UFComboBox.SelectionChanged += ComboBox_TextChanged; MesoSearchBox.TextChanged += SearchBox_TextChanged; CitySearchBox.TextChanged += SearchBox_TextChanged; MesoChangeBox.ItemsSource = AppState.Instance.MesoChangeBoxItems; CityChangeBox.ItemsSource = AppState.Instance.CityChangeBoxItems; } private void ComboBox_TextChanged(object sender, SelectionChangedEventArgs e) { UpdateSuggestionsLists(); AppState.Instance.selectedUF = UFComboBox.SelectedItem.ToString() ?? "Paraná (PR)"; AppState.Instance.Save(); } private void SearchBox_TextChanged(object sender, TextChangedEventArgs e) { UpdateSuggestionsLists(); } static string RemoveDiacritics(string text) { var normalizedString = text.Normalize(NormalizationForm.FormD); var stringBuilder = new StringBuilder(capacity: normalizedString.Length); for (int i = 0; i < normalizedString.Length; i++) { char c = normalizedString[i]; var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); if (unicodeCategory != UnicodeCategory.NonSpacingMark) { stringBuilder.Append(c); } } return stringBuilder .ToString() .Normalize(NormalizationForm.FormC); } private void UpdateSuggestionsLists() { var filteredSuggestions = AppState.Instance.Suggestions ?? Enumerable.Empty(); var list = filteredSuggestions.Where( x => (RemoveDiacritics(x.City!.ToString())!.ToLower()!.Contains(CitySearchBox.Text.ToLower())) && (RemoveDiacritics(x.Meso!.ToString())!.ToLower()!.Contains(MesoSearchBox.Text.ToLower())) && (x.UF!.ToString()!.ToLower()!.Contains((UFComboBox.SelectedItem.ToString() ?? string.Empty).ToLower()))); MesoSuggestionsList.ItemsSource = list.Select( x => x.UF + "****" + x.Meso ).Distinct().Select( y => new Models.Suggestion { UF = y.Split("****")[0], Meso = y.Split("****")[1] } ).Distinct(); CitySuggestionsList.ItemsSource = list.Select( x => x.ID + "****" + x.UF + "****" + x.Meso + "****" + x.City ).Distinct().Select( y => new Models.Suggestion { ID = y.Split("****")[0], UF = y.Split("****")[1], Meso = y.Split("****")[2], City = y.Split("****")[3], } ).Distinct(); } private void ListBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var clickedItem = e.OriginalSource as FrameworkElement; while (clickedItem != null && clickedItem is not ListBoxItem) { clickedItem = VisualTreeHelper.GetParent(clickedItem) as FrameworkElement; } if (sender is ListBox listBox && clickedItem is ListBoxItem listBoxItem) { listBox.SelectedItem = listBoxItem.Content; Models.Suggestion selectedItem = (Models.Suggestion)listBoxItem.Content; if (selectedItem != null) { DragDrop.DoDragDrop(listBox, selectedItem, DragDropEffects.Move); } } } private void ListBox_DragOver(object sender, DragEventArgs e) { e.Effects = DragDropEffects.Move; e.Handled = true; } private void HandleDrop(object sender, DragEventArgs e) { Models.Suggestion? droppedData = (Models.Suggestion?)e.Data.GetData(typeof(Models.Suggestion)); if (droppedData != null && sender is ListBox origin) { switch (origin.Name) { case ("CityChangeBox"): var meso = droppedData.Meso; if (!AppState.Instance.CityChangeBoxItems!.Where(x => x.City == droppedData.City).Any() && AppState.Instance.Suggestions!.Select(x => x.City).Contains(droppedData.City) && !AppState.Instance.MesoChangeBoxItems!.Where(x => x.Meso == meso).Any() ) { AppState.Instance.CityChangeBoxItems.Add(droppedData); } break; case ("MesoChangeBox"): List? cities = null; if (!AppState.Instance.MesoChangeBoxItems!.Where(x => x.Meso == droppedData.Meso).Any() && AppState.Instance.Suggestions!.Select(x => x.Meso).Contains(droppedData.Meso) && droppedData.City == null) { AppState.Instance.MesoChangeBoxItems.Add(droppedData); cities = AppState.Instance.Suggestions!.Where(x => x.Meso == droppedData.Meso).ToList(); } List mylist = AppState.Instance.CityChangeBoxItems.ToList(); if (cities != null) { foreach (Models.Suggestion city in mylist) { if (cities.Where(x => x.ID == city.ID).Any()) { AppState.Instance.CityChangeBoxItems.Remove(city); } } } break; } AppState.Instance.filterFlag = true; AppState.Instance.Save(); CityChangeBox.ItemsSource = null; CityChangeBox.ItemsSource = AppState.Instance.CityChangeBoxItems; MesoChangeBox.ItemsSource = null; MesoChangeBox.ItemsSource = AppState.Instance.MesoChangeBoxItems; } } private void ChangeBox_PreviewKeyDown(object sender, KeyEventArgs e) { if (sender is ListBox origin) { int index = origin.SelectedIndex; if (index > -1) { Models.Suggestion selectedItem = (Models.Suggestion)origin.Items[index]; if (sender != null && (e.Key == Key.Delete || e.Key == Key.Back)) { switch (origin!.Name) { case ("CityChangeBox"): Models.Suggestion city = AppState.Instance.CityChangeBoxItems.Where(x => x.City == selectedItem.City).First(); AppState.Instance.CityChangeBoxItems.Remove(selectedItem); CityChangeBox.ItemsSource = null; CityChangeBox.ItemsSource = AppState.Instance.CityChangeBoxItems; CityChangeBox.SelectedIndex = 0; break; case ("MesoChangeBox"): Models.Suggestion meso = AppState.Instance.MesoChangeBoxItems.Where(x => x.Meso == selectedItem.Meso).First(); AppState.Instance.MesoChangeBoxItems.Remove(meso); MesoChangeBox.ItemsSource = null; MesoChangeBox.ItemsSource = AppState.Instance.MesoChangeBoxItems; MesoChangeBox.SelectedIndex = 0; break; } AppState.Instance.filterFlag = true; AppState.Instance.Save(); } } } } private void Filter_Click(object sender, RoutedEventArgs e) { if(MesoChangeBox.Items.Count > 0 | CityChangeBox.Items.Count > 0) { AppState.Instance.Save(); NavigationService?.Navigate(new Users()); } } private void MesoAdd_Click(object sender, RoutedEventArgs e) { var selectedItems = MesoSuggestionsList.SelectedItems.OfType().ToList(); if (selectedItems.Count > 0 && selectedItems != null) { foreach (var item in selectedItems) { List? cities = null; if (!AppState.Instance.MesoChangeBoxItems!.Where(x => x.UF == item.UF && x.Meso == item.Meso && x.ID == null && x.City == null).Any() && AppState.Instance.Suggestions!.Select(x => x.Meso).Contains(item.Meso) && item.City == null && item.ID == null) { AppState.Instance.MesoChangeBoxItems.Add(item); cities = AppState.Instance.Suggestions!.Where(x => x.UF == item.UF && x.Meso == item.Meso).ToList(); } List mylist = AppState.Instance.CityChangeBoxItems.ToList(); if (cities != null && mylist.Count > 0) { foreach (Models.Suggestion city in mylist) { if (cities.Where(x => x.ID == city.ID).Any()) { AppState.Instance.CityChangeBoxItems.Remove(city); } } } } MesoSuggestionsList.SelectedIndex = -1; AppState.Instance.filterFlag = true; AppState.Instance.Save(); CityChangeBox.ItemsSource = null; CityChangeBox.ItemsSource = AppState.Instance.CityChangeBoxItems; MesoChangeBox.ItemsSource = null; MesoChangeBox.ItemsSource = AppState.Instance.MesoChangeBoxItems; } } private void MesoRemove_Click(object sender, RoutedEventArgs e) { var selectedItems = MesoChangeBox.SelectedItems.OfType().ToList(); if (selectedItems.Count > 0 && selectedItems != null) { foreach (var item in selectedItems) { if (item != null && AppState.Instance.MesoChangeBoxItems.Count != 0) { var select = AppState.Instance.MesoChangeBoxItems.Where(x => x.UF == item.UF && x.Meso == item.Meso && x.ID == null && x.City == null).First(); AppState.Instance.MesoChangeBoxItems.Remove(select); } } AppState.Instance.filterFlag = true; AppState.Instance.Save(); MesoChangeBox.ItemsSource = null; MesoChangeBox.ItemsSource = AppState.Instance.MesoChangeBoxItems; MesoChangeBox.SelectedIndex = 0; } } private void CityAdd_Click(object sender, RoutedEventArgs e) { var selectedItems = CitySuggestionsList.SelectedItems.OfType().ToList(); if (selectedItems.Count > 0 && selectedItems != null) { foreach (var item in selectedItems) { var meso = item.Meso; if (!AppState.Instance.CityChangeBoxItems!.Where(x => x.City == item.City).Any() && AppState.Instance.Suggestions!.Select(x => x.City).Contains(item.City) && !AppState.Instance.MesoChangeBoxItems!.Where(x => x.Meso == meso).Any() ) { AppState.Instance.CityChangeBoxItems.Add(item); } } CitySuggestionsList.SelectedIndex = -1; AppState.Instance.filterFlag = true; AppState.Instance.Save(); CityChangeBox.ItemsSource = null; CityChangeBox.ItemsSource = AppState.Instance.CityChangeBoxItems; } } private void CityRemove_Click(object sender, RoutedEventArgs e) { var selectedItems = CityChangeBox.SelectedItems.OfType().ToList(); if (selectedItems.Count > 0 && selectedItems != null) { foreach (var item in selectedItems) { if (item != null) { var select = AppState.Instance.CityChangeBoxItems.Where(x => x.ID == item.ID).First(); AppState.Instance.CityChangeBoxItems.Remove(select); } } AppState.Instance.filterFlag = true; AppState.Instance.Save(); CityChangeBox.ItemsSource = null; CityChangeBox.ItemsSource = AppState.Instance.CityChangeBoxItems; CityChangeBox.SelectedIndex = 0; } } } }