feat: report transaction
This commit is contained in:
@@ -22,7 +22,7 @@ class PaymentMethodReportBloc
|
||||
(l) => emit(_Error(l)),
|
||||
(r) => emit(
|
||||
_Loaded(
|
||||
r.data,
|
||||
r.data!,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -16,7 +16,7 @@ class ProfitLossBloc extends Bloc<ProfitLossEvent, ProfitLossState> {
|
||||
dateFrom: event.startDate,
|
||||
dateTo: event.endDate,
|
||||
);
|
||||
result.fold((l) => emit(_Error(l)), (r) => emit(_Success(r.data)));
|
||||
result.fold((l) => emit(_Error(l)), (r) => emit(_Success(r.data!)));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:enaklo_pos/data/datasources/analytic_remote_datasource.dart';
|
||||
import 'package:enaklo_pos/data/datasources/outlet_local_datasource.dart';
|
||||
import 'package:enaklo_pos/data/models/response/category_analytic_response_model.dart';
|
||||
import 'package:enaklo_pos/data/models/response/payment_method_analytic_response_model.dart';
|
||||
import 'package:enaklo_pos/data/models/response/product_analytic_response_model.dart';
|
||||
import 'package:enaklo_pos/data/models/response/profit_loss_response_model.dart';
|
||||
import 'package:enaklo_pos/presentation/home/models/outlet_model.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
part 'report_event.dart';
|
||||
part 'report_state.dart';
|
||||
part 'report_bloc.freezed.dart';
|
||||
|
||||
class ReportBloc extends Bloc<ReportEvent, ReportState> {
|
||||
final AnalyticRemoteDatasource _datasource;
|
||||
ReportBloc(this._datasource) : super(ReportState.initial()) {
|
||||
on<_Get>((event, emit) async {
|
||||
emit(_Loading());
|
||||
|
||||
final outlet = await OutletLocalDatasource().get();
|
||||
|
||||
final category = await _datasource.getCategory(
|
||||
dateFrom: event.startDate, dateTo: event.endDate);
|
||||
|
||||
final product = await _datasource.getProduct(
|
||||
dateFrom: event.startDate, dateTo: event.endDate);
|
||||
|
||||
final paymentMethod = await _datasource.getPaymentMethod(
|
||||
dateFrom: event.startDate, dateTo: event.endDate);
|
||||
|
||||
final profitLoss = await _datasource.getProfitLoss(
|
||||
dateFrom: event.startDate, dateTo: event.endDate);
|
||||
|
||||
if (category.isLeft() ||
|
||||
product.isLeft() ||
|
||||
paymentMethod.isLeft() ||
|
||||
profitLoss.isLeft()) {
|
||||
emit(_Error());
|
||||
}
|
||||
|
||||
emit(_Loaded(
|
||||
outlet,
|
||||
category
|
||||
.getOrElse(
|
||||
() => CategoryAnalyticResponseModel(success: false, data: null))
|
||||
.data!,
|
||||
profitLoss
|
||||
.getOrElse(
|
||||
() => ProfitLossResponseModel(success: false, data: null))
|
||||
.data,
|
||||
paymentMethod
|
||||
.getOrElse(() =>
|
||||
PaymentMethodAnalyticResponseModel(success: false, data: null))
|
||||
.data,
|
||||
product
|
||||
.getOrElse(
|
||||
() => ProductAnalyticResponseModel(success: false, data: null))
|
||||
.data,
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,975 @@
|
||||
// coverage:ignore-file
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||
|
||||
part of 'report_bloc.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// FreezedGenerator
|
||||
// **************************************************************************
|
||||
|
||||
T _$identity<T>(T value) => value;
|
||||
|
||||
final _privateConstructorUsedError = UnsupportedError(
|
||||
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
|
||||
|
||||
/// @nodoc
|
||||
mixin _$ReportEvent {
|
||||
DateTime get startDate => throw _privateConstructorUsedError;
|
||||
DateTime get endDate => throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult when<TResult extends Object?>({
|
||||
required TResult Function(DateTime startDate, DateTime endDate) get,
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult? whenOrNull<TResult extends Object?>({
|
||||
TResult? Function(DateTime startDate, DateTime endDate)? get,
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult maybeWhen<TResult extends Object?>({
|
||||
TResult Function(DateTime startDate, DateTime endDate)? get,
|
||||
required TResult orElse(),
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult map<TResult extends Object?>({
|
||||
required TResult Function(_Get value) get,
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult? mapOrNull<TResult extends Object?>({
|
||||
TResult? Function(_Get value)? get,
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult maybeMap<TResult extends Object?>({
|
||||
TResult Function(_Get value)? get,
|
||||
required TResult orElse(),
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
|
||||
/// Create a copy of ReportEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
$ReportEventCopyWith<ReportEvent> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class $ReportEventCopyWith<$Res> {
|
||||
factory $ReportEventCopyWith(
|
||||
ReportEvent value, $Res Function(ReportEvent) then) =
|
||||
_$ReportEventCopyWithImpl<$Res, ReportEvent>;
|
||||
@useResult
|
||||
$Res call({DateTime startDate, DateTime endDate});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$ReportEventCopyWithImpl<$Res, $Val extends ReportEvent>
|
||||
implements $ReportEventCopyWith<$Res> {
|
||||
_$ReportEventCopyWithImpl(this._value, this._then);
|
||||
|
||||
// ignore: unused_field
|
||||
final $Val _value;
|
||||
// ignore: unused_field
|
||||
final $Res Function($Val) _then;
|
||||
|
||||
/// Create a copy of ReportEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? startDate = null,
|
||||
Object? endDate = null,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
startDate: null == startDate
|
||||
? _value.startDate
|
||||
: startDate // ignore: cast_nullable_to_non_nullable
|
||||
as DateTime,
|
||||
endDate: null == endDate
|
||||
? _value.endDate
|
||||
: endDate // ignore: cast_nullable_to_non_nullable
|
||||
as DateTime,
|
||||
) as $Val);
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$GetImplCopyWith<$Res> implements $ReportEventCopyWith<$Res> {
|
||||
factory _$$GetImplCopyWith(_$GetImpl value, $Res Function(_$GetImpl) then) =
|
||||
__$$GetImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call({DateTime startDate, DateTime endDate});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$GetImplCopyWithImpl<$Res>
|
||||
extends _$ReportEventCopyWithImpl<$Res, _$GetImpl>
|
||||
implements _$$GetImplCopyWith<$Res> {
|
||||
__$$GetImplCopyWithImpl(_$GetImpl _value, $Res Function(_$GetImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of ReportEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? startDate = null,
|
||||
Object? endDate = null,
|
||||
}) {
|
||||
return _then(_$GetImpl(
|
||||
startDate: null == startDate
|
||||
? _value.startDate
|
||||
: startDate // ignore: cast_nullable_to_non_nullable
|
||||
as DateTime,
|
||||
endDate: null == endDate
|
||||
? _value.endDate
|
||||
: endDate // ignore: cast_nullable_to_non_nullable
|
||||
as DateTime,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
class _$GetImpl implements _Get {
|
||||
const _$GetImpl({required this.startDate, required this.endDate});
|
||||
|
||||
@override
|
||||
final DateTime startDate;
|
||||
@override
|
||||
final DateTime endDate;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ReportEvent.get(startDate: $startDate, endDate: $endDate)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$GetImpl &&
|
||||
(identical(other.startDate, startDate) ||
|
||||
other.startDate == startDate) &&
|
||||
(identical(other.endDate, endDate) || other.endDate == endDate));
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType, startDate, endDate);
|
||||
|
||||
/// Create a copy of ReportEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$GetImplCopyWith<_$GetImpl> get copyWith =>
|
||||
__$$GetImplCopyWithImpl<_$GetImpl>(this, _$identity);
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult when<TResult extends Object?>({
|
||||
required TResult Function(DateTime startDate, DateTime endDate) get,
|
||||
}) {
|
||||
return get(startDate, endDate);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult? whenOrNull<TResult extends Object?>({
|
||||
TResult? Function(DateTime startDate, DateTime endDate)? get,
|
||||
}) {
|
||||
return get?.call(startDate, endDate);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult maybeWhen<TResult extends Object?>({
|
||||
TResult Function(DateTime startDate, DateTime endDate)? get,
|
||||
required TResult orElse(),
|
||||
}) {
|
||||
if (get != null) {
|
||||
return get(startDate, endDate);
|
||||
}
|
||||
return orElse();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult map<TResult extends Object?>({
|
||||
required TResult Function(_Get value) get,
|
||||
}) {
|
||||
return get(this);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult? mapOrNull<TResult extends Object?>({
|
||||
TResult? Function(_Get value)? get,
|
||||
}) {
|
||||
return get?.call(this);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult maybeMap<TResult extends Object?>({
|
||||
TResult Function(_Get value)? get,
|
||||
required TResult orElse(),
|
||||
}) {
|
||||
if (get != null) {
|
||||
return get(this);
|
||||
}
|
||||
return orElse();
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _Get implements ReportEvent {
|
||||
const factory _Get(
|
||||
{required final DateTime startDate,
|
||||
required final DateTime endDate}) = _$GetImpl;
|
||||
|
||||
@override
|
||||
DateTime get startDate;
|
||||
@override
|
||||
DateTime get endDate;
|
||||
|
||||
/// Create a copy of ReportEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@override
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
_$$GetImplCopyWith<_$GetImpl> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
mixin _$ReportState {
|
||||
@optionalTypeArgs
|
||||
TResult when<TResult extends Object?>({
|
||||
required TResult Function() initial,
|
||||
required TResult Function() loading,
|
||||
required TResult Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)
|
||||
loaded,
|
||||
required TResult Function() error,
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult? whenOrNull<TResult extends Object?>({
|
||||
TResult? Function()? initial,
|
||||
TResult? Function()? loading,
|
||||
TResult? Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)?
|
||||
loaded,
|
||||
TResult? Function()? error,
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult maybeWhen<TResult extends Object?>({
|
||||
TResult Function()? initial,
|
||||
TResult Function()? loading,
|
||||
TResult Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)?
|
||||
loaded,
|
||||
TResult Function()? error,
|
||||
required TResult orElse(),
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult map<TResult extends Object?>({
|
||||
required TResult Function(_Initial value) initial,
|
||||
required TResult Function(_Loading value) loading,
|
||||
required TResult Function(_Loaded value) loaded,
|
||||
required TResult Function(_Error value) error,
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult? mapOrNull<TResult extends Object?>({
|
||||
TResult? Function(_Initial value)? initial,
|
||||
TResult? Function(_Loading value)? loading,
|
||||
TResult? Function(_Loaded value)? loaded,
|
||||
TResult? Function(_Error value)? error,
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
@optionalTypeArgs
|
||||
TResult maybeMap<TResult extends Object?>({
|
||||
TResult Function(_Initial value)? initial,
|
||||
TResult Function(_Loading value)? loading,
|
||||
TResult Function(_Loaded value)? loaded,
|
||||
TResult Function(_Error value)? error,
|
||||
required TResult orElse(),
|
||||
}) =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class $ReportStateCopyWith<$Res> {
|
||||
factory $ReportStateCopyWith(
|
||||
ReportState value, $Res Function(ReportState) then) =
|
||||
_$ReportStateCopyWithImpl<$Res, ReportState>;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$ReportStateCopyWithImpl<$Res, $Val extends ReportState>
|
||||
implements $ReportStateCopyWith<$Res> {
|
||||
_$ReportStateCopyWithImpl(this._value, this._then);
|
||||
|
||||
// ignore: unused_field
|
||||
final $Val _value;
|
||||
// ignore: unused_field
|
||||
final $Res Function($Val) _then;
|
||||
|
||||
/// Create a copy of ReportState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$InitialImplCopyWith<$Res> {
|
||||
factory _$$InitialImplCopyWith(
|
||||
_$InitialImpl value, $Res Function(_$InitialImpl) then) =
|
||||
__$$InitialImplCopyWithImpl<$Res>;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$InitialImplCopyWithImpl<$Res>
|
||||
extends _$ReportStateCopyWithImpl<$Res, _$InitialImpl>
|
||||
implements _$$InitialImplCopyWith<$Res> {
|
||||
__$$InitialImplCopyWithImpl(
|
||||
_$InitialImpl _value, $Res Function(_$InitialImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of ReportState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
class _$InitialImpl implements _Initial {
|
||||
const _$InitialImpl();
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ReportState.initial()';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType && other is _$InitialImpl);
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => runtimeType.hashCode;
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult when<TResult extends Object?>({
|
||||
required TResult Function() initial,
|
||||
required TResult Function() loading,
|
||||
required TResult Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)
|
||||
loaded,
|
||||
required TResult Function() error,
|
||||
}) {
|
||||
return initial();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult? whenOrNull<TResult extends Object?>({
|
||||
TResult? Function()? initial,
|
||||
TResult? Function()? loading,
|
||||
TResult? Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)?
|
||||
loaded,
|
||||
TResult? Function()? error,
|
||||
}) {
|
||||
return initial?.call();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult maybeWhen<TResult extends Object?>({
|
||||
TResult Function()? initial,
|
||||
TResult Function()? loading,
|
||||
TResult Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)?
|
||||
loaded,
|
||||
TResult Function()? error,
|
||||
required TResult orElse(),
|
||||
}) {
|
||||
if (initial != null) {
|
||||
return initial();
|
||||
}
|
||||
return orElse();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult map<TResult extends Object?>({
|
||||
required TResult Function(_Initial value) initial,
|
||||
required TResult Function(_Loading value) loading,
|
||||
required TResult Function(_Loaded value) loaded,
|
||||
required TResult Function(_Error value) error,
|
||||
}) {
|
||||
return initial(this);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult? mapOrNull<TResult extends Object?>({
|
||||
TResult? Function(_Initial value)? initial,
|
||||
TResult? Function(_Loading value)? loading,
|
||||
TResult? Function(_Loaded value)? loaded,
|
||||
TResult? Function(_Error value)? error,
|
||||
}) {
|
||||
return initial?.call(this);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult maybeMap<TResult extends Object?>({
|
||||
TResult Function(_Initial value)? initial,
|
||||
TResult Function(_Loading value)? loading,
|
||||
TResult Function(_Loaded value)? loaded,
|
||||
TResult Function(_Error value)? error,
|
||||
required TResult orElse(),
|
||||
}) {
|
||||
if (initial != null) {
|
||||
return initial(this);
|
||||
}
|
||||
return orElse();
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _Initial implements ReportState {
|
||||
const factory _Initial() = _$InitialImpl;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$LoadingImplCopyWith<$Res> {
|
||||
factory _$$LoadingImplCopyWith(
|
||||
_$LoadingImpl value, $Res Function(_$LoadingImpl) then) =
|
||||
__$$LoadingImplCopyWithImpl<$Res>;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$LoadingImplCopyWithImpl<$Res>
|
||||
extends _$ReportStateCopyWithImpl<$Res, _$LoadingImpl>
|
||||
implements _$$LoadingImplCopyWith<$Res> {
|
||||
__$$LoadingImplCopyWithImpl(
|
||||
_$LoadingImpl _value, $Res Function(_$LoadingImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of ReportState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
class _$LoadingImpl implements _Loading {
|
||||
const _$LoadingImpl();
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ReportState.loading()';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType && other is _$LoadingImpl);
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => runtimeType.hashCode;
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult when<TResult extends Object?>({
|
||||
required TResult Function() initial,
|
||||
required TResult Function() loading,
|
||||
required TResult Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)
|
||||
loaded,
|
||||
required TResult Function() error,
|
||||
}) {
|
||||
return loading();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult? whenOrNull<TResult extends Object?>({
|
||||
TResult? Function()? initial,
|
||||
TResult? Function()? loading,
|
||||
TResult? Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)?
|
||||
loaded,
|
||||
TResult? Function()? error,
|
||||
}) {
|
||||
return loading?.call();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult maybeWhen<TResult extends Object?>({
|
||||
TResult Function()? initial,
|
||||
TResult Function()? loading,
|
||||
TResult Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)?
|
||||
loaded,
|
||||
TResult Function()? error,
|
||||
required TResult orElse(),
|
||||
}) {
|
||||
if (loading != null) {
|
||||
return loading();
|
||||
}
|
||||
return orElse();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult map<TResult extends Object?>({
|
||||
required TResult Function(_Initial value) initial,
|
||||
required TResult Function(_Loading value) loading,
|
||||
required TResult Function(_Loaded value) loaded,
|
||||
required TResult Function(_Error value) error,
|
||||
}) {
|
||||
return loading(this);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult? mapOrNull<TResult extends Object?>({
|
||||
TResult? Function(_Initial value)? initial,
|
||||
TResult? Function(_Loading value)? loading,
|
||||
TResult? Function(_Loaded value)? loaded,
|
||||
TResult? Function(_Error value)? error,
|
||||
}) {
|
||||
return loading?.call(this);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult maybeMap<TResult extends Object?>({
|
||||
TResult Function(_Initial value)? initial,
|
||||
TResult Function(_Loading value)? loading,
|
||||
TResult Function(_Loaded value)? loaded,
|
||||
TResult Function(_Error value)? error,
|
||||
required TResult orElse(),
|
||||
}) {
|
||||
if (loading != null) {
|
||||
return loading(this);
|
||||
}
|
||||
return orElse();
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _Loading implements ReportState {
|
||||
const factory _Loading() = _$LoadingImpl;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$LoadedImplCopyWith<$Res> {
|
||||
factory _$$LoadedImplCopyWith(
|
||||
_$LoadedImpl value, $Res Function(_$LoadedImpl) then) =
|
||||
__$$LoadedImplCopyWithImpl<$Res>;
|
||||
@useResult
|
||||
$Res call(
|
||||
{Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$LoadedImplCopyWithImpl<$Res>
|
||||
extends _$ReportStateCopyWithImpl<$Res, _$LoadedImpl>
|
||||
implements _$$LoadedImplCopyWith<$Res> {
|
||||
__$$LoadedImplCopyWithImpl(
|
||||
_$LoadedImpl _value, $Res Function(_$LoadedImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of ReportState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? outlet = null,
|
||||
Object? categoryAnalyticData = freezed,
|
||||
Object? profitLossData = freezed,
|
||||
Object? paymentMethodAnalyticData = freezed,
|
||||
Object? productAnalyticData = freezed,
|
||||
}) {
|
||||
return _then(_$LoadedImpl(
|
||||
null == outlet
|
||||
? _value.outlet
|
||||
: outlet // ignore: cast_nullable_to_non_nullable
|
||||
as Outlet,
|
||||
freezed == categoryAnalyticData
|
||||
? _value.categoryAnalyticData
|
||||
: categoryAnalyticData // ignore: cast_nullable_to_non_nullable
|
||||
as CategoryAnalyticData?,
|
||||
freezed == profitLossData
|
||||
? _value.profitLossData
|
||||
: profitLossData // ignore: cast_nullable_to_non_nullable
|
||||
as ProfitLossData?,
|
||||
freezed == paymentMethodAnalyticData
|
||||
? _value.paymentMethodAnalyticData
|
||||
: paymentMethodAnalyticData // ignore: cast_nullable_to_non_nullable
|
||||
as PaymentMethodAnalyticData?,
|
||||
freezed == productAnalyticData
|
||||
? _value.productAnalyticData
|
||||
: productAnalyticData // ignore: cast_nullable_to_non_nullable
|
||||
as ProductAnalyticData?,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
class _$LoadedImpl implements _Loaded {
|
||||
const _$LoadedImpl(
|
||||
this.outlet,
|
||||
this.categoryAnalyticData,
|
||||
this.profitLossData,
|
||||
this.paymentMethodAnalyticData,
|
||||
this.productAnalyticData);
|
||||
|
||||
@override
|
||||
final Outlet outlet;
|
||||
@override
|
||||
final CategoryAnalyticData? categoryAnalyticData;
|
||||
@override
|
||||
final ProfitLossData? profitLossData;
|
||||
@override
|
||||
final PaymentMethodAnalyticData? paymentMethodAnalyticData;
|
||||
@override
|
||||
final ProductAnalyticData? productAnalyticData;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ReportState.loaded(outlet: $outlet, categoryAnalyticData: $categoryAnalyticData, profitLossData: $profitLossData, paymentMethodAnalyticData: $paymentMethodAnalyticData, productAnalyticData: $productAnalyticData)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$LoadedImpl &&
|
||||
(identical(other.outlet, outlet) || other.outlet == outlet) &&
|
||||
(identical(other.categoryAnalyticData, categoryAnalyticData) ||
|
||||
other.categoryAnalyticData == categoryAnalyticData) &&
|
||||
(identical(other.profitLossData, profitLossData) ||
|
||||
other.profitLossData == profitLossData) &&
|
||||
(identical(other.paymentMethodAnalyticData,
|
||||
paymentMethodAnalyticData) ||
|
||||
other.paymentMethodAnalyticData == paymentMethodAnalyticData) &&
|
||||
(identical(other.productAnalyticData, productAnalyticData) ||
|
||||
other.productAnalyticData == productAnalyticData));
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType, outlet, categoryAnalyticData,
|
||||
profitLossData, paymentMethodAnalyticData, productAnalyticData);
|
||||
|
||||
/// Create a copy of ReportState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$LoadedImplCopyWith<_$LoadedImpl> get copyWith =>
|
||||
__$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity);
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult when<TResult extends Object?>({
|
||||
required TResult Function() initial,
|
||||
required TResult Function() loading,
|
||||
required TResult Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)
|
||||
loaded,
|
||||
required TResult Function() error,
|
||||
}) {
|
||||
return loaded(outlet, categoryAnalyticData, profitLossData,
|
||||
paymentMethodAnalyticData, productAnalyticData);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult? whenOrNull<TResult extends Object?>({
|
||||
TResult? Function()? initial,
|
||||
TResult? Function()? loading,
|
||||
TResult? Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)?
|
||||
loaded,
|
||||
TResult? Function()? error,
|
||||
}) {
|
||||
return loaded?.call(outlet, categoryAnalyticData, profitLossData,
|
||||
paymentMethodAnalyticData, productAnalyticData);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult maybeWhen<TResult extends Object?>({
|
||||
TResult Function()? initial,
|
||||
TResult Function()? loading,
|
||||
TResult Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)?
|
||||
loaded,
|
||||
TResult Function()? error,
|
||||
required TResult orElse(),
|
||||
}) {
|
||||
if (loaded != null) {
|
||||
return loaded(outlet, categoryAnalyticData, profitLossData,
|
||||
paymentMethodAnalyticData, productAnalyticData);
|
||||
}
|
||||
return orElse();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult map<TResult extends Object?>({
|
||||
required TResult Function(_Initial value) initial,
|
||||
required TResult Function(_Loading value) loading,
|
||||
required TResult Function(_Loaded value) loaded,
|
||||
required TResult Function(_Error value) error,
|
||||
}) {
|
||||
return loaded(this);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult? mapOrNull<TResult extends Object?>({
|
||||
TResult? Function(_Initial value)? initial,
|
||||
TResult? Function(_Loading value)? loading,
|
||||
TResult? Function(_Loaded value)? loaded,
|
||||
TResult? Function(_Error value)? error,
|
||||
}) {
|
||||
return loaded?.call(this);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult maybeMap<TResult extends Object?>({
|
||||
TResult Function(_Initial value)? initial,
|
||||
TResult Function(_Loading value)? loading,
|
||||
TResult Function(_Loaded value)? loaded,
|
||||
TResult Function(_Error value)? error,
|
||||
required TResult orElse(),
|
||||
}) {
|
||||
if (loaded != null) {
|
||||
return loaded(this);
|
||||
}
|
||||
return orElse();
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _Loaded implements ReportState {
|
||||
const factory _Loaded(
|
||||
final Outlet outlet,
|
||||
final CategoryAnalyticData? categoryAnalyticData,
|
||||
final ProfitLossData? profitLossData,
|
||||
final PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
final ProductAnalyticData? productAnalyticData) = _$LoadedImpl;
|
||||
|
||||
Outlet get outlet;
|
||||
CategoryAnalyticData? get categoryAnalyticData;
|
||||
ProfitLossData? get profitLossData;
|
||||
PaymentMethodAnalyticData? get paymentMethodAnalyticData;
|
||||
ProductAnalyticData? get productAnalyticData;
|
||||
|
||||
/// Create a copy of ReportState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
_$$LoadedImplCopyWith<_$LoadedImpl> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$ErrorImplCopyWith<$Res> {
|
||||
factory _$$ErrorImplCopyWith(
|
||||
_$ErrorImpl value, $Res Function(_$ErrorImpl) then) =
|
||||
__$$ErrorImplCopyWithImpl<$Res>;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$ErrorImplCopyWithImpl<$Res>
|
||||
extends _$ReportStateCopyWithImpl<$Res, _$ErrorImpl>
|
||||
implements _$$ErrorImplCopyWith<$Res> {
|
||||
__$$ErrorImplCopyWithImpl(
|
||||
_$ErrorImpl _value, $Res Function(_$ErrorImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of ReportState
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
class _$ErrorImpl implements _Error {
|
||||
const _$ErrorImpl();
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ReportState.error()';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType && other is _$ErrorImpl);
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => runtimeType.hashCode;
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult when<TResult extends Object?>({
|
||||
required TResult Function() initial,
|
||||
required TResult Function() loading,
|
||||
required TResult Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)
|
||||
loaded,
|
||||
required TResult Function() error,
|
||||
}) {
|
||||
return error();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult? whenOrNull<TResult extends Object?>({
|
||||
TResult? Function()? initial,
|
||||
TResult? Function()? loading,
|
||||
TResult? Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)?
|
||||
loaded,
|
||||
TResult? Function()? error,
|
||||
}) {
|
||||
return error?.call();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult maybeWhen<TResult extends Object?>({
|
||||
TResult Function()? initial,
|
||||
TResult Function()? loading,
|
||||
TResult Function(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData)?
|
||||
loaded,
|
||||
TResult Function()? error,
|
||||
required TResult orElse(),
|
||||
}) {
|
||||
if (error != null) {
|
||||
return error();
|
||||
}
|
||||
return orElse();
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult map<TResult extends Object?>({
|
||||
required TResult Function(_Initial value) initial,
|
||||
required TResult Function(_Loading value) loading,
|
||||
required TResult Function(_Loaded value) loaded,
|
||||
required TResult Function(_Error value) error,
|
||||
}) {
|
||||
return error(this);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult? mapOrNull<TResult extends Object?>({
|
||||
TResult? Function(_Initial value)? initial,
|
||||
TResult? Function(_Loading value)? loading,
|
||||
TResult? Function(_Loaded value)? loaded,
|
||||
TResult? Function(_Error value)? error,
|
||||
}) {
|
||||
return error?.call(this);
|
||||
}
|
||||
|
||||
@override
|
||||
@optionalTypeArgs
|
||||
TResult maybeMap<TResult extends Object?>({
|
||||
TResult Function(_Initial value)? initial,
|
||||
TResult Function(_Loading value)? loading,
|
||||
TResult Function(_Loaded value)? loaded,
|
||||
TResult Function(_Error value)? error,
|
||||
required TResult orElse(),
|
||||
}) {
|
||||
if (error != null) {
|
||||
return error(this);
|
||||
}
|
||||
return orElse();
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _Error implements ReportState {
|
||||
const factory _Error() = _$ErrorImpl;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
part of 'report_bloc.dart';
|
||||
|
||||
@freezed
|
||||
class ReportEvent with _$ReportEvent {
|
||||
const factory ReportEvent.get({
|
||||
required DateTime startDate,
|
||||
required DateTime endDate,
|
||||
}) = _Get;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
part of 'report_bloc.dart';
|
||||
|
||||
@freezed
|
||||
class ReportState with _$ReportState {
|
||||
const factory ReportState.initial() = _Initial;
|
||||
const factory ReportState.loading() = _Loading;
|
||||
const factory ReportState.loaded(
|
||||
Outlet outlet,
|
||||
CategoryAnalyticData? categoryAnalyticData,
|
||||
ProfitLossData? profitLossData,
|
||||
PaymentMethodAnalyticData? paymentMethodAnalyticData,
|
||||
ProductAnalyticData? productAnalyticData,
|
||||
) = _Loaded;
|
||||
const factory ReportState.error() = _Error;
|
||||
}
|
||||
@@ -1,7 +1,11 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
|
||||
import 'package:enaklo_pos/core/utils/helper_pdf_service.dart';
|
||||
import 'package:enaklo_pos/core/utils/permession_handler.dart';
|
||||
import 'package:enaklo_pos/core/utils/transaction_report.dart';
|
||||
import 'package:enaklo_pos/presentation/report/blocs/profit_loss/profit_loss_bloc.dart';
|
||||
import 'package:enaklo_pos/presentation/report/blocs/report/report_bloc.dart';
|
||||
import 'package:enaklo_pos/presentation/report/widgets/dashboard_analytic_widget.dart';
|
||||
import 'package:enaklo_pos/presentation/report/widgets/profit_loss_widget.dart';
|
||||
import 'package:enaklo_pos/presentation/sales/pages/sales_page.dart';
|
||||
@@ -44,6 +48,9 @@ class _ReportPageState extends State<ReportPage> {
|
||||
context.read<SummaryBloc>().add(
|
||||
SummaryEvent.getSummary(fromDate, toDate),
|
||||
);
|
||||
context.read<ReportBloc>().add(
|
||||
ReportEvent.get(startDate: fromDate, endDate: toDate),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -64,12 +71,14 @@ class _ReportPageState extends State<ReportPage> {
|
||||
initialDate: fromDate,
|
||||
onDateSelected: (selectedDate) {
|
||||
fromDate = selectedDate;
|
||||
|
||||
context.read<ReportBloc>().add(
|
||||
ReportEvent.get(startDate: fromDate, endDate: toDate),
|
||||
);
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
),
|
||||
const SpaceWidth(24.0),
|
||||
const SpaceWidth(12.0),
|
||||
SizedBox(
|
||||
width: 300,
|
||||
child: CustomDatePicker(
|
||||
@@ -77,6 +86,9 @@ class _ReportPageState extends State<ReportPage> {
|
||||
initialDate: toDate,
|
||||
onDateSelected: (selectedDate) {
|
||||
toDate = selectedDate;
|
||||
context.read<ReportBloc>().add(
|
||||
ReportEvent.get(startDate: fromDate, endDate: toDate),
|
||||
);
|
||||
setState(() {});
|
||||
// context.read<TransactionReportBloc>().add(
|
||||
// TransactionReportEvent.getReport(
|
||||
@@ -97,6 +109,72 @@ class _ReportPageState extends State<ReportPage> {
|
||||
},
|
||||
),
|
||||
),
|
||||
const SpaceWidth(12.0),
|
||||
BlocBuilder<ReportBloc, ReportState>(
|
||||
builder: (context, state) {
|
||||
return state.maybeWhen(
|
||||
orElse: () => SizedBox.shrink(),
|
||||
loading: () => SizedBox(
|
||||
height: 24,
|
||||
width: 24,
|
||||
child: const CircularProgressIndicator(),
|
||||
),
|
||||
loaded: (outlet, categoryAnalyticData, profitLossData,
|
||||
paymentMethodAnalyticData, productAnalyticData) =>
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
try {
|
||||
final status =
|
||||
await PermessionHelper().checkPermission();
|
||||
if (status) {
|
||||
final pdfFile = await TransactionReport.previewPdf(
|
||||
outlet: outlet,
|
||||
searchDateFormatted: searchDateFormatted,
|
||||
categoryAnalyticData: categoryAnalyticData,
|
||||
profitLossData: profitLossData,
|
||||
paymentMethodAnalyticData:
|
||||
paymentMethodAnalyticData,
|
||||
productAnalyticData: productAnalyticData,
|
||||
);
|
||||
log("pdfFile: $pdfFile");
|
||||
await HelperPdfService.openFile(pdfFile);
|
||||
} else {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(
|
||||
content: Text(
|
||||
'Storage permission is required to save PDF'),
|
||||
backgroundColor: Colors.red,
|
||||
),
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
log("Error generating PDF: $e");
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text('Failed to generate PDF: $e'),
|
||||
backgroundColor: Colors.red,
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 12.0, vertical: 8.0),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(6.0),
|
||||
border: Border.all(
|
||||
color: AppColors.stroke,
|
||||
)),
|
||||
child: Icon(
|
||||
Icons.download,
|
||||
color: AppColors.primary,
|
||||
size: 28,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
Expanded(
|
||||
|
||||
@@ -51,6 +51,8 @@ class ReportTitle extends StatelessWidget {
|
||||
),
|
||||
if (actionWidget != null)
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: actionWidget!,
|
||||
),
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user