TF-2893 Apply the standard app grid icon

This commit is contained in:
dab246
2024-07-23 13:35:02 +07:00
committed by Dat H. Pham
parent 47b006f685
commit 8b7ac1f039
27 changed files with 173 additions and 77 deletions
+1 -1
View File
@@ -2,5 +2,5 @@
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
class IconUtils { class IconUtils {
static const double defaultIconSize = PlatformInfo.isWeb ? 20.0 : 24.0; static double defaultIconSize = PlatformInfo.isWeb ? 20.0 : 24.0;
} }
@@ -2,7 +2,7 @@ import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
typedef OnTapAvatarActionClick = void Function(); typedef OnTapAvatarActionClick = void Function();
typedef OnTapAvatarActionWithPositionClick = void Function(RelativeRect? position); typedef OnTapAvatarActionWithPositionClick = void Function(RelativeRect position);
class AvatarBuilder { class AvatarBuilder {
@@ -58,7 +58,7 @@ class AvatarBuilder {
_onTapAvatarActionClick = onTapAvatarActionClick; _onTapAvatarActionClick = onTapAvatarActionClick;
} }
void addOnTapAvatarActionWithPositionClick(OnTapAvatarActionWithPositionClick onTapAvatarActionWithPositionClick) { void addOnTapAvatarActionWithPositionClick(OnTapAvatarActionWithPositionClick? onTapAvatarActionWithPositionClick) {
_onTapAvatarActionWithPositionClick = onTapAvatarActionWithPositionClick; _onTapAvatarActionWithPositionClick = onTapAvatarActionWithPositionClick;
} }
@@ -1,3 +1,4 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/style_utils.dart'; import 'package:core/presentation/utils/style_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
@@ -14,8 +15,8 @@ class SloganBuilder extends StatelessWidget {
final String? text; final String? text;
final TextStyle? textStyle; final TextStyle? textStyle;
final TextAlign? textAlign; final TextAlign? textAlign;
final String? logoSVG;
final String? logo; final String? logo;
final Uri? publicLogoUri;
final double? sizeLogo; final double? sizeLogo;
final OnTapCallback? onTapCallback; final OnTapCallback? onTapCallback;
final EdgeInsetsGeometry? paddingText; final EdgeInsetsGeometry? paddingText;
@@ -31,8 +32,8 @@ class SloganBuilder extends StatelessWidget {
this.text, this.text,
this.textStyle, this.textStyle,
this.textAlign, this.textAlign,
this.logoSVG,
this.logo, this.logo,
this.publicLogoUri,
this.sizeLogo, this.sizeLogo,
this.onTapCallback, this.onTapCallback,
this.padding, this.padding,
@@ -94,9 +95,9 @@ class SloganBuilder extends StatelessWidget {
} }
Widget _logoApp() { Widget _logoApp() {
if (logoSVG != null) { if (logo != null && logo!.endsWith('svg')) {
return SvgPicture.asset( return SvgPicture.asset(
logoSVG!, logo!,
width: sizeLogo ?? 150, width: sizeLogo ?? 150,
height: sizeLogo ?? 150); height: sizeLogo ?? 150);
} else if (logo != null) { } else if (logo != null) {
@@ -104,9 +105,22 @@ class SloganBuilder extends StatelessWidget {
image: AssetImage(logo!), image: AssetImage(logo!),
fit: BoxFit.fill, fit: BoxFit.fill,
width: sizeLogo ?? 150, width: sizeLogo ?? 150,
height: sizeLogo ?? 150);
} else if (publicLogoUri != null) {
return Image.network(
publicLogoUri.toString(),
fit: BoxFit.fill,
width: sizeLogo ?? 150,
height: sizeLogo ?? 150, height: sizeLogo ?? 150,
alignment: Alignment.center); errorBuilder: (_, error, stackTrace) {
return Container(
width: sizeLogo ?? 150,
height: sizeLogo ?? 150,
color: AppColor.textFieldHintColor,
);
});
} else {
return const SizedBox.shrink();
} }
return const SizedBox.shrink();
} }
} }
+4 -1
View File
@@ -3,7 +3,10 @@ import 'package:core/utils/web_renderer/canvas_kit.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
abstract class PlatformInfo { abstract class PlatformInfo {
static const bool isWeb = kIsWeb; @visibleForTesting
static bool isTestingForWeb = false;
static bool get isWeb => kIsWeb || isTestingForWeb;
static bool get isLinux => !kIsWeb && defaultTargetPlatform == TargetPlatform.linux; static bool get isLinux => !kIsWeb && defaultTargetPlatform == TargetPlatform.linux;
static bool get isWindows => !kIsWeb && defaultTargetPlatform == TargetPlatform.windows; static bool get isWindows => !kIsWeb && defaultTargetPlatform == TargetPlatform.windows;
static bool get isMacOS => !kIsWeb && defaultTargetPlatform == TargetPlatform.macOS; static bool get isMacOS => !kIsWeb && defaultTargetPlatform == TargetPlatform.macOS;
@@ -1,17 +1,16 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/utils/application_manager.dart'; import 'package:core/utils/application_manager.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart';
class ApplicationVersionWidget extends StatefulWidget { class ApplicationVersionWidget extends StatefulWidget {
final ApplicationManager applicationManager;
final EdgeInsetsGeometry? padding; final EdgeInsetsGeometry? padding;
final String? title; final String? title;
final TextStyle? textStyle; final TextStyle? textStyle;
const ApplicationVersionWidget({ const ApplicationVersionWidget({
super.key, super.key,
required this.applicationManager,
this.title, this.title,
this.textStyle, this.textStyle,
this.padding, this.padding,
@@ -23,12 +22,13 @@ class ApplicationVersionWidget extends StatefulWidget {
class _ApplicationVersionWidgetState extends State<ApplicationVersionWidget> { class _ApplicationVersionWidgetState extends State<ApplicationVersionWidget> {
final ApplicationManager _applicationManager = Get.find<ApplicationManager>();
Future<String>? _versionStream; Future<String>? _versionStream;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_versionStream = widget.applicationManager.getVersion(); _versionStream = _applicationManager.getVersion();
} }
@override @override
@@ -58,7 +58,7 @@ class TextInputFieldBuilder extends StatelessWidget {
minLines: minLines, minLines: minLines,
maxLines: maxLines, maxLines: maxLines,
decoration: (TextInputDecorationBuilder() decoration: (TextInputDecorationBuilder()
..setContentPadding(const EdgeInsets.symmetric(vertical: PlatformInfo.isWeb ? 16 : 12, horizontal: 12)) ..setContentPadding(EdgeInsets.symmetric(vertical: PlatformInfo.isWeb ? 16 : 12, horizontal: 12))
..setHintText(hint) ..setHintText(hint)
..setFillColor(backgroundColor) ..setFillColor(backgroundColor)
..setErrorText(error)) ..setErrorText(error))
@@ -42,7 +42,7 @@ class ContactInputDecorationBuilder extends InputDecorationBuilder {
color: AppColor.colorEmailAddressFull, color: AppColor.colorEmailAddressFull,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
fontSize: 16), fontSize: 16),
contentPadding: const EdgeInsets.symmetric( contentPadding: EdgeInsets.symmetric(
vertical: PlatformInfo.isWeb ? 16 : 12, vertical: PlatformInfo.isWeb ? 16 : 12,
horizontal: 12), horizontal: 12),
errorText: errorText, errorText: errorText,
@@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
class EmailSubjectStyles { class EmailSubjectStyles {
static const double textSize = 20; static const double textSize = 20;
static const int? maxLines = PlatformInfo.isWeb ? 2 : null; static int? maxLines = PlatformInfo.isWeb ? 2 : null;
static const Color textColor = AppColor.colorNameEmail; static const Color textColor = AppColor.colorNameEmail;
static const Color cursorColor = AppColor.colorTextButton; static const Color cursorColor = AppColor.colorTextButton;
@@ -8,7 +8,7 @@ class EmailViewAppBarWidgetStyles {
static const double bottomBorderWidth = 0.5; static const double bottomBorderWidth = 0.5;
static const double height = 52; static const double height = 52;
static const double radius = 20; static const double radius = 20;
static const double buttonIconSize = IconUtils.defaultIconSize; static double buttonIconSize = IconUtils.defaultIconSize;
static const double deleteButtonIconSize = 20; static const double deleteButtonIconSize = 20;
static const double space = 5; static const double space = 5;
static double? heightIOS(BuildContext context, ResponsiveUtils responsiveUtils) { static double? heightIOS(BuildContext context, ResponsiveUtils responsiveUtils) {
@@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
class EmailViewStyles { class EmailViewStyles {
static const double mobileContentHorizontalMargin = 16; static const double mobileContentHorizontalMargin = 16;
static const double mobileContentVerticalMargin = 12; static const double mobileContentVerticalMargin = 12;
static const double pageViewIconSize = IconUtils.defaultIconSize; static double pageViewIconSize = IconUtils.defaultIconSize;
static const EdgeInsetsGeometry pageViewButtonPadding = EdgeInsets.all(5); static const EdgeInsetsGeometry pageViewButtonPadding = EdgeInsets.all(5);
} }
@@ -14,7 +14,7 @@ class EmailRecoveryViewStyles {
color: Colors.white, color: Colors.white,
); );
static const EdgeInsetsGeometry backgroundMarginMobile = EdgeInsets.only(top: PlatformInfo.isWeb ? 70 : 0); static EdgeInsetsGeometry backgroundMarginMobile = EdgeInsets.only(top: PlatformInfo.isWeb ? 70 : 0);
static const BorderRadiusGeometry clipRRectBorderRadiusMobile = BorderRadius.only( static const BorderRadiusGeometry clipRRectBorderRadiusMobile = BorderRadius.only(
topLeft: Radius.circular(16), topLeft: Radius.circular(16),
@@ -53,7 +53,7 @@ class IdentityInputFieldBuilder extends StatelessWidget {
textStyle: const TextStyle(color: Colors.black, fontSize: 16), textStyle: const TextStyle(color: Colors.black, fontSize: 16),
keyboardType: inputType ?? TextInputType.text, keyboardType: inputType ?? TextInputType.text,
decoration: (IdentityInputDecorationBuilder() decoration: (IdentityInputDecorationBuilder()
..setContentPadding(const EdgeInsets.symmetric( ..setContentPadding(EdgeInsets.symmetric(
vertical: PlatformInfo.isWeb ? 16 : 12, vertical: PlatformInfo.isWeb ? 16 : 12,
horizontal: 12)) horizontal: 12))
..setErrorText(_error)) ..setErrorText(_error))
@@ -46,7 +46,7 @@ class IdentityInputWithDropListFieldBuilder extends StatelessWidget {
controller: editingController, controller: editingController,
textInputAction: TextInputAction.done, textInputAction: TextInputAction.done,
decoration: (IdentityInputDecorationBuilder() decoration: (IdentityInputDecorationBuilder()
..setContentPadding(const EdgeInsets.symmetric( ..setContentPadding(EdgeInsets.symmetric(
vertical: PlatformInfo.isWeb ? 16 : 12, vertical: PlatformInfo.isWeb ? 16 : 12,
horizontal: 12)) horizontal: 12))
..setErrorText(_error)) ..setErrorText(_error))
@@ -104,7 +104,7 @@ class LoginView extends BaseLoginView {
padding: const EdgeInsets.only(top: 24), padding: const EdgeInsets.only(top: 24),
child: SloganBuilder( child: SloganBuilder(
arrangedByHorizontal: true, arrangedByHorizontal: true,
logoSVG: controller.imagePaths.icJMAPStandard, logo: controller.imagePaths.icJMAPStandard,
sizeLogo: 48.0, sizeLogo: 48.0,
paddingText: const EdgeInsets.only(left: 12), paddingText: const EdgeInsets.only(left: 12),
text: AppLocalizations.of(context).jmapStandard, text: AppLocalizations.of(context).jmapStandard,
@@ -115,7 +115,7 @@ class LoginView extends BaseLoginView {
padding: const EdgeInsets.only(top: 16), padding: const EdgeInsets.only(top: 16),
child: SloganBuilder( child: SloganBuilder(
arrangedByHorizontal: true, arrangedByHorizontal: true,
logoSVG: controller.imagePaths.icEncrypted, logo: controller.imagePaths.icEncrypted,
sizeLogo: 48.0, sizeLogo: 48.0,
paddingText: const EdgeInsets.only(left: 12), paddingText: const EdgeInsets.only(left: 12),
text: AppLocalizations.of(context).encryptedMailbox, text: AppLocalizations.of(context).encryptedMailbox,
@@ -126,7 +126,7 @@ class LoginView extends BaseLoginView {
padding: const EdgeInsets.only(top: 16), padding: const EdgeInsets.only(top: 16),
child: SloganBuilder( child: SloganBuilder(
arrangedByHorizontal: true, arrangedByHorizontal: true,
logoSVG: controller.imagePaths.icTeam, logo: controller.imagePaths.icTeam,
sizeLogo: 48.0, sizeLogo: 48.0,
paddingText: const EdgeInsets.only(left: 12), paddingText: const EdgeInsets.only(left: 12),
text: AppLocalizations.of(context).manageEmailAsATeam, text: AppLocalizations.of(context).manageEmailAsATeam,
@@ -137,7 +137,7 @@ class LoginView extends BaseLoginView {
padding: const EdgeInsets.only(top: 16), padding: const EdgeInsets.only(top: 16),
child: SloganBuilder( child: SloganBuilder(
arrangedByHorizontal: true, arrangedByHorizontal: true,
logoSVG: controller.imagePaths.icIntegration, logo: controller.imagePaths.icIntegration,
sizeLogo: 48.0, sizeLogo: 48.0,
paddingText: const EdgeInsets.only(left: 12), paddingText: const EdgeInsets.only(left: 12),
text: AppLocalizations.of(context).multipleIntegrations, text: AppLocalizations.of(context).multipleIntegrations,
@@ -93,7 +93,6 @@ class MailboxView extends BaseMailboxView {
child: SafeArea( child: SafeArea(
top: false, top: false,
child: ApplicationVersionWidget( child: ApplicationVersionWidget(
applicationManager: controller.applicationManager,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
title: '${AppLocalizations.of(context).version} ', title: '${AppLocalizations.of(context).version} ',
textStyle: Theme.of(context).textTheme.labelMedium?.copyWith( textStyle: Theme.of(context).textTheme.labelMedium?.copyWith(
@@ -66,9 +66,7 @@ class MailboxView extends BaseMailboxView {
), ),
child: Row(children: [ child: Row(children: [
ApplicationLogoWidthTextWidget(), ApplicationLogoWidthTextWidget(),
ApplicationVersionWidget( const ApplicationVersionWidget()
applicationManager: controller.mailboxDashBoardController.applicationManager,
)
]) ])
); );
} }
@@ -2,5 +2,5 @@
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
class MailboxIconWidgetStyles { class MailboxIconWidgetStyles {
static const double iconSize = PlatformInfo.isWeb ? 24 : 20; static double iconSize = PlatformInfo.isWeb ? 24 : 20;
} }
@@ -9,7 +9,7 @@ class LinagoraApp with EquatableMixin{
final String appName; final String appName;
@JsonKey(name: 'icon') @JsonKey(name: 'icon')
final String iconName; final String? iconName;
@JsonKey(name: 'appLink') @JsonKey(name: 'appLink')
final Uri appUri; final Uri appUri;
@@ -17,15 +17,17 @@ class LinagoraApp with EquatableMixin{
final String? androidPackageId; final String? androidPackageId;
final String? iosUrlScheme; final String? iosUrlScheme;
final String? iosAppStoreLink; final String? iosAppStoreLink;
final Uri? publicIconUri;
LinagoraApp( LinagoraApp(
this.appName, this.appName,
this.iconName,
this.appUri, this.appUri,
{ {
this.iconName,
this.androidPackageId, this.androidPackageId,
this.iosUrlScheme, this.iosUrlScheme,
this.iosAppStoreLink this.iosAppStoreLink,
this.publicIconUri
} }
); );
@@ -40,6 +42,7 @@ class LinagoraApp with EquatableMixin{
appUri, appUri,
androidPackageId, androidPackageId,
iosUrlScheme, iosUrlScheme,
iosAppStoreLink iosAppStoreLink,
publicIconUri
]; ];
} }
@@ -0,0 +1,14 @@
import 'package:flutter/material.dart';
class AppGridDashboardStyle {
static const double iconSize = 42;
static const double hoverIconSize = 80;
static const EdgeInsetsGeometry padding = EdgeInsetsDirectional.symmetric(horizontal: 10, vertical: 14);
static final List<BoxShadow> cardShadow = [
BoxShadow(
color: Colors.black.withOpacity(0.15),
blurRadius: 20,
offset: Offset.zero
),
];
}
@@ -0,0 +1,61 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_overlay.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class AppGridDashboardIcon extends StatelessWidget {
final ImagePaths _imagePaths = Get.find<ImagePaths>();
final AppGridDashboardController appGridController;
final VoidCallback? onShowAppDashboardAction;
AppGridDashboardIcon({
super.key,
required this.appGridController,
this.onShowAppDashboardAction
});
@override
Widget build(BuildContext context) {
return Obx(() {
final isAppGridOpen = appGridController.isAppGridDashboardOverlayOpen.value;
return PortalTarget(
visible: isAppGridOpen,
portalFollower: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: appGridController.toggleAppGridDashboard
),
child: PortalTarget(
anchor: Aligned(
follower: AppUtils.isDirectionRTL(context)
? Alignment.topLeft
: Alignment.topRight,
target: AppUtils.isDirectionRTL(context)
? Alignment.bottomLeft
: Alignment.bottomRight
),
portalFollower: Obx(() {
final listApps = appGridController.linagoraApplications.value;
if (listApps?.apps.isNotEmpty == true) {
return AppDashboardOverlay(listApps!);
}
return const SizedBox.shrink();
}),
visible: isAppGridOpen,
child: TMailButtonWidget.fromIcon(
icon: _imagePaths.icAppDashboard,
backgroundColor: Colors.transparent,
iconSize: 30,
padding: const EdgeInsets.all(6),
onTapActionCallback: onShowAppDashboardAction,
),
)
);
});
}
}
@@ -1,11 +1,11 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/style_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/widget/link_browser_widget.dart'; import 'package:tmail_ui_user/features/base/widget/link_browser_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/app_dashboard/linagora_app.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/app_dashboard/linagora_app.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/app_grid_dashboard_style.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart';
class AppGridDashboardItem extends StatelessWidget { class AppGridDashboardItem extends StatelessWidget {
@@ -26,31 +26,46 @@ class AppGridDashboardItem extends StatelessWidget {
borderRadius: const BorderRadius.all(Radius.circular(16)), borderRadius: const BorderRadius.all(Radius.circular(16)),
hoverColor: AppColor.colorBgMailboxSelected, hoverColor: AppColor.colorBgMailboxSelected,
child: Container( child: Container(
width: 98, width: AppGridDashboardStyle.hoverIconSize,
padding: const EdgeInsets.symmetric(vertical: 8), padding: const EdgeInsets.symmetric(vertical: 8),
child: Column(children: [ child: Column(children: [
app.iconName.endsWith("svg") if (app.iconName?.isNotEmpty == true)
? SvgPicture.asset( app.iconName!.endsWith("svg")
_imagePaths.getConfigurationImagePath(app.iconName), ? SvgPicture.asset(
width: 56, _imagePaths.getConfigurationImagePath(app.iconName!),
height: 56, width: AppGridDashboardStyle.iconSize,
fit: BoxFit.fill) height: AppGridDashboardStyle.iconSize,
: Image.asset( fit: BoxFit.fill)
_imagePaths.getConfigurationImagePath(app.iconName), : Image.asset(
width: 56, _imagePaths.getConfigurationImagePath(app.iconName!),
height: 56, width: AppGridDashboardStyle.iconSize,
fit: BoxFit.fill), height: AppGridDashboardStyle.iconSize,
fit: BoxFit.fill)
else if (app.publicIconUri != null)
Image.network(
app.publicIconUri.toString(),
width: AppGridDashboardStyle.iconSize,
height: AppGridDashboardStyle.iconSize,
fit: BoxFit.fill,
errorBuilder: (_, error, stackTrace) {
return Container(
width: AppGridDashboardStyle.iconSize,
height: AppGridDashboardStyle.iconSize,
color: AppColor.textFieldHintColor,
);
}
),
Padding( Padding(
padding: const EdgeInsets.only(top: 8), padding: const EdgeInsets.only(top: 8),
child: Text( child: Text(
app.appName, app.appName,
maxLines: 1, maxLines: 1,
textAlign: TextAlign.center, textAlign: TextAlign.center,
softWrap: CommonTextStyle.defaultSoftWrap, overflow: TextOverflow.ellipsis,
overflow: CommonTextStyle.defaultTextOverFlow, style: Theme.of(context).textTheme.bodySmall?.copyWith(
style: const TextStyle( color: Colors.black,
color: AppColor.colorNameEmail, fontSize: 12,
fontSize: 15 fontWeight: FontWeight.w400,
), ),
), ),
), ),
@@ -1,6 +1,6 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/app_dashboard/linagora_applications.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/app_dashboard/linagora_applications.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/app_grid_dashboard_style.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_item.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_item.dart';
class AppDashboardOverlay extends StatelessWidget { class AppDashboardOverlay extends StatelessWidget {
@@ -17,18 +17,9 @@ class AppDashboardOverlay extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(24), borderRadius: BorderRadius.circular(24),
boxShadow: const [ boxShadow: AppGridDashboardStyle.cardShadow
BoxShadow(
color: AppColor.colorShadowLayerBottom,
blurRadius: 96,
offset: Offset.zero),
BoxShadow(
color: AppColor.colorShadowLayerTop,
blurRadius: 2,
offset: Offset.zero),
]
), ),
padding: const EdgeInsets.all(24), padding: AppGridDashboardStyle.padding,
child: Wrap(children: _linagoraApplications.apps child: Wrap(children: _linagoraApplications.apps
.map((app) => AppGridDashboardItem(app)) .map((app) => AppGridDashboardItem(app))
.toList()), .toList()),
@@ -38,13 +29,11 @@ class AppDashboardOverlay extends StatelessWidget {
double get _widthAppGrid { double get _widthAppGrid {
if (_linagoraApplications.apps.length >= 3) { if (_linagoraApplications.apps.length >= 3) {
return 342; return AppGridDashboardStyle.hoverIconSize * 3 + AppGridDashboardStyle.padding.horizontal;
} else if (_linagoraApplications.apps.length == 2) { } else if (_linagoraApplications.apps.length == 2) {
return 244; return AppGridDashboardStyle.hoverIconSize * 2 + AppGridDashboardStyle.padding.horizontal;
} else if (_linagoraApplications.apps.length == 1) {
return 146;
} else { } else {
return 0; return AppGridDashboardStyle.hoverIconSize + AppGridDashboardStyle.padding.horizontal;
} }
} }
} }
@@ -26,8 +26,10 @@ class AppListDashboardItem extends StatelessWidget {
text: app.appName, text: app.appName,
textAlign: TextAlign.center, textAlign: TextAlign.center,
textStyle: const TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorNameEmail), textStyle: const TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorNameEmail),
logo: !app.iconName.endsWith('svg') ? imagePaths.getConfigurationImagePath(app.iconName) : null, logo: app.iconName?.isNotEmpty == true
logoSVG: app.iconName.endsWith('svg') ? imagePaths.getConfigurationImagePath(app.iconName) : null, ? imagePaths.getConfigurationImagePath(app.iconName!)
: null,
publicLogoUri: app.publicIconUri,
onTapCallback: () => _openApp(context, app), onTapCallback: () => _openApp(context, app),
padding: const EdgeInsetsDirectional.symmetric(vertical: 12, horizontal: 20), padding: const EdgeInsetsDirectional.symmetric(vertical: 12, horizontal: 20),
hoverColor: AppColor.colorBgMailboxSelected hoverColor: AppColor.colorBgMailboxSelected
@@ -27,9 +27,7 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
padding: const EdgeInsetsDirectional.only(top: 16, bottom: 16, start: 16), padding: const EdgeInsetsDirectional.only(top: 16, bottom: 16, start: 16),
child: Row(children: [ child: Row(children: [
ApplicationLogoWidthTextWidget(), ApplicationLogoWidthTextWidget(),
ApplicationVersionWidget( const ApplicationVersionWidget()
applicationManager: controller.dashBoardController.applicationManager,
)
]) ])
), ),
if (!controller.responsiveUtils.isWebDesktop(context)) if (!controller.responsiveUtils.isWebDesktop(context))
@@ -26,7 +26,7 @@ class DeleteIdentityDialogBuilder extends StatelessWidget {
responsiveUtils: responsiveUtils, responsiveUtils: responsiveUtils,
mobile: (_buildDeleteDialog(context) mobile: (_buildDeleteDialog(context)
..alignment(Alignment.bottomCenter) ..alignment(Alignment.bottomCenter)
..outsideDialogPadding(const EdgeInsets.only(bottom: PlatformInfo.isWeb ? 42 : 16)) ..outsideDialogPadding(EdgeInsets.only(bottom: PlatformInfo.isWeb ? 42 : 16))
..widthDialog(MediaQuery.of(context).size.width - 16)) ..widthDialog(MediaQuery.of(context).size.width - 16))
.build(), .build(),
landscapeMobile: _buildDeleteDialog(context).build(), landscapeMobile: _buildDeleteDialog(context).build(),
@@ -50,7 +50,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
topLeft: Radius.circular(16), topLeft: Radius.circular(16),
topRight: Radius.circular(16)), topRight: Radius.circular(16)),
color: Colors.white), color: Colors.white),
margin: const EdgeInsets.only(top: PlatformInfo.isWeb ? 70 : 0), margin: EdgeInsets.only(top: PlatformInfo.isWeb ? 70 : 0),
child: ClipRRect( child: ClipRRect(
borderRadius: const BorderRadius.only( borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16), topLeft: Radius.circular(16),
@@ -36,7 +36,7 @@ class RulesFilterInputField extends StatelessWidget {
focusNode: focusNode, focusNode: focusNode,
maxLines: 1, maxLines: 1,
decoration: (RulesFilterInputDecorationBuilder() decoration: (RulesFilterInputDecorationBuilder()
..setContentPadding(const EdgeInsets.symmetric(vertical: PlatformInfo.isWeb ? 14 : 12, horizontal: 12)) ..setContentPadding(EdgeInsets.symmetric(vertical: PlatformInfo.isWeb ? 14 : 12, horizontal: 12))
..setHintText(hintText) ..setHintText(hintText)
..setErrorText(errorText)) ..setErrorText(errorText))
.build(), .build(),