mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 07:07:19 +00:00
added project tags to all dialogs
This commit is contained in:
@ -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';
|
||||||
|
@ -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 ?? [];
|
||||||
|
|
||||||
|
@ -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),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -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'),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -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,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
@ -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,
|
||||||
|
Reference in New Issue
Block a user