208 lines
7.1 KiB
Dart
208 lines
7.1 KiB
Dart
import 'package:auto_size_text/auto_size_text.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:thingsboard_app/constants/assets_path.dart';
|
|
import 'package:thingsboard_app/core/context/tb_context.dart';
|
|
import 'package:thingsboard_app/core/context/tb_context_widget.dart';
|
|
import 'package:thingsboard_app/core/entity/entities_base.dart';
|
|
import 'package:thingsboard_app/utils/utils.dart';
|
|
import 'package:thingsboard_client/thingsboard_client.dart';
|
|
|
|
mixin DashboardsBase on EntitiesBase<DashboardInfo, PageLink> {
|
|
|
|
@override
|
|
String get title => 'Dashboards';
|
|
|
|
@override
|
|
String get noItemsFoundText => 'No dashboards found';
|
|
|
|
@override
|
|
Future<PageData<DashboardInfo>> fetchEntities(PageLink pageLink) {
|
|
if (tbClient.isTenantAdmin()) {
|
|
return tbClient.getDashboardService().getTenantDashboards(pageLink);
|
|
} else {
|
|
return tbClient.getDashboardService().getCustomerDashboards(tbClient.getAuthUser()!.customerId, pageLink);
|
|
}
|
|
}
|
|
|
|
@override
|
|
void onEntityTap(DashboardInfo dashboard) {
|
|
navigateToDashboard(dashboard.id!.id!, dashboardTitle: dashboard.title);
|
|
// navigateTo('/fullscreenDashboard/${dashboard.id!.id}?title=${dashboard.title}');
|
|
// navigateTo('/dashboard/${dashboard.id!.id}?title=${dashboard.title}');
|
|
}
|
|
|
|
@override
|
|
Widget buildEntityListCard(BuildContext context, DashboardInfo dashboard) {
|
|
return _buildEntityListCard(context, dashboard, false);
|
|
}
|
|
|
|
@override
|
|
Widget buildEntityListWidgetCard(BuildContext context, DashboardInfo dashboard) {
|
|
return _buildEntityListCard(context, dashboard, true);
|
|
}
|
|
|
|
@override
|
|
EntityCardSettings entityGridCardSettings(DashboardInfo dashboard) => EntityCardSettings(dropShadow: true); //dashboard.image != null);
|
|
|
|
@override
|
|
Widget buildEntityGridCard(BuildContext context, DashboardInfo dashboard) {
|
|
return DashboardGridCard(tbContext, dashboard: dashboard);
|
|
}
|
|
|
|
Widget _buildEntityListCard(BuildContext context, DashboardInfo dashboard, bool listWidgetCard) {
|
|
return Row(
|
|
mainAxisSize: listWidgetCard ? MainAxisSize.min : MainAxisSize.max,
|
|
children: [
|
|
Flexible(
|
|
fit: listWidgetCard ? FlexFit.loose : FlexFit.tight,
|
|
child:
|
|
Container(
|
|
padding: EdgeInsets.symmetric(vertical: listWidgetCard ? 9 : 10, horizontal: 16),
|
|
child: Row(
|
|
mainAxisSize: listWidgetCard ? MainAxisSize.min : MainAxisSize.max,
|
|
children: [
|
|
Flexible(
|
|
fit: listWidgetCard ? FlexFit.loose : FlexFit.tight,
|
|
child:
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
FittedBox(
|
|
fit: BoxFit.fitWidth,
|
|
alignment: Alignment.centerLeft,
|
|
child: Text('${dashboard.title}',
|
|
style: TextStyle(
|
|
color: Color(0xFF282828),
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.w500,
|
|
height: 1.7
|
|
))
|
|
),
|
|
Text('${_dashboardDetailsText(dashboard)}',
|
|
style: TextStyle(
|
|
color: Color(0xFFAFAFAF),
|
|
fontSize: 12,
|
|
fontWeight: FontWeight.normal,
|
|
height: 1.33
|
|
))
|
|
],
|
|
)
|
|
),
|
|
(!listWidgetCard ? Column(
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
children: [
|
|
Text(entityDateFormat.format(DateTime.fromMillisecondsSinceEpoch(dashboard.createdTime!)),
|
|
style: TextStyle(
|
|
color: Color(0xFFAFAFAF),
|
|
fontSize: 12,
|
|
fontWeight: FontWeight.normal,
|
|
height: 1.33
|
|
))
|
|
],
|
|
) : Container())
|
|
],
|
|
),
|
|
)
|
|
)
|
|
]
|
|
);
|
|
}
|
|
|
|
String _dashboardDetailsText(DashboardInfo dashboard) {
|
|
if (tbClient.isTenantAdmin()) {
|
|
if (_isPublicDashboard(dashboard)) {
|
|
return 'Public';
|
|
} else {
|
|
return dashboard.assignedCustomers.map((e) => e.title).join(', ');
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
bool _isPublicDashboard(DashboardInfo dashboard) {
|
|
return dashboard.assignedCustomers.any((element) => element.isPublic);
|
|
}
|
|
|
|
}
|
|
|
|
class DashboardGridCard extends TbContextWidget<DashboardGridCard, _DashboardGridCardState> {
|
|
|
|
final DashboardInfo dashboard;
|
|
|
|
DashboardGridCard(TbContext tbContext, {required this.dashboard}) : super(tbContext);
|
|
|
|
@override
|
|
_DashboardGridCardState createState() => _DashboardGridCardState();
|
|
|
|
}
|
|
|
|
class _DashboardGridCardState extends TbContextState<DashboardGridCard, _DashboardGridCardState> {
|
|
|
|
_DashboardGridCardState(): super();
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
void didUpdateWidget(DashboardGridCard oldWidget) {
|
|
super.didUpdateWidget(oldWidget);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
var hasImage = widget.dashboard.image != null;
|
|
Widget image;
|
|
if (hasImage) {
|
|
image = Utils.imageFromBase64(widget.dashboard.image!);
|
|
} else {
|
|
image = Image.asset(ThingsboardImage.dashboardPlaceholder);
|
|
}
|
|
return
|
|
ClipRRect(
|
|
borderRadius: BorderRadius.circular(4),
|
|
child: Column(
|
|
children: [
|
|
Expanded(
|
|
child: Stack (
|
|
children: [
|
|
SizedBox.expand(
|
|
child: FittedBox(
|
|
clipBehavior: Clip.hardEdge,
|
|
fit: BoxFit.cover,
|
|
child: image
|
|
)
|
|
)
|
|
]
|
|
)
|
|
),
|
|
Divider(height: 1),
|
|
Container(
|
|
height: 44,
|
|
child: Padding(
|
|
padding: EdgeInsets.symmetric(horizontal: 6),
|
|
child:
|
|
Center(
|
|
child: AutoSizeText(widget.dashboard.title,
|
|
textAlign: TextAlign.center,
|
|
maxLines: 1,
|
|
minFontSize: 12,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: TextStyle(
|
|
fontWeight: FontWeight.w500,
|
|
fontSize: 14,
|
|
height: 20 / 14
|
|
),
|
|
)
|
|
)
|
|
),
|
|
)
|
|
],
|
|
)
|
|
);
|
|
}
|
|
|
|
}
|