Implemented update card functionlity

This commit is contained in:
Abdullah Alassaf
2024-11-26 00:43:35 +03:00
parent bbe00c0372
commit c84cfd75e4
4 changed files with 82 additions and 36 deletions

View File

@ -44,8 +44,19 @@ class RoutineBloc extends Bloc<RoutineEvent, RoutineState> {
} }
void _onAddToThenContainer(AddToThenContainer event, Emitter<RoutineState> emit) { void _onAddToThenContainer(AddToThenContainer event, Emitter<RoutineState> emit) {
final updatedThenItems = List<Map<String, dynamic>>.from(state.thenItems)..add(event.item); final currentItems = List<Map<String, dynamic>>.from(state.thenItems);
emit(state.copyWith(thenItems: updatedThenItems));
// Find the index of the item in teh current itemsList
int index =
currentItems.indexWhere((map) => map['uniqueCustomId'] == event.item['uniqueCustomId']);
// Replace the map if the index is valid
if (index != -1) {
currentItems[index] = event.item;
} else {
currentItems.add(event.item);
}
emit(state.copyWith(thenItems: currentItems));
} }
void _onAddFunctionsToRoutine(AddFunctionToRoutine event, Emitter<RoutineState> emit) { void _onAddFunctionsToRoutine(AddFunctionToRoutine event, Emitter<RoutineState> emit) {

View File

@ -8,13 +8,25 @@ import 'package:syncrow_web/pages/routiens/widgets/dialog_header.dart';
class DelayHelper { class DelayHelper {
static Future<Map<String, dynamic>?> showDelayPickerDialog( static Future<Map<String, dynamic>?> showDelayPickerDialog(
BuildContext context, String uniqueCustomId) async { BuildContext context, Map<String, dynamic> data) async {
int hours = 0; int hours = 0;
int minutes = 0; int minutes = 0;
return showDialog<Map<String, dynamic>?>( return showDialog<Map<String, dynamic>?>(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
final routineBloc = context.read<RoutineBloc>();
int totalSec = 0;
final selectedFunctionData =
routineBloc.state.selectedFunctions[data['uniqueCustomId']] ?? [];
if (selectedFunctionData.isNotEmpty) {
totalSec = selectedFunctionData[0].value;
// Convert seconds to hours and minutes
hours = totalSec ~/ 3600;
minutes = (totalSec % 3600) ~/ 60;
}
return AlertDialog( return AlertDialog(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
content: Container( content: Container(
@ -31,8 +43,7 @@ class DelayHelper {
Expanded( Expanded(
child: CupertinoTimerPicker( child: CupertinoTimerPicker(
mode: CupertinoTimerPickerMode.hm, mode: CupertinoTimerPickerMode.hm,
initialTimerDuration: initialTimerDuration: Duration(hours: hours, minutes: minutes),
Duration(hours: hours, minutes: minutes),
onTimerDurationChanged: (Duration newDuration) { onTimerDurationChanged: (Duration newDuration) {
hours = newDuration.inHours; hours = newDuration.inHours;
minutes = newDuration.inMinutes % 60; minutes = newDuration.inMinutes % 60;
@ -54,7 +65,7 @@ class DelayHelper {
value: totalSeconds, value: totalSeconds,
) )
], ],
uniqueCustomId, data['uniqueCustomId'],
)); ));
Navigator.pop(context, { Navigator.pop(context, {

View File

@ -34,11 +34,9 @@ class _ScenesAndAutomationsState extends State<ScenesAndAutomations> {
children: scenes.asMap().entries.map((entry) { children: scenes.asMap().entries.map((entry) {
final scene = entry.value; final scene = entry.value;
if (state.searchText != null && state.searchText!.isNotEmpty) { if (state.searchText != null && state.searchText!.isNotEmpty) {
return scene.name return scene.name.toLowerCase().contains(state.searchText!.toLowerCase())
.toLowerCase()
.contains(state.searchText!.toLowerCase())
? DraggableCard( ? DraggableCard(
imagePath: Assets.logo, imagePath: scene.icon ?? Assets.loginLogo,
title: scene.name, title: scene.name,
deviceData: { deviceData: {
'deviceId': scene.id, 'deviceId': scene.id,

View File

@ -25,45 +25,73 @@ class ThenContainer extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const Text('THEN', const Text('THEN', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
style: TextStyle(
fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 16), const SizedBox(height: 16),
Wrap( Wrap(
spacing: 8, spacing: 8,
runSpacing: 8, runSpacing: 8,
children: List.generate( children: List.generate(
state.thenItems.length, state.thenItems.length,
(index) => DraggableCard( (index) => GestureDetector(
imagePath: onTap: () async {
state.thenItems[index]['imagePath'] ?? '', if (state.thenItems[index]['deviceId'] == 'delay') {
title: state.thenItems[index]['title'] ?? '', final result = await DelayHelper.showDelayPickerDialog(
deviceData: state.thenItems[index], context, state.thenItems[index]);
padding: const EdgeInsets.symmetric(
horizontal: 4, vertical: 8), if (result != null) {
isFromThen: true, context.read<RoutineBloc>().add(AddToThenContainer({
isFromIf: false, ...state.thenItems[index],
onRemove: () { 'imagePath': Assets.delay,
context.read<RoutineBloc>().add( 'title': 'Delay',
RemoveDragCard( }));
index: index, isFromThen: true)); }
return;
}
final result = await DeviceDialogHelper.showDeviceDialog(
context, state.thenItems[index]);
if (result != null) {
context
.read<RoutineBloc>()
.add(AddToThenContainer(state.thenItems[index]));
} else if (!['AC', '1G', '2G', '3G']
.contains(state.thenItems[index]['productType'])) {
context
.read<RoutineBloc>()
.add(AddToThenContainer(state.thenItems[index]));
}
}, },
child: DraggableCard(
imagePath: state.thenItems[index]['imagePath'] ?? '',
title: state.thenItems[index]['title'] ?? '',
deviceData: state.thenItems[index],
padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 8),
isFromThen: true,
isFromIf: false,
onRemove: () {
context
.read<RoutineBloc>()
.add(RemoveDragCard(index: index, isFromThen: true));
},
),
))), ))),
], ],
), ),
), ),
); );
}, },
onWillAccept: (data) => data != null, // onMove: (details) {
onAccept: (data) async { // uniqueCustomId = const Uuid().v4();
// },
// onWillAccept: (data) => data != null,
onAcceptWithDetails: (data) async {
final uniqueCustomId = const Uuid().v4(); final uniqueCustomId = const Uuid().v4();
final mutableData = Map<String, dynamic>.from(data.data);
final mutableData = Map<String, dynamic>.from(data);
mutableData['uniqueCustomId'] = uniqueCustomId; mutableData['uniqueCustomId'] = uniqueCustomId;
if (mutableData['deviceId'] == 'delay') { if (mutableData['deviceId'] == 'delay') {
final result = await DelayHelper.showDelayPickerDialog( final result = await DelayHelper.showDelayPickerDialog(context, mutableData);
context, mutableData['uniqueCustomId']);
if (result != null) { if (result != null) {
context.read<RoutineBloc>().add(AddToThenContainer({ context.read<RoutineBloc>().add(AddToThenContainer({
@ -75,13 +103,11 @@ class ThenContainer extends StatelessWidget {
return; return;
} }
final result = final result = await DeviceDialogHelper.showDeviceDialog(context, mutableData);
await DeviceDialogHelper.showDeviceDialog(context, mutableData);
if (result != null) { if (result != null) {
context.read<RoutineBloc>().add(AddToThenContainer(mutableData)); context.read<RoutineBloc>().add(AddToThenContainer(mutableData));
} else if (!['AC', '1G', '2G', '3G'] } else if (!['AC', '1G', '2G', '3G'].contains(mutableData['productType'])) {
.contains(mutableData['productType'])) {
context.read<RoutineBloc>().add(AddToThenContainer(mutableData)); context.read<RoutineBloc>().add(AddToThenContainer(mutableData));
} }
}, },