diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.cpp index 3476066a1..e0c40b87a 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/peers/edit_peer_permissions_box.h" #include "history/admin_log/history_admin_log_filter_value.h" #include "lang/lang_keys.h" +#include "ui/wrap/vertical_layout.h" namespace AdminLog { @@ -85,4 +86,17 @@ EditFlagsDescriptor FilterValueLabels(bool isChannel) { }, .st = nullptr }; } +Fn FillFilterValueList( + not_null container, + bool isChannel, + const FilterValue &filter) { + auto [checkboxes, getResult, changes] = CreateEditAdminLogFilter( + container, + filter.flags ? (*filter.flags) : ~FilterValue::Flags(0), + isChannel); + const auto controlsRaw = checkboxes.data(); + container->add(std::move(checkboxes)); + return getResult; +} + } // namespace AdminLog diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.h b/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.h index dfd80f92f..295402a05 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.h +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.h @@ -13,10 +13,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL template struct EditFlagsDescriptor; +namespace Ui { +class VerticalLayout; +} // namespace Ui + namespace AdminLog { struct FilterValue; +[[nodiscard]] Fn FillFilterValueList( + not_null container, + bool isChannel, + const FilterValue &filter); + EditFlagsDescriptor FilterValueLabels(bool isChannel); } // namespace AdminLog diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp index d427353e8..bf8c38163 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp @@ -37,11 +37,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session_settings.h" #include "ui/chat/chat_theme.h" #include "ui/chat/chat_style.h" +#include "ui/widgets/checkbox.h" +#include "ui/widgets/expandable_peer_list.h" #include "ui/widgets/popup_menu.h" #include "ui/image/image.h" #include "ui/text/text_utilities.h" #include "ui/inactive_press.h" #include "ui/painter.h" +#include "ui/vertical_list.h" #include "ui/effects/path_shift_gradient.h" #include "core/click_handler_types.h" #include "core/file_utilities.h" @@ -59,6 +62,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_channel.h" #include "data/data_user.h" #include "styles/style_chat.h" +#include "styles/style_layers.h" #include "styles/style_menu_icons.h" #include @@ -496,8 +500,83 @@ void InnerWidget::requestAdmins() { void InnerWidget::showFilter(Fn callback) { if (_admins.empty()) { _showFilterCallback = std::move(callback); - } else { + return; } + const auto isChannel = !_channel->isMegagroup(); + const auto filter = _filter; + const auto admins = _admins; + _controller->uiShow()->show(Box([=](not_null box) { + box->setTitle(tr::lng_manage_peer_recent_actions()); + Ui::AddSubsectionTitle( + box->verticalLayout(), + tr::lng_admin_log_filter_actions_type_subtitle()); + const auto collectFlags = FillFilterValueList( + box->verticalLayout(), + isChannel, + filter); + Ui::AddSkip(box->verticalLayout()); + Ui::AddDivider(box->verticalLayout()); + Ui::AddSkip(box->verticalLayout()); + Ui::AddSubsectionTitle( + box->verticalLayout(), + tr::lng_admin_log_filter_actions_admins_subtitle()); + Ui::AddSkip(box->verticalLayout()); + + auto checkedPeerId = std::vector(); + { + checkedPeerId.reserve(admins.size()); + for (const auto &user : admins) { + if (!filter.admins + || ranges::contains( + (*filter.admins), + user->id, + &UserData::id)) { + checkedPeerId.push_back(user->id); + } + } + } + + const auto checkbox = box->addRow( + object_ptr( + box->verticalLayout(), + tr::lng_admin_log_filter_actions_admins_section( + tr::now, + Ui::Text::WithEntities), + checkedPeerId.size() == admins.size(), + st::defaultBoxCheckbox)); + using Controller = Ui::ExpandablePeerListController; + using Data = Ui::ExpandablePeerListController::Data; + const auto controller = box->lifetime().make_state(Data{ + .participants = ranges::views::all( + admins + ) | ranges::views::transform([]( + not_null user) -> not_null { + return not_null{ user }; + }) | ranges::to_vector, + .checked = std::move(checkedPeerId), + .skipSingle = true, + .hideRightButton = true, + .checkTopOnAllInner = true, + }); + Ui::AddExpandablePeerList( + checkbox, + controller, + box->verticalLayout()); + + box->addButton(tr::lng_settings_save(), [=] { + const auto peers = controller->collectRequests(); + const auto users = ranges::views::all( + peers + ) | ranges::views::transform([](not_null p) { + return not_null{ p->asUser() }; + }) | ranges::to_vector; + callback(FilterValue{ + .flags = collectFlags(), + .admins = users, + }); + }); + box->addButton(tr::lng_cancel(), [box] { box->closeBox(); }); + })); } void InnerWidget::clearAndRequestLog() {