subspace model

This commit is contained in:
hannathkadher
2025-01-05 11:45:05 +04:00
parent 944b981ee0
commit 90e5499f92
16 changed files with 346 additions and 148 deletions

View File

@ -1,12 +1,15 @@
import 'package:flutter/material.dart';
import 'package:syncrow_web/pages/common/buttons/cancel_button.dart';
import 'package:syncrow_web/pages/common/buttons/default_button.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/widgets/add_device_type_widget.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/widgets/dialog/create_subspace_model_dialog.dart';
import 'package:syncrow_web/utils/color_manager.dart';
class CreateSpaceModelDialog extends StatelessWidget {
const CreateSpaceModelDialog({Key? key}) : super(key: key);
final List<ProductModel>? products;
const CreateSpaceModelDialog({Key? key, this.products}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -50,94 +53,54 @@ class CreateSpaceModelDialog extends StatelessWidget {
),
),
const SizedBox(height: 16),
GestureDetector(
onTap: () async {
final result = await showDialog(
TextButton(
onPressed: () async {
final result = await showDialog<String>(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return CreateSubSpaceModelDialog(
return const CreateSubSpaceModelDialog(
isEdit: true,
dialogTitle: 'Create Sub-space',
existingSubSpaces: [
SubspaceTemplateModel(
subspaceName: "Living Room",
disabled: false,
uuid: "mkmkl,",
),
],
);
},
);
if (result == true) {}
if (result != null && result.isNotEmpty) {
// Handle the result if necessary
print('Subspace created: $result');
}
},
child: SizedBox(
width: screenWidth * 0.25,
child: Container(
decoration: BoxDecoration(
color: ColorsManager.textFieldGreyColor,
border: Border.all(
color: ColorsManager.neutralGray,
width: 3.0,
),
borderRadius: BorderRadius.circular(20),
),
child: const Padding(
padding:
EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0),
child: Row(
children: [
Icon(
Icons.add,
color: ColorsManager.spaceColor,
),
SizedBox(width: 10),
Expanded(
child: Text(
'Create sub space',
style: TextStyle(
color: ColorsManager.blackColor,
fontSize: 16,
),
),
),
],
),
),
),
style: TextButton.styleFrom(
padding: EdgeInsets.zero,
),
child: _buildButtonContent(
context,
icon: Icons.add,
label: 'Create Sub Space',
),
),
const SizedBox(height: 10),
SizedBox(
width: screenWidth * 0.25,
child: Container(
decoration: BoxDecoration(
color: ColorsManager.textFieldGreyColor,
border:
Border.all(color: ColorsManager.neutralGray, width: 3.0),
borderRadius: BorderRadius.circular(20),
),
child: const Padding(
padding:
EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0),
child: Row(
children: [
Icon(
Icons.add,
color: ColorsManager.spaceColor,
),
SizedBox(width: 10),
Expanded(
child: Text(
'Add devices',
style: TextStyle(
color: ColorsManager.blackColor,
fontSize: 16,
),
),
),
],
TextButton(
onPressed: () async {
final result = await showDialog<bool>(
barrierDismissible: false,
context: context,
builder: (context) => AddDeviceWidget(
products: products,
),
),
);
if (result == true) {
// Handle the result if necessary
print('Devices added successfully');
}
},
style: TextButton.styleFrom(
padding: EdgeInsets.zero,
),
child: _buildButtonContent(
context,
icon: Icons.add,
label: 'Add Devices',
),
),
const SizedBox(height: 20),
@ -146,14 +109,17 @@ class CreateSpaceModelDialog extends StatelessWidget {
child: Row(
children: [
Expanded(
child: CancelButton(
label: 'Cancel',
onPressed: () => Navigator.of(context).pop(),
)),
child: CancelButton(
label: 'Cancel',
onPressed: () => Navigator.of(context).pop(),
),
),
const SizedBox(width: 10),
Expanded(
child: DefaultButton(
onPressed: () {},
onPressed: () {
Navigator.of(context).pop();
},
backgroundColor: ColorsManager.secondaryColor,
borderRadius: 10,
foregroundColor: ColorsManager.whiteColors,
@ -162,10 +128,50 @@ class CreateSpaceModelDialog extends StatelessWidget {
),
],
),
)
),
],
),
),
);
}
Widget _buildButtonContent(BuildContext context,
{required IconData icon, required String label}) {
final screenWidth = MediaQuery.of(context).size.width;
return SizedBox(
width: screenWidth * 0.25,
child: Container(
decoration: BoxDecoration(
color: ColorsManager.textFieldGreyColor,
border: Border.all(
color: ColorsManager.neutralGray,
width: 3.0,
),
borderRadius: BorderRadius.circular(20),
),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0),
child: Row(
children: [
Icon(
icon,
color: ColorsManager.spaceColor,
),
const SizedBox(width: 10),
Expanded(
child: Text(
label,
style: const TextStyle(
color: ColorsManager.blackColor,
fontSize: 16,
),
),
),
],
),
),
),
);
}
}

View File

@ -3,13 +3,15 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/common/buttons/cancel_button.dart';
import 'package:syncrow_web/pages/common/buttons/default_button.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/subspace_model_bloc.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/subspace_model_event.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/subspace_model_state.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart';
import 'package:syncrow_web/utils/color_manager.dart';
class CreateSubSpaceModelDialog extends StatefulWidget {
final bool isEdit; // Flag to determine if it's edit or create
final String dialogTitle; // Title for the dialog
final List<SubspaceTemplateModel>? existingSubSpaces; // For edit mode
final bool isEdit;
final String dialogTitle;
final List<SubspaceTemplateModel>? existingSubSpaces;
const CreateSubSpaceModelDialog({
super.key,
@ -52,8 +54,17 @@ class _CreateSubSpaceModelDialogState extends State<CreateSubSpaceModelDialog> {
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
child: BlocProvider(
create: (_) => SubSpaceModelBloc(),
create: (_) {
final bloc = SubSpaceModelBloc();
if (widget.existingSubSpaces != null) {
for (var subSpace in widget.existingSubSpaces!) {
bloc.add(AddSubSpaceModel(subSpace));
}
}
return bloc;
},
child: BlocBuilder<SubSpaceModelBloc, SubSpaceModelState>(
builder: (context, state) {
return SizedBox(

View File

@ -13,16 +13,20 @@ class SpaceModelCardWidget extends StatelessWidget {
Widget build(BuildContext context) {
final Map<String, int> productTagCount = {};
for (var tag in model.tags) {
final prodIcon = tag.product?.icon ?? 'Unknown';
productTagCount[prodIcon] = (productTagCount[prodIcon] ?? 0) + 1;
if (model.tags != null) {
for (var tag in model.tags!) {
final prodIcon = tag.product?.icon ?? 'Unknown';
productTagCount[prodIcon] = (productTagCount[prodIcon] ?? 0) + 1;
}
}
for (var subspace in model.subspaceModels) {
if (subspace.tags != null) {
for (var tag in subspace.tags!) {
final prodIcon = tag.product?.icon ?? 'Unknown';
productTagCount[prodIcon] = (productTagCount[prodIcon] ?? 0) + 1;
if (model.subspaceModels != null) {
for (var subspace in model.subspaceModels!) {
if (subspace.tags != null) {
for (var tag in subspace.tags!) {
final prodIcon = tag.product?.icon ?? 'Unknown';
productTagCount[prodIcon] = (productTagCount[prodIcon] ?? 0) + 1;
}
}
}
}
@ -65,7 +69,7 @@ class SpaceModelCardWidget extends StatelessWidget {
spacing: 3.0,
runSpacing: 3.0,
children: [
for (var subspace in model.subspaceModels.take(3))
for (var subspace in model.subspaceModels!.take(3))
SubspaceChipWidget(subspace: subspace.subspaceName),
],
),