TF-3260 Load & Display App Grid Linagora Ecosystem

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2024-12-09 12:40:57 +07:00
committed by Dat H. Pham
parent 95f05c4715
commit dce74b43e9
48 changed files with 894 additions and 435 deletions
@@ -1172,14 +1172,6 @@ class MailboxController extends BaseMailboxController
_triggerToggleMailboxCategories();
}
break;
case MailboxCategories.appGrid:
final currentExpandMode = mailboxDashBoardController.appGridDashboardController.appDashboardExpandMode.value;
if (currentExpandMode == ExpandMode.COLLAPSE) {
_showAppDashboardAction();
} else {
mailboxDashBoardController.appGridDashboardController.toggleAppGridDashboard();
}
break;
}
}
@@ -1200,10 +1192,6 @@ class MailboxController extends BaseMailboxController
}
}
void _showAppDashboardAction() {
mailboxDashBoardController.showAppDashboardAction();
}
void handleMailboxAction(
BuildContext context,
MailboxActions actions,
@@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/base/widget/application_version_widget.da
import 'package:tmail_ui_user/features/mailbox/presentation/base_mailbox_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/app_grid_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_item_widget.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_loading_bar_widget.dart';
@@ -17,7 +18,6 @@ import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_informa
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
import 'package:tmail_ui_user/features/quotas/presentation/quotas_view.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
class MailboxView extends BaseMailboxView {
@@ -238,9 +238,18 @@ class MailboxView extends BaseMailboxView {
);
}),
Obx(() => MailboxLoadingBarWidget(viewState: controller.viewState.value)),
AppConfig.appGridDashboardAvailable && !PlatformInfo.isMobile
? buildAppGridDashboard(context, controller.responsiveUtils, controller.imagePaths, controller)
: const SizedBox.shrink(),
Obx(() {
final linagoraApps = controller
.mailboxDashBoardController
.appGridDashboardController
.listLinagoraApp;
if (linagoraApps.isNotEmpty) {
return AppGridView(linagoraApps: linagoraApps);
} else {
return const SizedBox.shrink();
}
}),
const SizedBox(height: 8),
Obx(() {
if (controller.defaultMailboxIsNotEmpty) {
@@ -10,13 +10,13 @@ import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/base_mailbox_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/app_grid_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_item_widget.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_loading_bar_widget.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget.dart';
import 'package:tmail_ui_user/features/quotas/presentation/quotas_view.dart';
import 'package:tmail_ui_user/features/quotas/presentation/styles/quotas_view_styles.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
class MailboxView extends BaseMailboxView {
@@ -154,9 +154,18 @@ class MailboxView extends BaseMailboxView {
),
)),
Obx(() => MailboxLoadingBarWidget(viewState: controller.viewState.value)),
AppConfig.appGridDashboardAvailable && controller.responsiveUtils.isWebNotDesktop(context)
? buildAppGridDashboard(context, controller.responsiveUtils, controller.imagePaths, controller)
: const SizedBox.shrink(),
Obx(() {
final linagoraApps = controller
.mailboxDashBoardController
.appGridDashboardController
.listLinagoraApp;
if (linagoraApps.isNotEmpty && !controller.responsiveUtils.isDesktop(context)) {
return AppGridView(linagoraApps: linagoraApps);
} else {
return const SizedBox.shrink();
}
}),
const SizedBox(height: 8),
Obx(() {
if (controller.defaultMailboxIsNotEmpty) {
@@ -15,7 +15,6 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_bottom_sheet_action_tile_builder.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
mixin MailboxWidgetMixin {
@@ -341,93 +340,4 @@ mixin MailboxWidgetMixin {
])
);
}
Widget buildAppGridDashboard(
BuildContext context,
ResponsiveUtils responsiveUtils,
ImagePaths imagePaths,
MailboxController controller
) {
return Column(children: [
_buildGoToApplicationsCategory(
context,
responsiveUtils,
imagePaths,
MailboxCategories.appGrid,
controller),
AnimatedContainer(
duration: const Duration(milliseconds: 400),
child: Obx(() {
return controller.mailboxDashBoardController.appGridDashboardController.appDashboardExpandMode.value == ExpandMode.EXPAND
? _buildAppGridInMailboxView(context, controller)
: const Offstage();
})
),
const Divider(color: AppColor.colorDividerMailbox, height: 1)
]);
}
Widget _buildGoToApplicationsCategory(
BuildContext context,
ResponsiveUtils responsiveUtils,
ImagePaths imagePaths,
MailboxCategories categories,
MailboxController controller
) {
return Padding(
padding: const EdgeInsetsDirectional.only(start: 32, end: 4),
child: Row(children: [
SvgPicture.asset(
imagePaths.icAppDashboard,
colorFilter: AppColor.primaryColor.asFilter(),
width: 20,
height: 20,
fit: BoxFit.fill),
Expanded(child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(categories.getTitle(context),
maxLines: 1,
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
style: const TextStyle(
fontSize: 16,
color: AppColor.colorTextButton,
fontWeight: FontWeight.w500
)
)
)),
buildIconWeb(
icon: Obx(() => SvgPicture.asset(
controller.mailboxDashBoardController.appGridDashboardController.appDashboardExpandMode.value == ExpandMode.COLLAPSE
? DirectionUtils.isDirectionRTLByLanguage(context) ? imagePaths.icBack : imagePaths.icCollapseFolder
: imagePaths.icExpandFolder,
colorFilter: controller.mailboxDashBoardController.appGridDashboardController.appDashboardExpandMode.value == ExpandMode.COLLAPSE
? AppColor.colorIconUnSubscribedMailbox.asFilter()
: AppColor.primaryColor.asFilter(),
fit: BoxFit.fill
)),
tooltip: AppLocalizations.of(context).appGridTittle,
onTap: () => controller.toggleMailboxCategories(categories)
)
])
);
}
Widget _buildAppGridInMailboxView(BuildContext context, MailboxController controller) {
return Obx(() {
final linagoraApps = controller.mailboxDashBoardController.appGridDashboardController.linagoraApplications.value;
if (linagoraApps != null && linagoraApps.apps.isNotEmpty) {
return ListView.builder(
shrinkWrap: true,
primary: false,
padding: const EdgeInsetsDirectional.only(start: 16, end: 16, bottom: 8),
itemCount: linagoraApps.apps.length,
itemBuilder: (context, index) {
return AppListDashboardItem(linagoraApps.apps[index]);
}
);
}
return const SizedBox.shrink();
});
}
}
@@ -7,7 +7,6 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
enum MailboxCategories {
exchange,
personalFolders,
appGrid,
teamMailboxes
}
@@ -19,8 +18,6 @@ extension MailboxCategoriessExtension on MailboxCategories {
return 'exchange';
case MailboxCategories.personalFolders:
return 'personalFolders';
case MailboxCategories.appGrid:
return 'appGrid';
case MailboxCategories.teamMailboxes:
return 'teamMailboxes';
}
@@ -32,8 +29,6 @@ extension MailboxCategoriessExtension on MailboxCategories {
return AppLocalizations.of(context).exchange;
case MailboxCategories.personalFolders:
return AppLocalizations.of(context).personalFolders;
case MailboxCategories.appGrid:
return AppLocalizations.of(context).appGridTittle;
case MailboxCategories.teamMailboxes:
return AppLocalizations.of(context).teamMailBoxes;
}
@@ -0,0 +1,131 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:core/utils/direction_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/app_linagora_ecosystem.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class AppGridView extends StatefulWidget {
final List<AppLinagoraEcosystem> linagoraApps;
const AppGridView({super.key, required this.linagoraApps});
@override
State<AppGridView> createState() => _AppGridViewState();
}
class _AppGridViewState extends State<AppGridView> {
final ValueNotifier<bool> _isCollapsedNotifier = ValueNotifier<bool>(true);
final _imagePaths = Get.find<ImagePaths>();
@override
void dispose() {
_isCollapsedNotifier.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(children: [
Padding(
padding: const EdgeInsetsDirectional.only(
start: 32,
end: 4,
top: 4,
bottom: 4,
),
child: Row(
children: [
SvgPicture.asset(
_imagePaths.icAppDashboard,
colorFilter: AppColor.primaryColor.asFilter(),
width: 20,
height: 20,
fit: BoxFit.fill,
),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(
AppLocalizations.of(context).appGridTittle,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontSize: 16,
color: AppColor.colorTextButton,
fontWeight: FontWeight.w500,
),
),
)
),
ValueListenableBuilder(
valueListenable: _isCollapsedNotifier,
builder: (context, isCollapsed, child) {
return TMailButtonWidget.fromIcon(
icon: _getCollapseIcon(context, isCollapsed),
iconColor: isCollapsed
? AppColor.colorIconUnSubscribedMailbox
: AppColor.primaryColor,
iconSize: 32,
padding: const EdgeInsets.all(3),
backgroundColor: Colors.transparent,
tooltipMessage: AppLocalizations.of(context).appGridTittle,
onTapActionCallback: _toggleAppGridDashboard,
);
},
),
],
),
),
AnimatedContainer(
duration: const Duration(milliseconds: 400),
child: ValueListenableBuilder(
valueListenable: _isCollapsedNotifier,
builder: (context, isCollapsed, child) {
if (isCollapsed) {
return const Offstage();
} else {
return child ?? const Offstage();
}
},
child: ListView.builder(
shrinkWrap: true,
primary: false,
padding: const EdgeInsetsDirectional.only(
start: 16,
end: 16,
bottom: 8,
),
itemCount: widget.linagoraApps.length,
itemBuilder: (context, index) {
return AppListDashboardItem(
app: widget.linagoraApps[index],
imagePaths: _imagePaths,
);
},
),
),
),
const Divider(color: AppColor.colorDividerMailbox, height: 1)
]);
}
String _getCollapseIcon(BuildContext context, bool isCollapsed) {
if (isCollapsed) {
return DirectionUtils.isDirectionRTLByLanguage(context)
? _imagePaths.icArrowLeft
: _imagePaths.icArrowRight;
} else {
return _imagePaths.icArrowBottom;
}
}
void _toggleAppGridDashboard() {
_isCollapsedNotifier.value = !_isCollapsedNotifier.value;
}
}