Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/data/data_sources/preparation_remote_data_source.dart
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ class PreparationRemoteDataSourceImpl implements PreparationRemoteDataSource {
PreparationScheduleModifyRequestModelListExtension.fromEntityList(
preparationEntity.preparationStepList);

final result = await dio.post(
final result = await dio.put(
Endpoint.updatePreparationByScheduleId(scheduleId),
data: updateModel.map((model) => model.toJson()).toList(),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,6 @@ class _PreparationSection extends StatelessWidget {
Expanded(
child: PreparationFormCreateList(
preparationNameState: preparationNameState,
enableDismissible: true,
onNameChanged: ({required int index, required String value}) {
context.read<PreparationFormBloc>().add(
PreparationFormPreparationStepNameChanged(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,57 +4,39 @@ import 'package:on_time_front/presentation/onboarding/preparation_name_select/co
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/bloc/preparation_form_bloc.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/components/preparation_form_list_field.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/components/preparation_form_reorderable_list.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/components/preparation_form_reorderable_list_dissmissible.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/cubit/preparation_step_form_cubit.dart';

class PreparationFormCreateList extends StatelessWidget {
const PreparationFormCreateList(
{super.key,
required this.preparationNameState,
required this.onNameChanged,
required this.onCreationRequested,
this.enableDismissible = false});
required this.onCreationRequested});

final PreparationFormState preparationNameState;
final void Function({required int index, required String value})
onNameChanged;
final VoidCallback onCreationRequested;
final bool enableDismissible;

@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Column(
children: [
enableDismissible
? PreparationFormReorderableListDismissible(
preparationStepList: preparationNameState.preparationStepList,
onNameChanged: (index, value) {
onNameChanged(index: index, value: value);
},
onTimeChanged: (index, value) => context
.read<PreparationFormBloc>()
.add(PreparationFormPreparationStepTimeChanged(
index: index, preparationStepTime: value)),
onReorder: (oldIndex, newIndex) => context
.read<PreparationFormBloc>()
.add(PreparationFormPreparationStepOrderChanged(
oldIndex: oldIndex, newIndex: newIndex)),
)
: PreparationFormReorderableList(
preparationStepList: preparationNameState.preparationStepList,
onNameChanged: (index, value) {
onNameChanged(index: index, value: value);
},
onTimeChanged: (index, value) => context
.read<PreparationFormBloc>()
.add(PreparationFormPreparationStepTimeChanged(
index: index, preparationStepTime: value)),
onReorder: (oldIndex, newIndex) => context
.read<PreparationFormBloc>()
.add(PreparationFormPreparationStepOrderChanged(
oldIndex: oldIndex, newIndex: newIndex)),
),
PreparationFormReorderableList(
preparationStepList: preparationNameState.preparationStepList,
onNameChanged: (index, value) {
onNameChanged(index: index, value: value);
},
onTimeChanged: (index, value) => context
.read<PreparationFormBloc>()
.add(PreparationFormPreparationStepTimeChanged(
index: index, preparationStepTime: value)),
onReorder: (oldIndex, newIndex) => context
.read<PreparationFormBloc>()
.add(PreparationFormPreparationStepOrderChanged(
oldIndex: oldIndex, newIndex: newIndex)),
),
preparationNameState.status == PreparationFormStatus.adding
? BlocProvider<PreparationStepFormCubit>(
create: (context) => PreparationStepFormCubit(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,32 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_swipe_action_cell/core/cell.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/bloc/preparation_form_bloc.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/components/preparation_form_list_field.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/cubit/preparation_step_form_cubit.dart';

class _SwipeActionContent extends StatelessWidget {
const _SwipeActionContent({
required this.icon,
required this.color,
});

final Widget icon;
final Color color;

@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: color,
),
padding: const EdgeInsets.all(18.0),
child: icon,
);
}
}

class PreparationFormReorderableList extends StatelessWidget {
const PreparationFormReorderableList({
super.key,
Expand Down Expand Up @@ -40,16 +65,44 @@ class PreparationFormReorderableList extends StatelessWidget {
physics: NeverScrollableScrollPhysics(),
itemCount: preparationStepList.length,
itemBuilder: (context, index) {
return PreparationFormListField(
key: ValueKey<String>(preparationStepList[index].id),
index: index,
preparationStep: preparationStepList[index],
onNameChanged: (value) {
onNameChanged(index, value);
},
onPreparationTimeChanged: (value) {
onTimeChanged(index, value);
},
final step = preparationStepList[index];
final theme = Theme.of(context);

return SwipeActionCell(
key: ValueKey<String>(step.id),
backgroundColor: Colors.transparent,
trailingActions: [
SwipeAction(
onTap: (controller) {
if (preparationStepList.length <= 1) return;
context.read<PreparationFormBloc>().add(
PreparationFormPreparationStepRemoved(
preparationStepId: step.id,
),
);
},
color: Colors.transparent,
content: _SwipeActionContent(
icon: const Icon(
Icons.delete,
color: Colors.white,
size: 24,
),
color: theme.colorScheme.error,
),
),
],
child: PreparationFormListField(
key: ValueKey<String>('field_${step.id}'),
index: index,
preparationStep: step,
onNameChanged: (value) {
onNameChanged(index, value);
},
onPreparationTimeChanged: (value) {
onTimeChanged(index, value);
},
),
);
},
onReorder: (int oldIndex, int newIndex) {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:injectable/injectable.dart';
import 'package:on_time_front/domain/entities/preparation_entity.dart';

/// Shared draft state for the `/preparationEdit` flow.
///
/// The caller sets a draft before navigating. The editor overwrites it on Save.
/// The caller reads it after pop and then clears it.
@LazySingleton()
class PreparationEditDraftCubit extends Cubit<PreparationEntity?> {
PreparationEditDraftCubit() : super(null);

void setDraft(PreparationEntity draft) => emit(draft);

void clear() => emit(null);
}


Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@ import 'package:go_router/go_router.dart';
import 'package:on_time_front/core/di/di_setup.dart';
import 'package:on_time_front/domain/entities/preparation_entity.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/bloc/preparation_form_bloc.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/cubit/preparation_edit_draft_cubit.dart';
import 'package:on_time_front/presentation/schedule_create/components/top_bar.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/components/preparation_form_create_list.dart';

class PreparationEditForm extends StatefulWidget {
const PreparationEditForm({super.key, required this.preparationEntity});

final PreparationEntity preparationEntity;
const PreparationEditForm({super.key});

@override
State<PreparationEditForm> createState() => _PreparationEditFormState();
Expand All @@ -24,20 +23,25 @@ class _PreparationEditFormState extends State<PreparationEditForm> {

@override
Widget build(BuildContext context) {
final draft = getIt.get<PreparationEditDraftCubit>().state ??
const PreparationEntity(preparationStepList: []);

return Scaffold(
body: SafeArea(
child: BlocProvider<PreparationFormBloc>(
create: (context) => getIt.get<PreparationFormBloc>()
..add(PreparationFormEditRequested(
preparationEntity: widget.preparationEntity)),
..add(PreparationFormEditRequested(preparationEntity: draft)),
child: BlocBuilder<PreparationFormBloc, PreparationFormState>(
builder: (context, state) {
return Column(
children: [
TopBar(
onNextPageButtonClicked: state.isValid
? () {
context.pop(state.toPreparationEntity());
getIt
.get<PreparationEditDraftCubit>()
.setDraft(state.toPreparationEntity());
context.pop();
}
: null,
onPreviousPageButtonClicked: context.pop,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:on_time_front/domain/entities/preparation_entity.dart';
import 'package:on_time_front/core/di/di_setup.dart';
import 'package:on_time_front/presentation/app/bloc/auth/auth_bloc.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/cubit/schedule_form_spare_time_cubit.dart';
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/cubit/preparation_edit_draft_cubit.dart';
import 'package:on_time_front/presentation/shared/components/cupertino_picker_modal.dart';
import 'package:on_time_front/l10n/app_localizations.dart';
import 'package:on_time_front/presentation/shared/utils/duration_format.dart';
Expand Down Expand Up @@ -46,15 +48,25 @@ class _ScheduleSpareAndPreparingTimeFormState
controller: TextEditingController(
text: formatDuration(
context, state.totalPreparationTime)),
onTap: () async {
final PreparationEntity? updatedPreparation =
await context.push('/preparationEdit',
extra: state.preparation);
if (updatedPreparation != null) {
context
.read<ScheduleFormSpareTimeCubit>()
.preparationChanged(updatedPreparation);
}
onTap: () {
final draftCubit = getIt.get<PreparationEditDraftCubit>();
final scheduleSpareTimeCubit =
context.read<ScheduleFormSpareTimeCubit>();
final before = state.preparation ??
const PreparationEntity(preparationStepList: []);

draftCubit.setDraft(before);
context.push('/preparationEdit').then((_) {
if (!mounted) return;

final after = draftCubit.state;
if (after != null && after != before) {
scheduleSpareTimeCubit.preparationChanged(after);
}

// Avoid stale drafts leaking into the next edit session.
draftCubit.clear();
});
},
),
onSaved: (value) {},
Expand Down Expand Up @@ -96,11 +108,11 @@ class _ScheduleSpareAndPreparingTimeFormState
Padding(
padding: const EdgeInsets.only(top: 8.0, left: 16.0),
child: MessageBubble(
message: state.getOverlapMessage(context)!,
message: state.getOverlapMessage(context)!,
type: state.isOverlapError
? MessageBubbleType.error
: MessageBubbleType.warning,
),
),
),
],
);
Expand Down
Loading