added project tags to all dialogs

This commit is contained in:
hannathkadher
2025-03-05 21:26:36 +04:00
parent 213ec329c0
commit 5cea8eddb3
7 changed files with 134 additions and 200 deletions

View File

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/widgets/device_managment_body.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/widgets/device_managment_body.dart';
import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.dart'; import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.dart';

View File

@ -6,8 +6,9 @@ import 'package:syncrow_web/pages/spaces_management/assign_tag_models/bloc/assig
class AssignTagModelBloc class AssignTagModelBloc
extends Bloc<AssignTagModelEvent, AssignTagModelState> { extends Bloc<AssignTagModelEvent, AssignTagModelState> {
final List<String> allTags; final List<String> allTags;
final List<Tag> projectTags;
AssignTagModelBloc(this.allTags) : super(AssignTagModelInitial()) { AssignTagModelBloc(this.allTags, this.projectTags) : super(AssignTagModelInitial()) {
on<InitializeTagModels>((event, emit) { on<InitializeTagModels>((event, emit) {
final initialTags = event.initialTags ?? []; final initialTags = event.initialTags ?? [];

View File

@ -32,6 +32,7 @@ class AssignTagModelsDialog extends StatelessWidget {
final BuildContext? pageContext; final BuildContext? pageContext;
final List<String>? otherSpaceModels; final List<String>? otherSpaceModels;
final List<SpaceTemplateModel>? allSpaceModels; final List<SpaceTemplateModel>? allSpaceModels;
final List<Tag> projectTags;
const AssignTagModelsDialog( const AssignTagModelsDialog(
{Key? key, {Key? key,
@ -46,18 +47,18 @@ class AssignTagModelsDialog extends StatelessWidget {
this.pageContext, this.pageContext,
this.otherSpaceModels, this.otherSpaceModels,
this.spaceModel, this.spaceModel,
this.allSpaceModels}) this.allSpaceModels,
required this.projectTags})
: super(key: key); : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final List<String> locations = (subspaces ?? []) print(projectTags);
.map((subspace) => subspace.subspaceName) final List<String> locations =
.toList() (subspaces ?? []).map((subspace) => subspace.subspaceName).toList()..add('Main Space');
..add('Main Space');
return BlocProvider( return BlocProvider(
create: (_) => AssignTagModelBloc(allTags ?? []) create: (_) => AssignTagModelBloc(allTags ?? [], projectTags)
..add(InitializeTagModels( ..add(InitializeTagModels(
initialTags: initialTags, initialTags: initialTags,
addedProducts: addedProducts, addedProducts: addedProducts,
@ -81,8 +82,7 @@ class AssignTagModelsDialog extends StatelessWidget {
ClipRRect( ClipRRect(
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
child: DataTable( child: DataTable(
headingRowColor: WidgetStateProperty.all( headingRowColor: WidgetStateProperty.all(ColorsManager.dataHeaderGrey),
ColorsManager.dataHeaderGrey),
key: ValueKey(state.tags.length), key: ValueKey(state.tags.length),
border: TableBorder.all( border: TableBorder.all(
color: ColorsManager.dataHeaderGrey, color: ColorsManager.dataHeaderGrey,
@ -91,26 +91,17 @@ class AssignTagModelsDialog extends StatelessWidget {
), ),
columns: [ columns: [
DataColumn( DataColumn(
label: Text('#', label: Text('#', style: Theme.of(context).textTheme.bodyMedium)),
style: Theme.of(context)
.textTheme
.bodyMedium)),
DataColumn( DataColumn(
label: Text('Device', label: Text('Device',
style: Theme.of(context) style: Theme.of(context).textTheme.bodyMedium)),
.textTheme
.bodyMedium)),
DataColumn( DataColumn(
numeric: false, numeric: false,
label: Text('Tag', label:
style: Theme.of(context) Text('Tag', style: Theme.of(context).textTheme.bodyMedium)),
.textTheme
.bodyMedium)),
DataColumn( DataColumn(
label: Text('Location', label: Text('Location',
style: Theme.of(context) style: Theme.of(context).textTheme.bodyMedium)),
.textTheme
.bodyMedium)),
], ],
rows: state.tags.isEmpty rows: state.tags.isEmpty
? [ ? [
@ -118,13 +109,10 @@ class AssignTagModelsDialog extends StatelessWidget {
DataCell( DataCell(
Center( Center(
child: Text('No Devices Available', child: Text('No Devices Available',
style: Theme.of(context) style:
.textTheme Theme.of(context).textTheme.bodyMedium?.copyWith(
.bodyMedium color: ColorsManager.lightGrayColor,
?.copyWith( )),
color: ColorsManager
.lightGrayColor,
)),
), ),
), ),
const DataCell(SizedBox()), const DataCell(SizedBox()),
@ -141,8 +129,7 @@ class AssignTagModelsDialog extends StatelessWidget {
DataCell(Text((index + 1).toString())), DataCell(Text((index + 1).toString())),
DataCell( DataCell(
Row( Row(
mainAxisAlignment: mainAxisAlignment: MainAxisAlignment.spaceBetween,
MainAxisAlignment.spaceBetween,
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
@ -156,31 +143,25 @@ class AssignTagModelsDialog extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
border: Border.all( border: Border.all(
color: ColorsManager color: ColorsManager.lightGrayColor,
.lightGrayColor,
width: 1.0, width: 1.0,
), ),
), ),
child: IconButton( child: IconButton(
icon: const Icon( icon: const Icon(
Icons.close, Icons.close,
color: ColorsManager color: ColorsManager.lightGreyColor,
.lightGreyColor,
size: 16, size: 16,
), ),
onPressed: () { onPressed: () {
context context.read<AssignTagModelBloc>().add(
.read< DeleteTagModel(
AssignTagModelBloc>() tagToDelete: tag, tags: state.tags));
.add(DeleteTagModel(
tagToDelete: tag,
tags: state.tags));
controllers.removeAt(index); controllers.removeAt(index);
}, },
tooltip: 'Delete Tag', tooltip: 'Delete Tag',
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
constraints: constraints: const BoxConstraints(),
const BoxConstraints(),
), ),
), ),
], ],
@ -191,19 +172,15 @@ class AssignTagModelsDialog extends StatelessWidget {
alignment: Alignment alignment: Alignment
.centerLeft, // Align cell content to the left .centerLeft, // Align cell content to the left
child: SizedBox( child: SizedBox(
width: double width:
.infinity, // Ensure full width for dropdown double.infinity, // Ensure full width for dropdown
child: DialogTextfieldDropdown( child: DialogTextfieldDropdown(
key: ValueKey( key: ValueKey('dropdown_${Uuid().v4()}_$index'),
'dropdown_${Uuid().v4()}_$index'),
items: state.updatedTags, items: state.updatedTags,
initialValue: tag.tag, initialValue: tag.tag,
onSelected: (value) { onSelected: (value) {
controller.text = value; controller.text = value;
context context.read<AssignTagModelBloc>().add(UpdateTag(
.read<
AssignTagModelBloc>()
.add(UpdateTag(
index: index, index: index,
tag: value, tag: value,
)); ));
@ -217,12 +194,10 @@ class AssignTagModelsDialog extends StatelessWidget {
width: double.infinity, width: double.infinity,
child: DialogDropdown( child: DialogDropdown(
items: locations, items: locations,
selectedValue: tag.location ?? selectedValue: tag.location ?? 'Main Space',
'Main Space',
onSelected: (value) { onSelected: (value) {
context context
.read< .read<AssignTagModelBloc>()
AssignTagModelBloc>()
.add(UpdateLocation( .add(UpdateLocation(
index: index, index: index,
location: value, location: value,
@ -254,17 +229,13 @@ class AssignTagModelsDialog extends StatelessWidget {
builder: (buttonContext) => CancelButton( builder: (buttonContext) => CancelButton(
label: 'Add New Device', label: 'Add New Device',
onPressed: () async { onPressed: () async {
final updatedTags = final updatedTags = List<Tag>.from(state.tags);
List<Tag>.from(state.tags);
final result = final result =
TagHelper.updateSubspaceTagModels( TagHelper.updateSubspaceTagModels(updatedTags, subspaces);
updatedTags, subspaces);
final processedTags = final processedTags = result['updatedTags'] as List<Tag>;
result['updatedTags'] as List<Tag>; final processedSubspaces = List<SubspaceTemplateModel>.from(
final processedSubspaces = result['subspaces'] as List<dynamic>);
List<SubspaceTemplateModel>.from(
result['subspaces'] as List<dynamic>);
if (context.mounted) { if (context.mounted) {
Navigator.of(context).pop(); Navigator.of(context).pop();
@ -272,28 +243,25 @@ class AssignTagModelsDialog extends StatelessWidget {
await showDialog<bool>( await showDialog<bool>(
barrierDismissible: false, barrierDismissible: false,
context: context, context: context,
builder: (dialogContext) => builder: (dialogContext) => AddDeviceTypeModelWidget(
AddDeviceTypeModelWidget( products: products,
products: products, subspaces: processedSubspaces,
subspaces: processedSubspaces, isCreate: false,
isCreate: false, initialSelectedProducts:
initialSelectedProducts: TagHelper TagHelper.createInitialSelectedProducts(
.createInitialSelectedProducts( processedTags, processedSubspaces),
processedTags, allTags: allTags,
processedSubspaces), spaceName: spaceName,
allTags: allTags, otherSpaceModels: otherSpaceModels,
spaceName: spaceName, spaceTagModels: processedTags,
otherSpaceModels: otherSpaceModels, pageContext: pageContext,
spaceTagModels: processedTags, projectTags: projectTags,
pageContext: pageContext, spaceModel: SpaceTemplateModel(
spaceModel: SpaceTemplateModel( modelName: spaceName,
modelName: spaceName, tags: updatedTags,
tags: updatedTags, uuid: spaceModel?.uuid,
uuid: spaceModel?.uuid, internalId: spaceModel?.internalId,
internalId: subspaceModels: processedSubspaces)),
spaceModel?.internalId,
subspaceModels:
processedSubspaces)),
); );
} }
}, },
@ -310,22 +278,16 @@ class AssignTagModelsDialog extends StatelessWidget {
: ColorsManager.whiteColorsWithOpacity, : ColorsManager.whiteColorsWithOpacity,
onPressed: state.isSaveEnabled onPressed: state.isSaveEnabled
? () async { ? () async {
final updatedTags = final updatedTags = List<Tag>.from(state.tags);
List<Tag>.from(state.tags);
final result = final result =
TagHelper.updateSubspaceTagModels( TagHelper.updateSubspaceTagModels(updatedTags, subspaces);
updatedTags, subspaces);
final processedTags = final processedTags = result['updatedTags'] as List<Tag>;
result['updatedTags'] as List<Tag>; final processedSubspaces = List<SubspaceTemplateModel>.from(
final processedSubspaces = result['subspaces'] as List<dynamic>);
List<SubspaceTemplateModel>.from(
result['subspaces']
as List<dynamic>);
Navigator.of(context) Navigator.of(context).popUntil((route) => route.isFirst);
.popUntil((route) => route.isFirst);
await showDialog( await showDialog(
context: context, context: context,
@ -334,16 +296,15 @@ class AssignTagModelsDialog extends StatelessWidget {
products: products, products: products,
allSpaceModels: allSpaceModels, allSpaceModels: allSpaceModels,
allTags: allTags, allTags: allTags,
projectTags: projectTags,
pageContext: pageContext, pageContext: pageContext,
otherSpaceModels: otherSpaceModels, otherSpaceModels: otherSpaceModels,
spaceModel: SpaceTemplateModel( spaceModel: SpaceTemplateModel(
modelName: spaceName, modelName: spaceName,
tags: processedTags, tags: processedTags,
uuid: spaceModel?.uuid, uuid: spaceModel?.uuid,
internalId: internalId: spaceModel?.internalId,
spaceModel?.internalId, subspaceModels: processedSubspaces),
subspaceModels:
processedSubspaces),
); );
}, },
); );

View File

@ -15,7 +15,8 @@ class SpaceModelPage extends StatelessWidget {
final Function(List<SpaceTemplateModel>)? onSpaceModelsUpdated; final Function(List<SpaceTemplateModel>)? onSpaceModelsUpdated;
final List<Tag> projectTags; final List<Tag> projectTags;
const SpaceModelPage({Key? key, this.products, this.onSpaceModelsUpdated, required this.projectTags}) const SpaceModelPage(
{Key? key, this.products, this.onSpaceModelsUpdated, required this.projectTags})
: super(key: key); : super(key: key);
@override @override
@ -62,6 +63,7 @@ class SpaceModelPage extends StatelessWidget {
allTags: allTagValues, allTags: allTagValues,
pageContext: context, pageContext: context,
otherSpaceModels: allSpaceModelNames, otherSpaceModels: allSpaceModelNames,
projectTags: projectTags,
); );
}, },
); );
@ -85,6 +87,7 @@ class SpaceModelPage extends StatelessWidget {
otherSpaceModels: otherModel, otherSpaceModels: otherModel,
pageContext: context, pageContext: context,
allSpaceModels: spaceModels, allSpaceModels: spaceModels,
projectTags: projectTags,
); );
}, },
); );

View File

@ -5,6 +5,7 @@ import 'package:syncrow_web/pages/common/buttons/default_button.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_event.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_event.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/tag.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_event.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_event.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_state.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_state.dart';
@ -25,6 +26,7 @@ class CreateSpaceModelDialog extends StatelessWidget {
final BuildContext? pageContext; final BuildContext? pageContext;
final List<String>? otherSpaceModels; final List<String>? otherSpaceModels;
final List<SpaceTemplateModel>? allSpaceModels; final List<SpaceTemplateModel>? allSpaceModels;
final List<Tag> projectTags;
const CreateSpaceModelDialog( const CreateSpaceModelDialog(
{Key? key, {Key? key,
@ -33,7 +35,8 @@ class CreateSpaceModelDialog extends StatelessWidget {
this.spaceModel, this.spaceModel,
this.pageContext, this.pageContext,
this.otherSpaceModels, this.otherSpaceModels,
this.allSpaceModels}) this.allSpaceModels,
required this.projectTags})
: super(key: key); : super(key: key);
@override @override
@ -68,8 +71,7 @@ class CreateSpaceModelDialog extends StatelessWidget {
spaceNameController.addListener(() { spaceNameController.addListener(() {
bloc.add(UpdateSpaceTemplateName( bloc.add(UpdateSpaceTemplateName(
name: spaceNameController.text, name: spaceNameController.text, allModels: otherSpaceModels ?? []));
allModels: otherSpaceModels ?? []));
}); });
return bloc; return bloc;
@ -87,9 +89,7 @@ class CreateSpaceModelDialog extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( Text(
spaceModel?.uuid == null spaceModel?.uuid == null ? 'Create New Space Model' : 'Edit Space Model',
? 'Create New Space Model'
: 'Edit Space Model',
style: Theme.of(context) style: Theme.of(context)
.textTheme .textTheme
.headlineLarge .headlineLarge
@ -101,10 +101,8 @@ class CreateSpaceModelDialog extends StatelessWidget {
child: TextField( child: TextField(
controller: spaceNameController, controller: spaceNameController,
onChanged: (value) { onChanged: (value) {
context.read<CreateSpaceModelBloc>().add( context.read<CreateSpaceModelBloc>().add(UpdateSpaceTemplateName(
UpdateSpaceTemplateName( name: value, allModels: otherSpaceModels ?? []));
name: value,
allModels: otherSpaceModels ?? []));
}, },
style: Theme.of(context) style: Theme.of(context)
.textTheme .textTheme
@ -157,6 +155,7 @@ class CreateSpaceModelDialog extends StatelessWidget {
pageContext: pageContext, pageContext: pageContext,
otherSpaceModels: otherSpaceModels, otherSpaceModels: otherSpaceModels,
allSpaceModels: allSpaceModels, allSpaceModels: allSpaceModels,
projectTags: projectTags,
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
SizedBox( SizedBox(
@ -179,84 +178,55 @@ class CreateSpaceModelDialog extends StatelessWidget {
!isNameValid) !isNameValid)
? null ? null
: () { : () {
final updatedSpaceTemplate = final updatedSpaceTemplate = updatedSpaceModel.copyWith(
updatedSpaceModel.copyWith( modelName: spaceNameController.text.trim(),
modelName:
spaceNameController.text.trim(),
); );
if (updatedSpaceModel.uuid == null) { if (updatedSpaceModel.uuid == null) {
context context.read<CreateSpaceModelBloc>().add(
.read<CreateSpaceModelBloc>()
.add(
CreateSpaceTemplate( CreateSpaceTemplate(
spaceTemplate: spaceTemplate: updatedSpaceTemplate,
updatedSpaceTemplate,
onCreate: (newModel) { onCreate: (newModel) {
if (pageContext != null) { if (pageContext != null) {
pageContext!.read<SpaceModelBloc>().add(
CreateSpaceModel(newSpaceModel: newModel));
pageContext! pageContext!
.read<SpaceModelBloc>() .read<SpaceManagementBloc>()
.add(CreateSpaceModel( .add(UpdateSpaceModelCache(newModel));
newSpaceModel:
newModel));
pageContext!
.read<
SpaceManagementBloc>()
.add(
UpdateSpaceModelCache(
newModel));
} }
Navigator.of(context) Navigator.of(context).pop(); // Close the dialog
.pop(); // Close the dialog
}, },
), ),
); );
} else { } else {
if (pageContext != null) { if (pageContext != null) {
final currentState = pageContext! final currentState =
.read<SpaceModelBloc>() pageContext!.read<SpaceModelBloc>().state;
.state; if (currentState is SpaceModelLoaded) {
if (currentState final spaceModels = List<SpaceTemplateModel>.from(
is SpaceModelLoaded) { currentState.spaceModels);
final spaceModels =
List<SpaceTemplateModel>.from(
currentState.spaceModels);
final SpaceTemplateModel? final SpaceTemplateModel? currentSpaceModel =
currentSpaceModel = spaceModels spaceModels.cast<SpaceTemplateModel?>().firstWhere(
.cast<SpaceTemplateModel?>() (sm) => sm?.uuid == updatedSpaceModel.uuid,
.firstWhere(
(sm) =>
sm?.uuid ==
updatedSpaceModel
.uuid,
orElse: () => null, orElse: () => null,
); );
if (currentSpaceModel != null) { if (currentSpaceModel != null) {
context context
.read<CreateSpaceModelBloc>() .read<CreateSpaceModelBloc>()
.add(ModifySpaceTemplate( .add(ModifySpaceTemplate(
spaceTemplate: spaceTemplate: currentSpaceModel,
currentSpaceModel, updatedSpaceTemplate: updatedSpaceTemplate,
updatedSpaceTemplate:
updatedSpaceTemplate,
onUpdate: (newModel) { onUpdate: (newModel) {
if (pageContext != if (pageContext != null) {
null) { pageContext!.read<SpaceModelBloc>().add(
pageContext! UpdateSpaceModel(
.read<
SpaceModelBloc>()
.add(UpdateSpaceModel(
spaceModelUuid: spaceModelUuid:
newModel.uuid ?? newModel.uuid ?? ''));
''));
pageContext! pageContext!
.read< .read<SpaceManagementBloc>()
SpaceManagementBloc>() .add(UpdateSpaceModelCache(newModel));
.add(UpdateSpaceModelCache(
newModel));
} }
Navigator.of(context) Navigator.of(context).pop();
.pop();
})); }));
} }
} }
@ -265,11 +235,11 @@ class CreateSpaceModelDialog extends StatelessWidget {
}, },
backgroundColor: ColorsManager.secondaryColor, backgroundColor: ColorsManager.secondaryColor,
borderRadius: 10, borderRadius: 10,
foregroundColor: ((state.errorMessage != null && foregroundColor:
state.errorMessage != '') || ((state.errorMessage != null && state.errorMessage != '') ||
!isNameValid) !isNameValid)
? ColorsManager.whiteColorsWithOpacity ? ColorsManager.whiteColorsWithOpacity
: ColorsManager.whiteColors, : ColorsManager.whiteColors,
child: const Text('OK'), child: const Text('OK'),
), ),
), ),

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:syncrow_web/common/edit_chip.dart'; import 'package:syncrow_web/common/edit_chip.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/tag.dart';
import 'package:syncrow_web/pages/spaces_management/assign_tag_models/views/assign_tag_models_dialog.dart'; import 'package:syncrow_web/pages/spaces_management/assign_tag_models/views/assign_tag_models_dialog.dart';
import 'package:syncrow_web/pages/spaces_management/helper/tag_helper.dart'; import 'package:syncrow_web/pages/spaces_management/helper/tag_helper.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart';
@ -20,6 +21,7 @@ class TagChipDisplay extends StatelessWidget {
final BuildContext? pageContext; final BuildContext? pageContext;
final List<String>? otherSpaceModels; final List<String>? otherSpaceModels;
final List<SpaceTemplateModel>? allSpaceModels; final List<SpaceTemplateModel>? allSpaceModels;
final List<Tag> projectTags;
const TagChipDisplay(BuildContext context, const TagChipDisplay(BuildContext context,
{Key? key, {Key? key,
@ -31,14 +33,14 @@ class TagChipDisplay extends StatelessWidget {
required this.spaceNameController, required this.spaceNameController,
this.pageContext, this.pageContext,
this.otherSpaceModels, this.otherSpaceModels,
this.allSpaceModels}) this.allSpaceModels,
required this.projectTags})
: super(key: key); : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return (spaceModel?.tags?.isNotEmpty == true || return (spaceModel?.tags?.isNotEmpty == true ||
spaceModel?.subspaceModels spaceModel?.subspaceModels?.any((subspace) => subspace.tags?.isNotEmpty == true) ==
?.any((subspace) => subspace.tags?.isNotEmpty == true) ==
true) true)
? SizedBox( ? SizedBox(
width: screenWidth * 0.25, width: screenWidth * 0.25,
@ -59,8 +61,7 @@ class TagChipDisplay extends StatelessWidget {
// Combine tags from spaceModel and subspaces // Combine tags from spaceModel and subspaces
...TagHelper.groupTags([ ...TagHelper.groupTags([
...?spaceModel?.tags, ...?spaceModel?.tags,
...?spaceModel?.subspaceModels ...?spaceModel?.subspaceModels?.expand((subspace) => subspace.tags ?? [])
?.expand((subspace) => subspace.tags ?? [])
]).entries.map( ]).entries.map(
(entry) => Chip( (entry) => Chip(
avatar: SizedBox( avatar: SizedBox(
@ -76,9 +77,7 @@ class TagChipDisplay extends StatelessWidget {
style: Theme.of(context) style: Theme.of(context)
.textTheme .textTheme
.bodySmall! .bodySmall!
.copyWith( .copyWith(color: ColorsManager.spaceColor),
color:
ColorsManager.spaceColor),
), ),
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.whiteColors,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
@ -105,13 +104,12 @@ class TagChipDisplay extends StatelessWidget {
spaceModel: spaceModel, spaceModel: spaceModel,
otherSpaceModels: otherSpaceModels, otherSpaceModels: otherSpaceModels,
initialTags: TagHelper.generateInitialTags( initialTags: TagHelper.generateInitialTags(
subspaces: subspaces, subspaces: subspaces, spaceTagModels: spaceModel?.tags ?? []),
spaceTagModels: spaceModel?.tags ?? []),
title: 'Edit Device', title: 'Edit Device',
addedProducts: addedProducts: TagHelper.createInitialSelectedProducts(
TagHelper.createInitialSelectedProducts( spaceModel?.tags ?? [], subspaces),
spaceModel?.tags ?? [], subspaces),
spaceName: spaceModel?.modelName ?? '', spaceName: spaceModel?.modelName ?? '',
projectTags: projectTags,
)); ));
}) })
], ],
@ -134,6 +132,7 @@ class TagChipDisplay extends StatelessWidget {
isCreate: true, isCreate: true,
spaceModel: spaceModel, spaceModel: spaceModel,
otherSpaceModels: otherSpaceModels, otherSpaceModels: otherSpaceModels,
projectTags: projectTags,
), ),
); );
}, },

View File

@ -28,6 +28,7 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
final BuildContext? pageContext; final BuildContext? pageContext;
final SpaceTemplateModel? spaceModel; final SpaceTemplateModel? spaceModel;
final List<SpaceTemplateModel>? allSpaceModels; final List<SpaceTemplateModel>? allSpaceModels;
final List<Tag> projectTags;
const AddDeviceTypeModelWidget( const AddDeviceTypeModelWidget(
{super.key, {super.key,
@ -41,7 +42,8 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
this.pageContext, this.pageContext,
this.otherSpaceModels, this.otherSpaceModels,
this.spaceModel, this.spaceModel,
this.allSpaceModels}); this.allSpaceModels,
required this.projectTags});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -78,8 +80,7 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
const SizedBox(height: 16), const SizedBox(height: 16),
Expanded( Expanded(
child: Padding( child: Padding(
padding: padding: const EdgeInsets.symmetric(horizontal: 20.0),
const EdgeInsets.symmetric(horizontal: 20.0),
child: ScrollableGridViewWidget( child: ScrollableGridViewWidget(
isCreate: isCreate, isCreate: isCreate,
products: products, products: products,
@ -112,6 +113,7 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
allSpaceModels: allSpaceModels, allSpaceModels: allSpaceModels,
products: products, products: products,
allTags: allTags, allTags: allTags,
projectTags: projectTags,
pageContext: pageContext, pageContext: pageContext,
otherSpaceModels: otherSpaceModels, otherSpaceModels: otherSpaceModels,
spaceModel: SpaceTemplateModel( spaceModel: SpaceTemplateModel(
@ -137,6 +139,7 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
subspaces: subspaces, subspaces: subspaces,
addedProducts: initialSelectedProducts ?? [], addedProducts: initialSelectedProducts ?? [],
allTags: allTags, allTags: allTags,
projectTags: projectTags,
spaceName: spaceName, spaceName: spaceName,
initialTags: initialTags, initialTags: initialTags,
otherSpaceModels: otherSpaceModels, otherSpaceModels: otherSpaceModels,
@ -149,11 +152,10 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
), ),
SizedBox( SizedBox(
width: 140, width: 140,
child: child: BlocBuilder<AddDeviceTypeModelBloc, AddDeviceModelState>(
BlocBuilder<AddDeviceTypeModelBloc, AddDeviceModelState>(
builder: (context, state) { builder: (context, state) {
final isDisabled = state is AddDeviceModelLoaded && final isDisabled =
state.selectedProducts.isEmpty; state is AddDeviceModelLoaded && state.selectedProducts.isEmpty;
return DefaultButton( return DefaultButton(
backgroundColor: ColorsManager.secondaryColor, backgroundColor: ColorsManager.secondaryColor,
@ -166,15 +168,13 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
: () async { : () async {
if (state is AddDeviceModelLoaded && if (state is AddDeviceModelLoaded &&
state.selectedProducts.isNotEmpty) { state.selectedProducts.isNotEmpty) {
final initialTags = final initialTags = TagHelper.generateInitialTags(
TagHelper.generateInitialTags(
spaceTagModels: spaceTagModels, spaceTagModels: spaceTagModels,
subspaces: subspaces, subspaces: subspaces,
); );
final dialogTitle = initialTags.isNotEmpty final dialogTitle =
? 'Edit Device' initialTags.isNotEmpty ? 'Edit Device' : 'Assign Tags';
: 'Assign Tags';
Navigator.of(context).pop(); Navigator.of(context).pop();
await showDialog<bool>( await showDialog<bool>(
context: context, context: context,
@ -184,6 +184,7 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
subspaces: subspaces, subspaces: subspaces,
addedProducts: state.selectedProducts, addedProducts: state.selectedProducts,
allTags: allTags, allTags: allTags,
projectTags: projectTags,
spaceName: spaceName, spaceName: spaceName,
initialTags: initialTags, initialTags: initialTags,
otherSpaceModels: otherSpaceModels, otherSpaceModels: otherSpaceModels,