Compare commits

...

19 Commits

Author SHA1 Message Date
9a4fdb2f88 Sp 1722 duplicate space dialog enhancement (#370)
<!--
  Thanks for contributing!

Provide a description of your changes below and a general summary in the
title

Please look at the following checklist to ensure that your PR can be
accepted quickly:
-->

## Jira Ticket
[SP-1722](https://syncrow.atlassian.net/browse/SP-1722)

## Description

Implemented naming validation, that disallows for any name duplication.
Adds proper name suffix to the duplicated space's name, if there is any
match with the siblings.
Enhanced the dialog's design to match the design language of the
application.

## Type of Change

<!--- Put an `x` in all the boxes that apply: -->

- [ x ]  New feature (non-breaking change which adds functionality)
- [ ] 🛠️ Bug fix (non-breaking change which fixes an issue)
- [ x ]  Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] 🧹 Code refactor
- [ ]  Build configuration change
- [ ] 📝 Documentation
- [ ] 🗑️ Chore 


[SP-1722]:
https://syncrow.atlassian.net/browse/SP-1722?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
2025-07-27 11:20:39 +03:00
1558806cc3 Refactor SpaceDetailsForm to use StatefulWidget for form validation and improve user experience with dynamic save button state, and added space name validation to not be longer than 50 characters. 2025-07-27 11:18:08 +03:00
a4391aa73e Made AssignTagsDialog scrollable to account for a long list of product allocations, for a better UX. 2025-07-27 11:05:30 +03:00
2d69e3c72f Made SpaceSubSpacesDialog scrollable, for a better UX, and to account for a very long list of subspaces. 2025-07-27 11:01:22 +03:00
cd8ffc99ea removed unnecessary flag, that can be replaced with checking if the value equals null. 2025-07-27 10:56:54 +03:00
83895d3dda Diallows naming duplication when duplicating a space, and adds a proper suffix to the name in case of another spaces having a name match. 2025-07-27 10:51:53 +03:00
f1cf8d88d3 Matched design of duplicate space dialog, with the design language of the system. 2025-07-24 16:40:03 +03:00
0f9cbd22a2 SP-1972-delete-space-reworks (#368)
<!--
  Thanks for contributing!

Provide a description of your changes below and a general summary in the
title

Please look at the following checklist to ensure that your PR can be
accepted quickly:
-->

## Jira Ticket
[SP-1972](https://syncrow.atlassian.net/browse/SP-1972)

## Description

Enhanced UI design of delete space feature.

## Type of Change

<!--- Put an `x` in all the boxes that apply: -->

- [ ]  New feature (non-breaking change which adds functionality)
- [ x ] 🛠️ Bug fix (non-breaking change which fixes an issue)
- [ ]  Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] 🧹 Code refactor
- [ ]  Build configuration change
- [ ] 📝 Documentation
- [ ] 🗑️ Chore 


[SP-1972]:
https://syncrow.atlassian.net/browse/SP-1972?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
2025-07-24 16:24:19 +03:00
9d0a1f4883 Refactor SpaceManagementSidebarHeader to integrate CustomSearchBar and improve layout 2025-07-24 15:04:10 +03:00
7d77809750 Refactor CustomExpansionTile and SpaceDetailsDialogHelper for improved functionality and UI consistency
- Updated CustomExpansionTile to enhance selection state handling and UI responsiveness.
- Integrated success and error snackbars in SpaceDetailsDialogHelper for better user feedback during space creation and updates.
- Removed redundant comments and improved code readability.
2025-07-24 14:51:07 +03:00
56a03443be Fix booking API endpoint month format by changing separator from '/'to '-'. (#369)
<!--
  Thanks for contributing!

Provide a description of your changes below and a general summary in the
title

Please look at the following checklist to ensure that your PR can be
accepted quickly:
-->


## Description

<!--- Describe your changes in detail -->

## Type of Change

<!--- Put an `x` in all the boxes that apply: -->

- [ ]  New feature (non-breaking change which adds functionality)
- [x] 🛠️ Bug fix (non-breaking change which fixes an issue)
- [ ]  Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] 🧹 Code refactor
- [ ]  Build configuration change
- [ ] 📝 Documentation
- [ ] 🗑️ Chore
2025-07-24 13:29:38 +03:00
6943ee07ac - Updated the onSave callback in SpaceSubSpacesDialog to accept product allocations, allowing for better management of subspace data. 2025-07-24 12:38:24 +03:00
47340c3235 Rework fixes. 2025-07-24 12:34:06 +03:00
527c04de9a Refactor SpaceDetailsActionButtons to improve button layout and spacing 2025-07-24 12:06:58 +03:00
1448aa97ce Refactor SpaceDetailsDialog to improve title handling and loading/error dialogs 2025-07-24 12:05:24 +03:00
16b79ae12f Enhanced sizing of SpaceDetailsForm and SpaceIconPicker. 2025-07-24 12:02:54 +03:00
6dbb6b6a6e Made Create Space dialog title match the figma design. 2025-07-24 11:59:46 +03:00
c4ed30f539 Enhance ButtonContentWidget to support customizable icon dimensions. 2025-07-24 11:59:21 +03:00
99924c1e62 Refactor color management and UI components for consistency
- Updated color references in various widgets to use the new `opaquePrimary` color for better visual consistency.
- Refactored `ColorsManager` to improve color definitions and removed redundant color declarations.
- Enhanced UI elements across multiple dialogs and widgets to ensure a cohesive design language.

This change promotes maintainability and aligns with the updated color scheme.
2025-07-24 10:27:17 +03:00
183 changed files with 1423 additions and 1290 deletions

View File

@ -66,7 +66,7 @@ class _DialogDropdownState extends State<DialogDropdown> {
child: Material( child: Material(
elevation: 4.0, elevation: 4.0,
child: Container( child: Container(
color: ColorsManager.whiteColors, color: ColorsManager.white,
constraints: const BoxConstraints( constraints: const BoxConstraints(
maxHeight: 200.0, // Set max height for dropdown maxHeight: 200.0, // Set max height for dropdown
), ),
@ -87,12 +87,10 @@ class _DialogDropdownState extends State<DialogDropdown> {
child: ListTile( child: ListTile(
title: Text( title: Text(
item, item,
style: Theme.of(context) style:
.textTheme Theme.of(context).textTheme.bodyMedium?.copyWith(
.bodyMedium color: ColorsManager.textPrimaryColor,
?.copyWith( ),
color: ColorsManager.textPrimaryColor,
),
), ),
onTap: () { onTap: () {
widget.onSelected(item); widget.onSelected(item);

View File

@ -14,7 +14,7 @@ class EditChip extends StatelessWidget {
this.label = 'Edit', this.label = 'Edit',
required this.onTap, required this.onTap,
this.labelColor = ColorsManager.spaceColor, this.labelColor = ColorsManager.spaceColor,
this.backgroundColor = ColorsManager.whiteColors, this.backgroundColor = ColorsManager.white,
this.borderColor = ColorsManager.spaceColor, this.borderColor = ColorsManager.spaceColor,
this.borderRadius = 16.0, this.borderRadius = 16.0,
}) : super(key: key); }) : super(key: key);
@ -24,10 +24,9 @@ class EditChip extends StatelessWidget {
return GestureDetector( return GestureDetector(
onTap: onTap, onTap: onTap,
child: Chip( child: Chip(
label: Text( label: Text(label,
label, style:
style: Theme.of(context).textTheme.bodySmall!.copyWith(color: labelColor) Theme.of(context).textTheme.bodySmall!.copyWith(color: labelColor)),
),
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(borderRadius), borderRadius: BorderRadius.circular(borderRadius),

View File

@ -17,8 +17,7 @@ class TagDialogTextfieldDropdown extends StatefulWidget {
}) : super(key: key); }) : super(key: key);
@override @override
_DialogTextfieldDropdownState createState() => _DialogTextfieldDropdownState createState() => _DialogTextfieldDropdownState();
_DialogTextfieldDropdownState();
} }
class _DialogTextfieldDropdownState extends State<TagDialogTextfieldDropdown> { class _DialogTextfieldDropdownState extends State<TagDialogTextfieldDropdown> {
@ -97,7 +96,7 @@ class _DialogTextfieldDropdownState extends State<TagDialogTextfieldDropdown> {
child: Material( child: Material(
elevation: 4.0, elevation: 4.0,
child: Container( child: Container(
color: ColorsManager.whiteColors, color: ColorsManager.white,
constraints: const BoxConstraints(maxHeight: 200.0), constraints: const BoxConstraints(maxHeight: 200.0),
child: StatefulBuilder( child: StatefulBuilder(
builder: (context, setStateDropdown) { builder: (context, setStateDropdown) {
@ -122,8 +121,7 @@ class _DialogTextfieldDropdownState extends State<TagDialogTextfieldDropdown> {
.textTheme .textTheme
.bodyMedium .bodyMedium
?.copyWith( ?.copyWith(
color: ColorsManager color: ColorsManager.textPrimaryColor)),
.textPrimaryColor)),
onTap: () { onTap: () {
_controller.text = tag.tag ?? ''; _controller.text = tag.tag ?? '';
widget.onSelected(tag); widget.onSelected(tag);

View File

@ -5,19 +5,20 @@ class CustomExpansionTile extends StatefulWidget {
final String title; final String title;
final List<Widget>? children; final List<Widget>? children;
final bool initiallyExpanded; final bool initiallyExpanded;
final bool isSelected; // Add this to track selection final bool isSelected;
final bool? isExpanded; // External control over expansion final bool? isExpanded;
final ValueChanged<bool>? onExpansionChanged; // Notify when expansion changes final ValueChanged<bool>? onExpansionChanged;
final VoidCallback? onItemSelected; // Callback for selecting the item final VoidCallback? onItemSelected;
CustomExpansionTile({ const CustomExpansionTile({
super.key,
required this.title, required this.title,
this.children, this.children,
this.initiallyExpanded = false, this.initiallyExpanded = false,
this.isExpanded, // Allow external control over expansion this.isExpanded,
this.onExpansionChanged, // Notify when expansion changes this.onExpansionChanged,
this.onItemSelected, // Trigger item selection when name is tapped this.onItemSelected,
required this.isSelected, // Add this to initialize selection state required this.isSelected,
}); });
@override @override
@ -25,7 +26,7 @@ class CustomExpansionTile extends StatefulWidget {
} }
class CustomExpansionTileState extends State<CustomExpansionTile> { class CustomExpansionTileState extends State<CustomExpansionTile> {
bool _isExpanded = false; // Local expansion state bool _isExpanded = false;
@override @override
void initState() { void initState() {
@ -36,7 +37,6 @@ class CustomExpansionTileState extends State<CustomExpansionTile> {
@override @override
void didUpdateWidget(CustomExpansionTile oldWidget) { void didUpdateWidget(CustomExpansionTile oldWidget) {
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
// Sync local state with external control of expansion state
if (widget.isExpanded != null && widget.isExpanded != _isExpanded) { if (widget.isExpanded != null && widget.isExpanded != _isExpanded) {
setState(() { setState(() {
_isExpanded = widget.isExpanded!; _isExpanded = widget.isExpanded!;
@ -44,7 +44,6 @@ class CustomExpansionTileState extends State<CustomExpansionTile> {
} }
} }
// Utility function to capitalize the first letter of the title
String _capitalizeFirstLetter(String text) { String _capitalizeFirstLetter(String text) {
if (text.isEmpty) return text; if (text.isEmpty) return text;
return text[0].toUpperCase() + text.substring(1); return text[0].toUpperCase() + text.substring(1);
@ -56,7 +55,6 @@ class CustomExpansionTileState extends State<CustomExpansionTile> {
children: [ children: [
Row( Row(
children: [ children: [
// Expand/collapse icon, now wrapped in a GestureDetector for specific onTap
if (widget.children != null && widget.children!.isNotEmpty) if (widget.children != null && widget.children!.isNotEmpty)
GestureDetector( GestureDetector(
onTap: () { onTap: () {
@ -70,38 +68,33 @@ class CustomExpansionTileState extends State<CustomExpansionTile> {
? Icons.keyboard_arrow_down ? Icons.keyboard_arrow_down
: Icons.keyboard_arrow_right, : Icons.keyboard_arrow_right,
color: ColorsManager.lightGrayColor, color: ColorsManager.lightGrayColor,
size: 16.0, // Adjusted size for better alignment size: 16,
), ),
), ),
// The title text, wrapped in GestureDetector to handle selection
Expanded( Expanded(
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
if (widget.onItemSelected != null) { if (widget.onItemSelected != null) {
widget.onItemSelected!(); widget.onItemSelected!.call();
} }
}, },
child: Text( child: Text(
_capitalizeFirstLetter(widget.title), _capitalizeFirstLetter(widget.title),
style: TextStyle( style: TextStyle(
color: widget.isSelected color: widget.isSelected
? ColorsManager ? ColorsManager.blackColor
.blackColor // Change color to black when selected : ColorsManager.lightGrayColor,
: ColorsManager fontWeight:
.lightGrayColor, // Gray when not selected widget.isSelected ? FontWeight.w600 : FontWeight.w400,
fontWeight: FontWeight.w400,
), ),
), ),
), ),
), ),
], ],
), ),
// The expanded section (children) that shows when the tile is expanded if (_isExpanded && widget.children != null && widget.children!.isNotEmpty)
if (_isExpanded &&
widget.children != null &&
widget.children!.isNotEmpty)
Padding( Padding(
padding: const EdgeInsets.only(left: 24.0), // Indented children padding: const EdgeInsets.only(left: 24),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: widget.children!, children: widget.children!,

View File

@ -7,7 +7,7 @@ class CustomSearchBar extends StatefulWidget {
final TextEditingController? controller; final TextEditingController? controller;
final String hintText; final String hintText;
final String? searchQuery; final String? searchQuery;
final Function(String)? onSearchChanged; // Callback for search input changes final void Function(String)? onSearchChanged;
const CustomSearchBar({ const CustomSearchBar({
super.key, super.key,
@ -34,10 +34,10 @@ class _CustomSearchBarState extends State<CustomSearchBar> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: Colors.black.withOpacity(0.2), color: ColorsManager.shadowBlackColor.withValues(alpha: 0.1),
spreadRadius: 0, spreadRadius: 0,
blurRadius: 8, blurRadius: 8,
offset: const Offset(0, 4), offset: const Offset(0, 4),
@ -57,7 +57,7 @@ class _CustomSearchBarState extends State<CustomSearchBar> {
style: const TextStyle( style: const TextStyle(
color: Colors.black, color: Colors.black,
), ),
onChanged: widget.onSearchChanged, // Call the callback on text change onChanged: widget.onSearchChanged,
decoration: InputDecoration( decoration: InputDecoration(
filled: true, filled: true,
fillColor: ColorsManager.textFieldGreyColor, fillColor: ColorsManager.textFieldGreyColor,

View File

@ -1,6 +1,7 @@
import 'package:calendar_view/calendar_view.dart';
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:calendar_view/calendar_view.dart'; import 'package:syncrow_web/pages/access_management/booking_system/data/services/memory_bookable_space_service.dart';
import 'package:syncrow_web/pages/access_management/booking_system/data/services/remote_calendar_service.dart'; import 'package:syncrow_web/pages/access_management/booking_system/data/services/remote_calendar_service.dart';
import 'package:syncrow_web/pages/access_management/booking_system/domain/LoadEventsParam.dart'; import 'package:syncrow_web/pages/access_management/booking_system/domain/LoadEventsParam.dart';
import 'package:syncrow_web/pages/access_management/booking_system/presentation/bloc/calendar/events_bloc.dart'; import 'package:syncrow_web/pages/access_management/booking_system/presentation/bloc/calendar/events_bloc.dart';
@ -8,7 +9,6 @@ import 'package:syncrow_web/pages/access_management/booking_system/presentation/
import 'package:syncrow_web/pages/access_management/booking_system/presentation/bloc/date_selection/date_selection_event.dart'; import 'package:syncrow_web/pages/access_management/booking_system/presentation/bloc/date_selection/date_selection_event.dart';
import 'package:syncrow_web/pages/access_management/booking_system/presentation/bloc/date_selection/date_selection_state.dart'; import 'package:syncrow_web/pages/access_management/booking_system/presentation/bloc/date_selection/date_selection_state.dart';
import 'package:syncrow_web/pages/access_management/booking_system/presentation/bloc/selected_bookable_space_bloc/selected_bookable_space_bloc.dart'; import 'package:syncrow_web/pages/access_management/booking_system/presentation/bloc/selected_bookable_space_bloc/selected_bookable_space_bloc.dart';
import 'package:syncrow_web/pages/access_management/booking_system/data/services/memory_bookable_space_service.dart';
import 'package:syncrow_web/pages/access_management/booking_system/presentation/view/widgets/booking_sidebar.dart'; import 'package:syncrow_web/pages/access_management/booking_system/presentation/view/widgets/booking_sidebar.dart';
import 'package:syncrow_web/pages/access_management/booking_system/presentation/view/widgets/custom_calendar_page.dart'; import 'package:syncrow_web/pages/access_management/booking_system/presentation/view/widgets/custom_calendar_page.dart';
import 'package:syncrow_web/pages/access_management/booking_system/presentation/view/widgets/icon_text_button.dart'; import 'package:syncrow_web/pages/access_management/booking_system/presentation/view/widgets/icon_text_button.dart';
@ -114,7 +114,7 @@ class _BookingPageContentState extends State<_BookingPageContent> {
Expanded( Expanded(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: ColorsManager.blackColor.withOpacity(0.1), color: ColorsManager.blackColor.withOpacity(0.1),
@ -142,8 +142,7 @@ class _BookingPageContentState extends State<_BookingPageContent> {
), ),
), ),
Expanded( Expanded(
child: child: BlocBuilder<DateSelectionBloc, DateSelectionState>(
BlocBuilder<DateSelectionBloc, DateSelectionState>(
builder: (context, dateState) { builder: (context, dateState) {
return CustomCalendarPage( return CustomCalendarPage(
selectedDate: dateState.selectedDate, selectedDate: dateState.selectedDate,
@ -152,8 +151,9 @@ class _BookingPageContentState extends State<_BookingPageContent> {
context context
.read<DateSelectionBloc>() .read<DateSelectionBloc>()
.add(SelectDate(newDate)); .add(SelectDate(newDate));
context.read<DateSelectionBloc>().add( context
SelectDateFromSidebarCalendar(newDate)); .read<DateSelectionBloc>()
.add(SelectDateFromSidebarCalendar(newDate));
}, },
); );
}, },
@ -193,8 +193,7 @@ class _BookingPageContentState extends State<_BookingPageContent> {
BlocBuilder<DateSelectionBloc, DateSelectionState>( BlocBuilder<DateSelectionBloc, DateSelectionState>(
builder: (context, state) { builder: (context, state) {
final weekStart = state.weekStart; final weekStart = state.weekStart;
final weekEnd = final weekEnd = weekStart.add(const Duration(days: 6));
weekStart.add(const Duration(days: 6));
return WeekNavigation( return WeekNavigation(
weekStart: weekStart, weekStart: weekStart,
weekEnd: weekEnd, weekEnd: weekEnd,
@ -204,9 +203,7 @@ class _BookingPageContentState extends State<_BookingPageContent> {
.add(PreviousWeek()); .add(PreviousWeek());
}, },
onNextWeek: () { onNextWeek: () {
context context.read<DateSelectionBloc>().add(NextWeek());
.read<DateSelectionBloc>()
.add(NextWeek());
}, },
); );
}, },
@ -219,8 +216,7 @@ class _BookingPageContentState extends State<_BookingPageContent> {
child: BlocBuilder<SelectedBookableSpaceBloc, child: BlocBuilder<SelectedBookableSpaceBloc,
SelectedBookableSpaceState>( SelectedBookableSpaceState>(
builder: (context, roomState) { builder: (context, roomState) {
final selectedRoom = final selectedRoom = roomState.selectedBookableSpace;
roomState.selectedBookableSpace;
return BlocBuilder<DateSelectionBloc, return BlocBuilder<DateSelectionBloc,
DateSelectionState>( DateSelectionState>(
builder: (context, dateState) { builder: (context, dateState) {
@ -228,12 +224,10 @@ class _BookingPageContentState extends State<_BookingPageContent> {
CalendarEventState>( CalendarEventState>(
builder: (context, eventState) { builder: (context, eventState) {
return WeeklyCalendarPage( return WeeklyCalendarPage(
key: ValueKey( key: ValueKey(selectedRoom?.uuid ?? 'no-room'),
selectedRoom?.uuid ?? 'no-room'), startTime:
startTime: selectedRoom selectedRoom?.bookableConfig.startTime,
?.bookableConfig.startTime, endTime: selectedRoom?.bookableConfig.endTime,
endTime:
selectedRoom?.bookableConfig.endTime,
weekStart: dateState.weekStart, weekStart: dateState.weekStart,
selectedDate: dateState.selectedDate, selectedDate: dateState.selectedDate,
eventController: _eventController, eventController: _eventController,

View File

@ -80,7 +80,7 @@ class __SidebarContentState extends State<_SidebarContent> {
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: ColorsManager.blackColor.withOpacity(0.1), color: ColorsManager.blackColor.withOpacity(0.1),
@ -94,7 +94,7 @@ class __SidebarContentState extends State<_SidebarContent> {
), ),
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: ColorsManager.blackColor.withOpacity(0.1), color: ColorsManager.blackColor.withOpacity(0.1),
@ -108,8 +108,8 @@ class __SidebarContentState extends State<_SidebarContent> {
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Container( child: Container(
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric( padding:
horizontal: 16.0, vertical: 8.0), const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.counterBackgroundColor, color: ColorsManager.counterBackgroundColor,
@ -119,12 +119,10 @@ class __SidebarContentState extends State<_SidebarContent> {
children: [ children: [
Expanded( Expanded(
child: TextField( child: TextField(
style: Theme.of(context) style:
.textTheme Theme.of(context).textTheme.bodyMedium?.copyWith(
.bodyMedium color: ColorsManager.blackColor,
?.copyWith( ),
color: ColorsManager.blackColor,
),
controller: searchController, controller: searchController,
onChanged: _handleSearch, onChanged: _handleSearch,
decoration: InputDecoration( decoration: InputDecoration(
@ -174,8 +172,7 @@ class __SidebarContentState extends State<_SidebarContent> {
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
controller: _scrollController, controller: _scrollController,
itemCount: itemCount: state.displayedRooms.length + (state.hasMore ? 1 : 0),
state.displayedRooms.length + (state.hasMore ? 1 : 0),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == state.displayedRooms.length) { if (index == state.displayedRooms.length) {
return _buildLoadMoreIndicator(state); return _buildLoadMoreIndicator(state);
@ -186,9 +183,7 @@ class __SidebarContentState extends State<_SidebarContent> {
room: room, room: room,
isSelected: state.selectedRoomId == room.uuid, isSelected: state.selectedRoomId == room.uuid,
onTap: () { onTap: () {
context context.read<SidebarBloc>().add(SelectRoomEvent(room.uuid));
.read<SidebarBloc>()
.add(SelectRoomEvent(room.uuid));
widget.onRoomSelected(room); widget.onRoomSelected(room);
}, },
); );

View File

@ -52,21 +52,20 @@ class _SetupBookableSpacesDialogState extends State<SetupBookableSpacesDialog> {
), ),
)..add( )..add(
LoadUnBookableSpacesEvent( LoadUnBookableSpacesEvent(
nonBookableSpacesParams: nonBookableSpacesParams: NonBookableSpacesParams(currentPage: 1),
NonBookableSpacesParams(currentPage: 1),
), ),
), ),
), ),
BlocProvider<SetupBookableSpacesBloc>( BlocProvider<SetupBookableSpacesBloc>(
create: widget.editingBookableSpace == null create: widget.editingBookableSpace == null
? (context) => SetupBookableSpacesBloc( ? (context) =>
RemoteNonBookableSpaces(HTTPService())) SetupBookableSpacesBloc(RemoteNonBookableSpaces(HTTPService()))
: (context) => SetupBookableSpacesBloc( : (context) =>
RemoteNonBookableSpaces(HTTPService())) SetupBookableSpacesBloc(RemoteNonBookableSpaces(HTTPService()))
..add( ..add(
EditModeSelected( EditModeSelected(
editingBookableSpace: widget.editingBookableSpace!), editingBookableSpace: widget.editingBookableSpace!),
), ),
), ),
BlocProvider( BlocProvider(
create: (context) => SendBookableSpacesBloc( create: (context) => SendBookableSpacesBloc(
@ -75,7 +74,7 @@ class _SetupBookableSpacesDialogState extends State<SetupBookableSpacesDialog> {
) )
], ],
child: AlertDialog( child: AlertDialog(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
title: Center( title: Center(
child: Text( child: Text(

View File

@ -21,16 +21,14 @@ class BookableSpaceSwitchActivationWidget extends StatelessWidget {
return Center( return Center(
child: Transform.scale( child: Transform.scale(
scale: 0.7, scale: 0.7,
child: child: BlocConsumer<UpdateBookableSpacesBloc, UpdateBookableSpacesState>(
BlocConsumer<UpdateBookableSpacesBloc, UpdateBookableSpacesState>(
listener: (context, updateState) { listener: (context, updateState) {
if (updateState is UpdateBookableSpaceSuccess) { if (updateState is UpdateBookableSpaceSuccess) {
context.read<BookableSpacesBloc>().add( context.read<BookableSpacesBloc>().add(
InsertUpdatedSpaceEvent( InsertUpdatedSpaceEvent(
bookableSpaces: bookableSpaces, bookableSpaces: bookableSpaces,
bookableSpace: space, bookableSpace: space,
updatedBookableSpaceConfig: updatedBookableSpaceConfig: updateState.bookableSpaceConfig,
updateState.bookableSpaceConfig,
), ),
); );
} }
@ -42,16 +40,16 @@ class BookableSpaceSwitchActivationWidget extends StatelessWidget {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} }
return Switch( return Switch(
trackOutlineColor: WidgetStateProperty.resolveWith<Color>( trackOutlineColor:
(Set<WidgetState> states) { WidgetStateProperty.resolveWith<Color>((Set<WidgetState> states) {
return ColorsManager.whiteColors; return ColorsManager.white;
}), }),
value: space.spaceConfig!.availability, value: space.spaceConfig!.availability,
activeTrackColor: ColorsManager.dialogBlueTitle, activeTrackColor: ColorsManager.dialogBlueTitle,
inactiveTrackColor: ColorsManager.grayBorder, inactiveTrackColor: ColorsManager.grayBorder,
thumbColor: WidgetStateProperty.resolveWith<Color>( thumbColor:
(Set<WidgetState> states) { WidgetStateProperty.resolveWith<Color>((Set<WidgetState> states) {
return ColorsManager.whiteColors; return ColorsManager.white;
}), }),
onChanged: (value) { onChanged: (value) {
context.read<UpdateBookableSpacesBloc>().add( context.read<UpdateBookableSpacesBloc>().add(

View File

@ -68,7 +68,7 @@ class PaginationButtonsWidget extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
color: i == currentPage color: i == currentPage
? ColorsManager.dialogBlueTitle ? ColorsManager.dialogBlueTitle
: ColorsManager.whiteColors, : ColorsManager.white,
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
border: Border.all( border: Border.all(
color: ColorsManager.lightGrayBorderColor, color: ColorsManager.lightGrayBorderColor,
@ -77,9 +77,8 @@ class PaginationButtonsWidget extends StatelessWidget {
'$i', '$i',
style: TextStyle( style: TextStyle(
color: i == currentPage ? Colors.white : Colors.black, color: i == currentPage ? Colors.white : Colors.black,
fontWeight: i == currentPage fontWeight:
? FontWeight.bold i == currentPage ? FontWeight.bold : FontWeight.normal,
: FontWeight.normal,
), ),
), ),
), ),
@ -129,8 +128,7 @@ class PaginationButtonsWidget extends StatelessWidget {
); );
} }
Widget _buildArrowButton( Widget _buildArrowButton({required String label, required VoidCallback onTap}) {
{required String label, required VoidCallback onTap}) {
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 4), padding: const EdgeInsets.symmetric(horizontal: 4),
child: GestureDetector( child: GestureDetector(
@ -140,7 +138,7 @@ class PaginationButtonsWidget extends StatelessWidget {
height: 30, height: 30,
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
border: Border.all( border: Border.all(
color: ColorsManager.lightGrayBorderColor, color: ColorsManager.lightGrayBorderColor,

View File

@ -62,16 +62,13 @@ class _PointsPartWidgetState extends State<PointsPartWidget> {
scale: 0.7, scale: 0.7,
child: Switch( child: Switch(
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
trackOutlineColor: trackOutlineColor: WidgetStateProperty.all(ColorsManager.white),
WidgetStateProperty.all(ColorsManager.whiteColors),
activeTrackColor: ColorsManager.dialogBlueTitle, activeTrackColor: ColorsManager.dialogBlueTitle,
inactiveTrackColor: ColorsManager.lightGrayBorderColor, inactiveTrackColor: ColorsManager.lightGrayBorderColor,
thumbColor: thumbColor: WidgetStateProperty.all(ColorsManager.white),
WidgetStateProperty.all(ColorsManager.whiteColors),
value: isSwitchOn, value: isSwitchOn,
onChanged: (value) { onChanged: (value) {
final toggleCubit = final toggleCubit = context.read<TogglePointsSwitchCubit>();
context.read<TogglePointsSwitchCubit>();
final bloc = context.read<SetupBookableSpacesBloc>(); final bloc = context.read<SetupBookableSpacesBloc>();
final updatedCost = value ? -1 : 0; final updatedCost = value ? -1 : 0;

View File

@ -36,12 +36,11 @@ class SearchUnbookableSpacesWidget extends StatelessWidget {
height: height ?? 40, height: height ?? 40,
padding: const EdgeInsets.only(top: 4), padding: const EdgeInsets.only(top: 4),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.circular(raduis ?? 15), borderRadius: BorderRadius.circular(raduis ?? 15),
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: color: ColorsManager.shadowOfSearchTextfield.withValues(alpha: 0.15),
ColorsManager.shadowOfSearchTextfield.withValues(alpha: 0.15),
offset: Offset.zero, offset: Offset.zero,
blurRadius: blur ?? 5, blurRadius: blur ?? 5,
spreadRadius: 0, spreadRadius: 0,

View File

@ -33,7 +33,7 @@ class StepperPartWidget extends StatelessWidget {
const CircleTitleStepperWidget( const CircleTitleStepperWidget(
title: 'Settings', title: 'Settings',
titleColor: ColorsManager.softGray, titleColor: ColorsManager.softGray,
circleColor: ColorsManager.whiteColors, circleColor: ColorsManager.white,
borderColor: ColorsManager.textGray, borderColor: ColorsManager.textGray,
) )
], ],
@ -49,7 +49,7 @@ class StepperPartWidget extends StatelessWidget {
titleColor: ColorsManager.softGray, titleColor: ColorsManager.softGray,
cicleIcon: Icon( cicleIcon: Icon(
Icons.check, Icons.check,
color: ColorsManager.whiteColors, color: ColorsManager.white,
size: 12, size: 12,
), ),
circleColor: ColorsManager.trueIconGreen, circleColor: ColorsManager.trueIconGreen,

View File

@ -104,7 +104,7 @@ abstract final class RangeOfAqiChartsHelper {
) { ) {
return LineTouchData( return LineTouchData(
touchTooltipData: LineTouchTooltipData( touchTooltipData: LineTouchTooltipData(
getTooltipColor: (touchTooltipItem) => ColorsManager.whiteColors, getTooltipColor: (touchTooltipItem) => ColorsManager.white,
tooltipBorder: const BorderSide( tooltipBorder: const BorderSide(
color: ColorsManager.semiTransparentBlack, color: ColorsManager.semiTransparentBlack,
), ),

View File

@ -77,7 +77,7 @@ class AqiDistributionChart extends StatelessWidget {
BarTouchData _barTouchData(BuildContext context) { BarTouchData _barTouchData(BuildContext context) {
return BarTouchData( return BarTouchData(
touchTooltipData: BarTouchTooltipData( touchTooltipData: BarTouchTooltipData(
getTooltipColor: (_) => ColorsManager.whiteColors, getTooltipColor: (_) => ColorsManager.white,
tooltipBorder: const BorderSide( tooltipBorder: const BorderSide(
color: ColorsManager.semiTransparentBlack, color: ColorsManager.semiTransparentBlack,
), ),

View File

@ -65,7 +65,7 @@ class AqiGauge extends StatelessWidget {
pointer: GaugePointer.circle( pointer: GaugePointer.circle(
position: const GaugePointerPosition.surface(), position: const GaugePointerPosition.surface(),
radius: MediaQuery.sizeOf(context).width * 0.004, radius: MediaQuery.sizeOf(context).width * 0.004,
color: ColorsManager.whiteColors, color: ColorsManager.white,
border: GaugePointerBorder( border: GaugePointerBorder(
width: 6, width: 6,
color: statusColor, color: statusColor,

View File

@ -20,7 +20,7 @@ class AqiLocationInfoCell extends StatelessWidget {
return Expanded( return Expanded(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
), ),
child: Stack( child: Stack(

View File

@ -62,7 +62,7 @@ class AqiSubValueWidget extends StatelessWidget {
child: Container( child: Container(
padding: const EdgeInsetsDirectional.all(10), padding: const EdgeInsetsDirectional.all(10),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
), ),
child: Row( child: Row(

View File

@ -46,7 +46,7 @@ class _AqiTypeDropdownState extends State<AqiTypeDropdown> {
value: widget.selectedAqiType, value: widget.selectedAqiType,
isDense: true, isDense: true,
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
dropdownColor: ColorsManager.whiteColors, dropdownColor: ColorsManager.white,
underline: const SizedBox.shrink(), underline: const SizedBox.shrink(),
icon: const RotatedBox( icon: const RotatedBox(
quarterTurns: 1, quarterTurns: 1,

View File

@ -107,7 +107,7 @@ class RangeOfAqiChart extends StatelessWidget {
show: true, show: true,
getDotPainter: (_, __, ___, ____) => FlDotCirclePainter( getDotPainter: (_, __, ___, ____) => FlDotCirclePainter(
radius: 2, radius: 2,
color: ColorsManager.whiteColors, color: ColorsManager.white,
strokeWidth: 2, strokeWidth: 2,
strokeColor: color, strokeColor: color,
), ),

View File

@ -45,7 +45,7 @@ class _MonthPickerWidgetState extends State<MonthPickerWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Dialog( return Dialog(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
child: Container( child: Container(
padding: const EdgeInsetsDirectional.all(20), padding: const EdgeInsetsDirectional.all(20),
width: 320, width: 320,
@ -108,7 +108,7 @@ class _MonthPickerWidgetState extends State<MonthPickerWidget> {
style: context.textTheme.titleSmall?.copyWith( style: context.textTheme.titleSmall?.copyWith(
fontSize: 14, fontSize: 14,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: ColorsManager.whiteColors, color: ColorsManager.white,
), ),
), ),
), ),
@ -217,7 +217,7 @@ class _MonthPickerWidgetState extends State<MonthPickerWidget> {
style: context.textTheme.titleSmall?.copyWith( style: context.textTheme.titleSmall?.copyWith(
fontSize: 12, fontSize: 12,
color: isSelected color: isSelected
? ColorsManager.whiteColors ? ColorsManager.white
: isFutureMonth : isFutureMonth
? ColorsManager.blackColor.withValues(alpha: 0.3) ? ColorsManager.blackColor.withValues(alpha: 0.3)
: ColorsManager.blackColor.withValues(alpha: 0.8), : ColorsManager.blackColor.withValues(alpha: 0.8),

View File

@ -59,7 +59,7 @@ class _AnalyticsSpaceTreeViewState extends State<AnalyticsSpaceTreeView> {
: state.communityList; : state.communityList;
return Container( return Container(
height: MediaQuery.sizeOf(context).height, height: MediaQuery.sizeOf(context).height,
decoration: const BoxDecoration(color: ColorsManager.whiteColors), decoration: const BoxDecoration(color: ColorsManager.white),
child: state is SpaceTreeLoadingState child: state is SpaceTreeLoadingState
? const Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())
: Column( : Column(

View File

@ -33,7 +33,7 @@ class _YearPickerWidgetState extends State<YearPickerWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Dialog( return Dialog(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
child: Container( child: Container(
padding: const EdgeInsetsDirectional.all(20), padding: const EdgeInsetsDirectional.all(20),
width: 320, width: 320,
@ -92,7 +92,7 @@ class _YearPickerWidgetState extends State<YearPickerWidget> {
style: context.textTheme.titleSmall?.copyWith( style: context.textTheme.titleSmall?.copyWith(
fontSize: 14, fontSize: 14,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: ColorsManager.whiteColors, color: ColorsManager.white,
), ),
), ),
), ),
@ -144,7 +144,7 @@ class _YearPickerWidgetState extends State<YearPickerWidget> {
style: context.textTheme.titleSmall?.copyWith( style: context.textTheme.titleSmall?.copyWith(
fontSize: 12, fontSize: 12,
color: isSelected color: isSelected
? ColorsManager.whiteColors ? ColorsManager.white
: ColorsManager.blackColor.withValues(alpha: 0.8), : ColorsManager.blackColor.withValues(alpha: 0.8),
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
), ),

View File

@ -81,7 +81,7 @@ abstract final class EnergyManagementChartsHelper {
static LineTouchTooltipData lineTouchTooltipData() { static LineTouchTooltipData lineTouchTooltipData() {
return LineTouchTooltipData( return LineTouchTooltipData(
getTooltipColor: (touchTooltipItem) => ColorsManager.whiteColors, getTooltipColor: (touchTooltipItem) => ColorsManager.white,
tooltipBorder: const BorderSide(color: ColorsManager.semiTransparentBlack), tooltipBorder: const BorderSide(color: ColorsManager.semiTransparentBlack),
tooltipRoundedRadius: 16, tooltipRoundedRadius: 16,
showOnTopOfTheChartBoxArea: false, showOnTopOfTheChartBoxArea: false,

View File

@ -72,7 +72,7 @@ class AnalyticsDeviceDropdown extends StatelessWidget {
value: state.selectedDevice, value: state.selectedDevice,
isDense: true, isDense: true,
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
dropdownColor: ColorsManager.whiteColors, dropdownColor: ColorsManager.white,
underline: const SizedBox.shrink(), underline: const SizedBox.shrink(),
icon: const RotatedBox( icon: const RotatedBox(
quarterTurns: 1, quarterTurns: 1,

View File

@ -18,7 +18,6 @@ class EnergyConsumptionByPhasesChart extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BarChart( return BarChart(
BarChartData( BarChartData(
gridData: EnergyManagementChartsHelper.gridData().copyWith( gridData: EnergyManagementChartsHelper.gridData().copyWith(
checkToShowHorizontalLine: (value) => true, checkToShowHorizontalLine: (value) => true,
horizontalInterval: 250, horizontalInterval: 250,
@ -74,7 +73,7 @@ class EnergyConsumptionByPhasesChart extends StatelessWidget {
BarTouchData _barTouchData(BuildContext context) { BarTouchData _barTouchData(BuildContext context) {
return BarTouchData( return BarTouchData(
touchTooltipData: BarTouchTooltipData( touchTooltipData: BarTouchTooltipData(
getTooltipColor: (touchTooltipItem) => ColorsManager.whiteColors, getTooltipColor: (touchTooltipItem) => ColorsManager.white,
tooltipBorder: const BorderSide( tooltipBorder: const BorderSide(
color: ColorsManager.semiTransparentBlack, color: ColorsManager.semiTransparentBlack,
), ),

View File

@ -34,7 +34,7 @@ class HeatMapTooltip extends StatelessWidget {
style: context.textTheme.bodySmall?.copyWith( style: context.textTheme.bodySmall?.copyWith(
fontSize: 12, fontSize: 12,
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
color: ColorsManager.whiteColors, color: ColorsManager.white,
), ),
), ),
const Divider(height: 2, thickness: 1), const Divider(height: 2, thickness: 1),
@ -43,7 +43,7 @@ class HeatMapTooltip extends StatelessWidget {
style: context.textTheme.bodySmall?.copyWith( style: context.textTheme.bodySmall?.copyWith(
fontSize: 10, fontSize: 10,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: ColorsManager.whiteColors, color: ColorsManager.white,
), ),
), ),
], ],

View File

@ -64,7 +64,7 @@ class OccupancyChart extends StatelessWidget {
BarTouchData _barTouchData(BuildContext context) { BarTouchData _barTouchData(BuildContext context) {
return BarTouchData( return BarTouchData(
touchTooltipData: BarTouchTooltipData( touchTooltipData: BarTouchTooltipData(
getTooltipColor: (touchTooltipItem) => ColorsManager.whiteColors, getTooltipColor: (touchTooltipItem) => ColorsManager.white,
tooltipBorder: const BorderSide( tooltipBorder: const BorderSide(
color: ColorsManager.semiTransparentBlack, color: ColorsManager.semiTransparentBlack,
), ),

View File

@ -121,7 +121,8 @@ class _LoginWebPageState extends State<LoginWebPage> with HelperResponsiveLayout
const Spacer(), const Spacer(),
Expanded( Expanded(
flex: 2, flex: 2,
child: _buildLoginFormFields(context, loginBloc, size), child:
_buildLoginFormFields(context, loginBloc, size),
), ),
const Spacer(), const Spacer(),
], ],
@ -147,8 +148,8 @@ class _LoginWebPageState extends State<LoginWebPage> with HelperResponsiveLayout
child: Form( child: Form(
key: loginBloc.loginFormKey, key: loginBloc.loginFormKey,
child: Padding( child: Padding(
padding: padding: EdgeInsets.symmetric(
EdgeInsets.symmetric(horizontal: size.width * 0.02, vertical: size.width * 0.003), horizontal: size.width * 0.02, vertical: size.width * 0.003),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -303,10 +304,8 @@ class _LoginWebPageState extends State<LoginWebPage> with HelperResponsiveLayout
decoration: textBoxDecoration()!.copyWith( decoration: textBoxDecoration()!.copyWith(
errorStyle: const TextStyle(height: 0), errorStyle: const TextStyle(height: 0),
hintText: 'Enter your email address', hintText: 'Enter your email address',
hintStyle: Theme.of(context) hintStyle: Theme.of(context).textTheme.bodySmall!.copyWith(
.textTheme color: ColorsManager.grayColor, fontWeight: FontWeight.w400)),
.bodySmall!
.copyWith(color: ColorsManager.grayColor, fontWeight: FontWeight.w400)),
style: const TextStyle(color: Colors.black), style: const TextStyle(color: Colors.black),
), ),
), ),
@ -348,17 +347,18 @@ class _LoginWebPageState extends State<LoginWebPage> with HelperResponsiveLayout
}, },
decoration: textBoxDecoration()!.copyWith( decoration: textBoxDecoration()!.copyWith(
hintText: 'At least 8 characters', hintText: 'At least 8 characters',
hintStyle: Theme.of(context) hintStyle: Theme.of(context).textTheme.bodySmall!.copyWith(
.textTheme color: ColorsManager.grayColor, fontWeight: FontWeight.w400),
.bodySmall!
.copyWith(color: ColorsManager.grayColor, fontWeight: FontWeight.w400),
suffixIcon: IconButton( suffixIcon: IconButton(
onPressed: () { onPressed: () {
loginBloc.add(PasswordVisibleEvent(newValue: loginBloc.obscureText)); loginBloc
.add(PasswordVisibleEvent(newValue: loginBloc.obscureText));
}, },
icon: SizedBox( icon: SizedBox(
child: SvgPicture.asset( child: SvgPicture.asset(
loginBloc.obscureText ? Assets.visiblePassword : Assets.invisiblePassword, loginBloc.obscureText
? Assets.visiblePassword
: Assets.invisiblePassword,
height: 15, height: 15,
width: 15, width: 15,
), ),
@ -386,10 +386,8 @@ class _LoginWebPageState extends State<LoginWebPage> with HelperResponsiveLayout
}, },
child: Text( child: Text(
"Forgot Password?", "Forgot Password?",
style: Theme.of(context) style: Theme.of(context).textTheme.bodySmall!.copyWith(
.textTheme color: Colors.black, fontSize: 14, fontWeight: FontWeight.w400),
.bodySmall!
.copyWith(color: Colors.black, fontSize: 14, fontWeight: FontWeight.w400),
), ),
), ),
], ],
@ -466,8 +464,8 @@ class _LoginWebPageState extends State<LoginWebPage> with HelperResponsiveLayout
style: Theme.of(context).textTheme.labelLarge!.copyWith( style: Theme.of(context).textTheme.labelLarge!.copyWith(
fontSize: 14, fontSize: 14,
color: loginBloc.checkValidate color: loginBloc.checkValidate
? ColorsManager.whiteColors ? ColorsManager.white
: ColorsManager.whiteColors.withOpacity(0.2), : ColorsManager.white.withOpacity(0.2),
)), )),
onPressed: () { onPressed: () {
if (loginBloc.loginFormKey.currentState!.validate()) { if (loginBloc.loginFormKey.currentState!.validate()) {
@ -494,7 +492,8 @@ class _LoginWebPageState extends State<LoginWebPage> with HelperResponsiveLayout
SizedBox( SizedBox(
child: Text( child: Text(
loginBloc.validate, loginBloc.validate,
style: const TextStyle(fontWeight: FontWeight.w700, color: ColorsManager.red), style: const TextStyle(
fontWeight: FontWeight.w700, color: ColorsManager.red),
), ),
) )
], ],

View File

@ -56,7 +56,7 @@ class SearchResetButtons extends StatelessWidget {
decoration: containerDecoration, decoration: containerDecoration,
child: Center( child: Center(
child: DefaultButton( child: DefaultButton(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
borderRadius: 9, borderRadius: 9,
onPressed: onReset, onPressed: onReset,
child: Text( child: Text(

View File

@ -35,7 +35,7 @@ class CurtainToggle extends StatelessWidget {
children: [ children: [
ClipOval( ClipOval(
child: Container( child: Container(
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.curtainIcon, Assets.curtainIcon,
width: 60, width: 60,

View File

@ -127,13 +127,11 @@ class _DynamicTableState extends State<DynamicTable> {
controller: _horizontalScrollController, controller: _horizontalScrollController,
thumbVisibility: true, thumbVisibility: true,
trackVisibility: true, trackVisibility: true,
notificationPredicate: (notif) => notificationPredicate: (notif) => notif.metrics.axis == Axis.horizontal,
notif.metrics.axis == Axis.horizontal,
child: SingleChildScrollView( child: SingleChildScrollView(
controller: _horizontalScrollController, controller: _horizontalScrollController,
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
physics: physics: widget.isEmpty ? const NeverScrollableScrollPhysics() : null,
widget.isEmpty ? const NeverScrollableScrollPhysics() : null,
child: SizedBox( child: SizedBox(
width: _totalTableWidth, width: _totalTableWidth,
child: Column( child: Column(
@ -195,29 +193,25 @@ class _DynamicTableState extends State<DynamicTable> {
widget.headers[colIndex] == 'Settings' widget.headers[colIndex] == 'Settings'
? buildSettingsIcon( ? buildSettingsIcon(
width: _settingsColumnWidth, width: _settingsColumnWidth,
onTap: () => widget onTap: () => widget.onSettingsPressed
.onSettingsPressed
?.call(rowIndex), ?.call(rowIndex),
) )
: _buildTableCell( : _buildTableCell(
row[colIndex].toString(), row[colIndex].toString(),
width: widget.headers[ width: widget.headers[colIndex] ==
colIndex] ==
'Settings' 'Settings'
? _settingsColumnWidth ? _settingsColumnWidth
: (_totalTableWidth - : (_totalTableWidth -
(widget.withCheckBox (widget.withCheckBox
? _checkboxColumnWidth ? _checkboxColumnWidth
: 0) - : 0) -
(widget.headers (widget.headers.contains(
.contains( 'Settings')
'Settings')
? _settingsColumnWidth ? _settingsColumnWidth
: 0)) / : 0)) /
(widget.headers.length - (widget.headers.length -
(widget.headers (widget.headers.contains(
.contains( 'Settings')
'Settings')
? 1 ? 1
: 0)), : 0)),
rowIndex: rowIndex, rowIndex: rowIndex,
@ -241,7 +235,7 @@ class _DynamicTableState extends State<DynamicTable> {
Widget _buildEmptyState() => Container( Widget _buildEmptyState() => Container(
height: widget.size.height, height: widget.size.height,
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
@ -281,9 +275,8 @@ class _DynamicTableState extends State<DynamicTable> {
), ),
child: Checkbox( child: Checkbox(
value: _selectAll, value: _selectAll,
onChanged: widget.withSelectAll && widget.data.isNotEmpty onChanged:
? _toggleSelectAll widget.withSelectAll && widget.data.isNotEmpty ? _toggleSelectAll : null,
: null,
), ),
); );
} }
@ -300,7 +293,7 @@ class _DynamicTableState extends State<DynamicTable> {
width: 1.0, width: 1.0,
), ),
), ),
color: ColorsManager.whiteColors, color: ColorsManager.white,
), ),
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Center( child: Center(
@ -341,9 +334,7 @@ class _DynamicTableState extends State<DynamicTable> {
} }
Widget _buildTableCell(String content, Widget _buildTableCell(String content,
{required double width, {required double width, required int rowIndex, required int columnIndex}) {
required int rowIndex,
required int columnIndex}) {
bool isBatteryLevel = content.endsWith('%'); bool isBatteryLevel = content.endsWith('%');
double? batteryLevel; double? batteryLevel;
@ -415,7 +406,7 @@ class _DynamicTableState extends State<DynamicTable> {
height: _fixedRowHeight, height: _fixedRowHeight,
padding: const EdgeInsets.only(left: 15, top: 10, bottom: 10), padding: const EdgeInsets.only(left: 15, top: 10, bottom: 10),
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
border: Border( border: Border(
bottom: BorderSide( bottom: BorderSide(
color: ColorsManager.boxDivider, color: ColorsManager.boxDivider,

View File

@ -27,8 +27,8 @@ class BatchAcMode extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
_buildIconContainer(context, TempModes.cold, Assets.freezing, _buildIconContainer(
value == TempModes.cold), context, TempModes.cold, Assets.freezing, value == TempModes.cold),
_buildIconContainer( _buildIconContainer(
context, TempModes.hot, Assets.acSun, value == TempModes.hot), context, TempModes.hot, Assets.acSun, value == TempModes.hot),
_buildIconContainer(context, TempModes.wind, Assets.acAirConditioner, _buildIconContainer(context, TempModes.wind, Assets.acAirConditioner,
@ -56,7 +56,7 @@ class BatchAcMode extends StatelessWidget {
height: 50, height: 50,
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: ColorsManager.whiteColors, color: ColorsManager.white,
border: Border.all( border: Border.all(
color: isSelected ? Colors.blue : Colors.transparent, color: isSelected ? Colors.blue : Colors.transparent,
width: 2.0, width: 2.0,

View File

@ -32,8 +32,8 @@ class BatchFanSpeedControl extends StatelessWidget {
children: [ children: [
_buildIconContainer(context, FanSpeeds.auto, Assets.acFanAuto, _buildIconContainer(context, FanSpeeds.auto, Assets.acFanAuto,
value == FanSpeeds.auto), value == FanSpeeds.auto),
_buildIconContainer(context, FanSpeeds.low, Assets.acFanLow, _buildIconContainer(
value == FanSpeeds.low), context, FanSpeeds.low, Assets.acFanLow, value == FanSpeeds.low),
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
@ -52,8 +52,8 @@ class BatchFanSpeedControl extends StatelessWidget {
); );
} }
Widget _buildIconContainer(BuildContext context, FanSpeeds speed, Widget _buildIconContainer(
String assetPath, bool isSelected) { BuildContext context, FanSpeeds speed, String assetPath, bool isSelected) {
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
context.read<AcBloc>().add( context.read<AcBloc>().add(
@ -69,7 +69,7 @@ class BatchFanSpeedControl extends StatelessWidget {
height: 50, height: 50,
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: ColorsManager.whiteColors, color: ColorsManager.white,
border: Border.all( border: Border.all(
color: isSelected ? Colors.blue : Colors.transparent, color: isSelected ? Colors.blue : Colors.transparent,
width: 2.0, width: 2.0,

View File

@ -27,8 +27,8 @@ class AcMode extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
_buildIconContainer(context, TempModes.cold, Assets.freezing, _buildIconContainer(
value == TempModes.cold), context, TempModes.cold, Assets.freezing, value == TempModes.cold),
_buildIconContainer( _buildIconContainer(
context, TempModes.hot, Assets.acSun, value == TempModes.hot), context, TempModes.hot, Assets.acSun, value == TempModes.hot),
_buildIconContainer(context, TempModes.wind, Assets.acAirConditioner, _buildIconContainer(context, TempModes.wind, Assets.acAirConditioner,
@ -56,7 +56,7 @@ class AcMode extends StatelessWidget {
height: 50, height: 50,
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: ColorsManager.whiteColors, color: ColorsManager.white,
border: Border.all( border: Border.all(
color: isSelected ? Colors.blue : Colors.transparent, color: isSelected ? Colors.blue : Colors.transparent,
width: 2.0, width: 2.0,

View File

@ -38,7 +38,7 @@ class AcToggle extends StatelessWidget {
height: 60, height: 60,
decoration: const BoxDecoration( decoration: const BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: ColorsManager.whiteColors, color: ColorsManager.white,
), ),
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
child: ClipOval( child: ClipOval(

View File

@ -31,8 +31,8 @@ class FanSpeedControl extends StatelessWidget {
children: [ children: [
_buildIconContainer(context, FanSpeeds.auto, Assets.acFanAuto, _buildIconContainer(context, FanSpeeds.auto, Assets.acFanAuto,
value == FanSpeeds.auto), value == FanSpeeds.auto),
_buildIconContainer(context, FanSpeeds.low, Assets.acFanLow, _buildIconContainer(
value == FanSpeeds.low), context, FanSpeeds.low, Assets.acFanLow, value == FanSpeeds.low),
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
@ -51,8 +51,8 @@ class FanSpeedControl extends StatelessWidget {
); );
} }
Widget _buildIconContainer(BuildContext context, FanSpeeds speed, Widget _buildIconContainer(
String assetPath, bool isSelected) { BuildContext context, FanSpeeds speed, String assetPath, bool isSelected) {
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
context.read<AcBloc>().add( context.read<AcBloc>().add(
@ -68,7 +68,7 @@ class FanSpeedControl extends StatelessWidget {
height: 50, height: 50,
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: ColorsManager.whiteColors, color: ColorsManager.white,
border: Border.all( border: Border.all(
color: isSelected ? Colors.blue : Colors.transparent, color: isSelected ? Colors.blue : Colors.transparent,
width: 2.0, width: 2.0,

View File

@ -35,8 +35,7 @@ class _DeviceManagementPageState extends State<DeviceManagementPage> {
return MultiBlocProvider( return MultiBlocProvider(
providers: [ providers: [
BlocProvider( BlocProvider(
create: (context) => create: (context) => DeviceManagementBloc()..add(FetchDevices(context)),
DeviceManagementBloc()..add(FetchDevices(context)),
), ),
], ],
child: WebScaffold( child: WebScaffold(
@ -59,8 +58,9 @@ class _DeviceManagementPageState extends State<DeviceManagementPage> {
BlocProvider.of<CreateRoutineBloc>(context) BlocProvider.of<CreateRoutineBloc>(context)
.add(const ResetSelectedEvent()); .add(const ResetSelectedEvent());
context.read<RoutineBloc>().add( context
const TriggerSwitchTabsEvent(isRoutineTab: false)); .read<RoutineBloc>()
.add(const TriggerSwitchTabsEvent(isRoutineTab: false));
context context
.read<DeviceManagementBloc>() .read<DeviceManagementBloc>()
.add(FetchDevices(context)); .add(FetchDevices(context));
@ -69,7 +69,7 @@ class _DeviceManagementPageState extends State<DeviceManagementPage> {
'Devices', 'Devices',
style: context.textTheme.titleMedium?.copyWith( style: context.textTheme.titleMedium?.copyWith(
color: !state.routineTab color: !state.routineTab
? ColorsManager.whiteColors ? ColorsManager.white
: ColorsManager.grayColor, : ColorsManager.grayColor,
fontWeight: fontWeight:
!state.routineTab ? FontWeight.w700 : FontWeight.w400, !state.routineTab ? FontWeight.w700 : FontWeight.w400,
@ -86,17 +86,17 @@ class _DeviceManagementPageState extends State<DeviceManagementPage> {
BlocProvider.of<CreateRoutineBloc>(context) BlocProvider.of<CreateRoutineBloc>(context)
.add(const ResetSelectedEvent()); .add(const ResetSelectedEvent());
context.read<RoutineBloc>().add( context
const TriggerSwitchTabsEvent(isRoutineTab: true)); .read<RoutineBloc>()
.add(const TriggerSwitchTabsEvent(isRoutineTab: true));
}, },
child: Text( child: Text(
'Workflow Automation', 'Workflow Automation',
style: context.textTheme.titleMedium?.copyWith( style: context.textTheme.titleMedium?.copyWith(
color: state.routineTab color: state.routineTab
? ColorsManager.whiteColors ? ColorsManager.white
: ColorsManager.grayColor, : ColorsManager.grayColor,
fontWeight: fontWeight: state.routineTab ? FontWeight.w700 : FontWeight.w400,
state.routineTab ? FontWeight.w700 : FontWeight.w400,
), ),
), ),
), ),
@ -120,8 +120,7 @@ class _DeviceManagementPageState extends State<DeviceManagementPage> {
} else if (deviceState is DeviceManagementLoaded) { } else if (deviceState is DeviceManagementLoaded) {
return DeviceManagementBody(devices: deviceState.devices); return DeviceManagementBody(devices: deviceState.devices);
} else if (deviceState is DeviceManagementFiltered) { } else if (deviceState is DeviceManagementFiltered) {
return DeviceManagementBody( return DeviceManagementBody(devices: deviceState.filteredDevices);
devices: deviceState.filteredDevices);
} else { } else {
return const DeviceManagementBody(devices: []); return const DeviceManagementBody(devices: []);
} }

View File

@ -120,8 +120,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
content: Text( content: Text(
'This Device is Offline', 'This Device is Offline',
), ),
duration: duration: Duration(seconds: 2),
Duration(seconds: 2),
), ),
); );
return; return;
@ -135,13 +134,11 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
device: selectedDevices.first, device: selectedDevices.first,
), ),
); );
} else if (selectedDevices.length > } else if (selectedDevices.length > 1) {
1) { final productTypes = selectedDevices
final productTypes = .map(
selectedDevices (device) => device.productType)
.map((device) => .toSet();
device.productType)
.toSet();
if (productTypes.length == 1) { if (productTypes.length == 1) {
showDialog( showDialog(
context: context, context: context,
@ -224,13 +221,11 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
device.batteryLevel != null device.batteryLevel != null
? '${device.batteryLevel}%' ? '${device.batteryLevel}%'
: '-', : '-',
formatDateTime( formatDateTime(DateTime.fromMillisecondsSinceEpoch(
DateTime.fromMillisecondsSinceEpoch( (device.createTime ?? 0) * 1000)),
(device.createTime ?? 0) * 1000)),
device.online == true ? 'Online' : 'Offline', device.online == true ? 'Online' : 'Offline',
formatDateTime( formatDateTime(DateTime.fromMillisecondsSinceEpoch(
DateTime.fromMillisecondsSinceEpoch( (device.updateTime ?? 0) * 1000)),
(device.updateTime ?? 0) * 1000)),
'Settings', 'Settings',
]; ];
}).toList(), }).toList(),
@ -273,7 +268,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
child: Material( child: Material(
child: Container( child: Container(
width: MediaQuery.of(context).size.width * 0.3, width: MediaQuery.of(context).size.width * 0.3,
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: DeviceSettingsPanel( child: DeviceSettingsPanel(
device: device, device: device,
onClose: () => Navigator.of(context).pop(), onClose: () => Navigator.of(context).pop(),

View File

@ -18,7 +18,7 @@ class AccurteCalibratingDialog extends StatelessWidget {
@override @override
Widget build(_) { Widget build(_) {
return AlertDialog( return AlertDialog(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
content: AccurateDialogWidget( content: AccurateDialogWidget(
title: 'Calibrating', title: 'Calibrating',

View File

@ -16,7 +16,7 @@ class AccurateCalibrationDialog extends StatelessWidget {
@override @override
Widget build(_) { Widget build(_) {
return AlertDialog( return AlertDialog(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
content: AccurateDialogWidget( content: AccurateDialogWidget(
title: 'Accurate Calibration', title: 'Accurate Calibration',

View File

@ -17,7 +17,7 @@ class CalibrateCompletedDialog extends StatelessWidget {
@override @override
Widget build(_) { Widget build(_) {
return AlertDialog( return AlertDialog(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
content: SizedBox( content: SizedBox(
height: 250, height: 250,

View File

@ -20,7 +20,7 @@ class CurtainActionWidget extends StatelessWidget {
height: 60, height: 60,
width: 60, width: 60,
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: ClipOval( child: ClipOval(
child: Container( child: Container(
height: 60, height: 60,

View File

@ -164,7 +164,7 @@ class _CurtainSliderWidgetState extends State<CurtainSliderWidget> {
divisions: 10, // 10% step divisions: 10, // 10% step
activeColor: ColorsManager.minBlueDot, activeColor: ColorsManager.minBlueDot,
thumbColor: ColorsManager.primaryColor, thumbColor: ColorsManager.primaryColor,
inactiveColor: ColorsManager.whiteColors, inactiveColor: ColorsManager.white,
// Start dragging — use local control // Start dragging — use local control
onChangeStart: (_) { onChangeStart: (_) {

View File

@ -47,10 +47,9 @@ class PrefReversCardWidget extends StatelessWidget {
child: Container( child: Container(
padding: const EdgeInsets.all(3), padding: const EdgeInsets.all(3),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: const BorderRadius.horizontal( borderRadius: const BorderRadius.horizontal(
left: Radius.circular(10), left: Radius.circular(10), right: Radius.circular(10)),
right: Radius.circular(10)),
border: Border.all(color: ColorsManager.grayBorder)), border: Border.all(color: ColorsManager.grayBorder)),
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.reverseArrows, Assets.reverseArrows,

View File

@ -22,7 +22,7 @@ class CurtainModulePrefrencesDialog extends StatelessWidget {
@override @override
Widget build(_) { Widget build(_) {
return AlertDialog( return AlertDialog(
backgroundColor: ColorsManager.CircleImageBackground, backgroundColor: ColorsManager.circleImageBackground,
contentPadding: const EdgeInsets.all(20), contentPadding: const EdgeInsets.all(20),
title: Center( title: Center(
child: Text( child: Text(

View File

@ -63,7 +63,7 @@ class _QuickCalibratingDialogState extends State<QuickCalibratingDialog> {
@override @override
Widget build(_) { Widget build(_) {
return AlertDialog( return AlertDialog(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
content: AccurateDialogWidget( content: AccurateDialogWidget(
title: 'Calibrating', title: 'Calibrating',

View File

@ -18,7 +18,7 @@ class QuickCalibrationDialog extends StatelessWidget {
@override @override
Widget build(_) { Widget build(_) {
return AlertDialog( return AlertDialog(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
content: AccurateDialogWidget( content: AccurateDialogWidget(
title: 'Quick Calibration', title: 'Quick Calibration',

View File

@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.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';
@ -47,8 +46,8 @@ class DeviceSettingsPanel extends StatelessWidget {
return BlocBuilder<SettingDeviceBloc, DeviceSettingsState>( return BlocBuilder<SettingDeviceBloc, DeviceSettingsState>(
builder: (context, state) { builder: (context, state) {
final _bloc = context.read<SettingDeviceBloc>(); final _bloc = context.read<SettingDeviceBloc>();
final iconPath = DeviceIconTypeHelper.getDeviceIconByTypeCode( final iconPath =
device.productType); DeviceIconTypeHelper.getDeviceIconByTypeCode(device.productType);
final deviceInfo = state is DeviceSettingsUpdate final deviceInfo = state is DeviceSettingsUpdate
? state.deviceInfo ?? DeviceInfoModel.empty() ? state.deviceInfo ?? DeviceInfoModel.empty()
: DeviceInfoModel.empty(); : DeviceInfoModel.empty();
@ -77,11 +76,9 @@ class DeviceSettingsPanel extends StatelessWidget {
children: [ children: [
Text( Text(
'Device Settings', 'Device Settings',
style: context.theme.textTheme.titleLarge! style: context.theme.textTheme.titleLarge!.copyWith(
.copyWith(
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
color: ColorsManager.vividBlue color: ColorsManager.vividBlue.withOpacity(0.7),
.withOpacity(0.7),
fontSize: 24), fontSize: 24),
), ),
], ],
@ -98,7 +95,7 @@ class DeviceSettingsPanel extends StatelessWidget {
backgroundColor: backgroundColor:
ColorsManager.grayBorder.withOpacity(0.5), ColorsManager.grayBorder.withOpacity(0.5),
child: CircleAvatar( child: CircleAvatar(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
radius: 36, radius: 36,
child: SvgPicture.asset( child: SvgPicture.asset(
iconPath, iconPath,
@ -116,8 +113,7 @@ class DeviceSettingsPanel extends StatelessWidget {
const SizedBox(height: 15), const SizedBox(height: 15),
Text( Text(
'Device Name:', 'Device Name:',
style: context.textTheme.bodyMedium! style: context.textTheme.bodyMedium!.copyWith(
.copyWith(
color: ColorsManager.grayColor, color: ColorsManager.grayColor,
), ),
), ),
@ -143,13 +139,13 @@ class DeviceSettingsPanel extends StatelessWidget {
_bloc.add(const ChangeNameEvent( _bloc.add(const ChangeNameEvent(
value: false)); value: false));
deviceManagementBloc deviceManagementBloc
..add(UpdateDeviceName( ..add(UpdateDeviceName(
deviceId: device.uuid!, deviceId: device.uuid!,
newName: _bloc newName:
.nameController _bloc.nameController.text))
.text))..add(ResetSelectedDevices()); ..add(ResetSelectedDevices());
}, },
decoration:const InputDecoration( decoration: const InputDecoration(
isDense: true, isDense: true,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
border: InputBorder.none, border: InputBorder.none,
@ -164,18 +160,16 @@ class DeviceSettingsPanel extends StatelessWidget {
width: 15, width: 15,
height: 25, height: 25,
child: Visibility( child: Visibility(
visible: visible: _bloc.editName != true,
_bloc.editName != true,
replacement: const SizedBox(), replacement: const SizedBox(),
child: InkWell( child: InkWell(
onTap: () { onTap: () {
_bloc.add( _bloc.add(
const ChangeNameEvent( const ChangeNameEvent(
value: true)); value: true));
}, },
child: SvgPicture.asset( child: SvgPicture.asset(
Assets Assets.editNameIconSettings,
.editNameIconSettings,
color: ColorsManager color: ColorsManager
.lightGrayBorderColor, .lightGrayBorderColor,
height: 15, height: 15,

View File

@ -32,7 +32,7 @@ class _SubSpaceDialogState extends State<SubSpaceDialog> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Dialog( return Dialog(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.white,
insetPadding: const EdgeInsets.symmetric(horizontal: 24, vertical: 60), insetPadding: const EdgeInsets.symmetric(horizontal: 24, vertical: 60),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(28), borderRadius: BorderRadius.circular(28),

View File

@ -100,7 +100,6 @@ class _DeviceItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return DeviceControlsContainer( return DeviceControlsContainer(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -110,7 +109,7 @@ class _DeviceItem extends StatelessWidget {
height: 60, height: 60,
width: 60, width: 60,
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: SvgPicture.asset( child: SvgPicture.asset(
device.icon ?? 'assets/icons/gateway.svg', device.icon ?? 'assets/icons/gateway.svg',
width: 35, width: 35,

View File

@ -36,7 +36,7 @@ class _EnergyConsumptionPageState extends State<EnergyConsumptionPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: Column( child: Column(
children: [ children: [
const Row( const Row(

View File

@ -22,7 +22,7 @@ class PowerClampInfoCard extends StatelessWidget {
child: Container( child: Container(
margin: const EdgeInsets.symmetric(horizontal: 6), margin: const EdgeInsets.symmetric(horizontal: 6),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
), ),
height: 55, height: 55,

View File

@ -12,8 +12,7 @@ import 'package:syncrow_web/utils/constants/assets.dart';
import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart';
//Smart Power Clamp //Smart Power Clamp
class SmartPowerDeviceControl extends StatelessWidget class SmartPowerDeviceControl extends StatelessWidget with HelperResponsiveLayout {
with HelperResponsiveLayout {
final String deviceId; final String deviceId;
const SmartPowerDeviceControl({super.key, required this.deviceId}); const SmartPowerDeviceControl({super.key, required this.deviceId});
@ -129,7 +128,7 @@ class SmartPowerDeviceControl extends StatelessWidget
bottom: 10, bottom: 10,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
), ),
height: 300, height: 300,
@ -149,8 +148,7 @@ class SmartPowerDeviceControl extends StatelessWidget
onPressed: blocProvider.currentPage <= 0 onPressed: blocProvider.currentPage <= 0
? null ? null
: () { : () {
blocProvider blocProvider.add(SmartPowerArrowPressedEvent(-1));
.add(SmartPowerArrowPressedEvent(-1));
pageController.previousPage( pageController.previousPage(
duration: const Duration(milliseconds: 300), duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut, curve: Curves.easeInOut,
@ -172,8 +170,7 @@ class SmartPowerDeviceControl extends StatelessWidget
onPressed: blocProvider.currentPage >= 3 onPressed: blocProvider.currentPage >= 3
? null ? null
: () { : () {
blocProvider blocProvider.add(SmartPowerArrowPressedEvent(1));
.add(SmartPowerArrowPressedEvent(1));
pageController.nextPage( pageController.nextPage(
duration: const Duration(milliseconds: 300), duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut, curve: Curves.easeInOut,
@ -202,8 +199,8 @@ class SmartPowerDeviceControl extends StatelessWidget
blocProvider.add(SelectDateEvent(context: context)); blocProvider.add(SelectDateEvent(context: context));
blocProvider.add(FilterRecordsByDateEvent( blocProvider.add(FilterRecordsByDateEvent(
selectedDate: blocProvider.dateTime!, selectedDate: blocProvider.dateTime!,
viewType: blocProvider viewType:
.views[blocProvider.currentIndex])); blocProvider.views[blocProvider.currentIndex]));
}, },
widget: blocProvider.dateSwitcher(), widget: blocProvider.dateSwitcher(),
chartData: blocProvider.energyDataList.isNotEmpty chartData: blocProvider.energyDataList.isNotEmpty

View File

@ -30,7 +30,7 @@ class ScheduleControlButton extends StatelessWidget {
height: 60, height: 60,
decoration: const BoxDecoration( decoration: const BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: ColorsManager.whiteColors, color: ColorsManager.white,
), ),
margin: const EdgeInsets.symmetric(horizontal: 4), margin: const EdgeInsets.symmetric(horizontal: 4),
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),

View File

@ -13,7 +13,7 @@ class ScheduleHeader extends StatelessWidget {
Text( Text(
'Scheduling', 'Scheduling',
style: TextStyle( style: TextStyle(
color: ColorsManager.primaryColorWithOpacity, color: ColorsManager.opaquePrimary,
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
fontSize: 30, fontSize: 30,
), ),

View File

@ -76,7 +76,7 @@ class _FactoryResetWidgetState extends State<FactoryResetWidget> {
child: Text( child: Text(
'Reset', 'Reset',
style: context.textTheme.bodyMedium!.copyWith( style: context.textTheme.bodyMedium!.copyWith(
color: ColorsManager.whiteColors, color: ColorsManager.white,
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
fontSize: 12, fontSize: 12,
), ),
@ -95,7 +95,7 @@ class _FactoryResetWidgetState extends State<FactoryResetWidget> {
children: [ children: [
ClipOval( ClipOval(
child: Container( child: Container(
color: ColorsManager.whiteColors, color: ColorsManager.white,
height: 60, height: 60,
width: 60, width: 60,
child: Padding( child: Padding(

View File

@ -45,7 +45,7 @@ class IconNameStatusContainer extends StatelessWidget {
height: 60, height: 60,
width: 60, width: 60,
padding: EdgeInsets.all(paddingAmount ?? 8), padding: EdgeInsets.all(paddingAmount ?? 8),
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: SvgPicture.asset( child: SvgPicture.asset(
icon, icon,
width: 35, width: 35,

View File

@ -1,10 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart';
import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart'; import 'package:syncrow_web/utils/constants/assets.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart';
class PresenceSpaceType extends StatelessWidget { class PresenceSpaceType extends StatelessWidget {
const PresenceSpaceType({ const PresenceSpaceType({
@ -59,7 +59,7 @@ class PresenceSpaceType extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(100), borderRadius: BorderRadius.circular(100),
color: value == spaceType color: value == spaceType
? ColorsManager.primaryColorWithOpacity ? ColorsManager.opaquePrimary
: ColorsManager.textGray, : ColorsManager.textGray,
), ),
child: SvgPicture.asset( child: SvgPicture.asset(

View File

@ -52,7 +52,7 @@ class ToggleWidget extends StatelessWidget {
height: 60, height: 60,
width: 60, width: 60,
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: SvgPicture.asset( child: SvgPicture.asset(
icon ?? Assets.lightPulp, icon ?? Assets.lightPulp,
width: 35, width: 35,

View File

@ -1,5 +1,4 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:syncrow_web/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart'; import 'package:syncrow_web/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart';
@ -7,7 +6,8 @@ import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/constants/assets.dart';
class CeilingLight extends StatelessWidget { class CeilingLight extends StatelessWidget {
const CeilingLight({super.key, required this.value, required this.code, required this.deviceId}); const CeilingLight(
{super.key, required this.value, required this.code, required this.deviceId});
final bool value; final bool value;
final String code; final String code;
@ -24,7 +24,7 @@ class CeilingLight extends StatelessWidget {
children: [ children: [
ClipOval( ClipOval(
child: Container( child: Container(
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.lightPulp, Assets.lightPulp,
width: 60, width: 60,

View File

@ -1,5 +1,4 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:syncrow_web/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart'; import 'package:syncrow_web/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart';
@ -7,7 +6,8 @@ import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/constants/assets.dart';
class SpotLight extends StatelessWidget { class SpotLight extends StatelessWidget {
const SpotLight({super.key, required this.value, required this.code, required this.deviceId}); const SpotLight(
{super.key, required this.value, required this.code, required this.deviceId});
final bool value; final bool value;
final String code; final String code;
@ -24,7 +24,7 @@ class SpotLight extends StatelessWidget {
children: [ children: [
ClipOval( ClipOval(
child: Container( child: Container(
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.lightPulp, Assets.lightPulp,
width: 60, width: 60,

View File

@ -1,5 +1,4 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:syncrow_web/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart'; import 'package:syncrow_web/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart';
@ -7,7 +6,8 @@ import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/constants/assets.dart';
class WallLight extends StatelessWidget { class WallLight extends StatelessWidget {
const WallLight({super.key, required this.value, required this.code, required this.deviceId}); const WallLight(
{super.key, required this.value, required this.code, required this.deviceId});
final bool value; final bool value;
final String code; final String code;
@ -24,7 +24,7 @@ class WallLight extends StatelessWidget {
children: [ children: [
ClipOval( ClipOval(
child: Container( child: Container(
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.lightPulp, Assets.lightPulp,
width: 60, width: 60,

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart';
import 'package:syncrow_web/pages/device_managment/schedule_device/schedule_widgets/schedule_mode_buttons.dart'; import 'package:syncrow_web/pages/device_managment/schedule_device/schedule_widgets/schedule_mode_buttons.dart';
import 'package:syncrow_web/pages/device_managment/water_heater/models/schedule_entry.dart'; import 'package:syncrow_web/pages/device_managment/water_heater/models/schedule_entry.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
class ScheduleDialogHelper { class ScheduleDialogHelper {
@ -58,7 +58,7 @@ class ScheduleDialogHelper {
Text( Text(
isEdit ? 'Edit Schedule' : 'Add Schedule', isEdit ? 'Edit Schedule' : 'Add Schedule',
style: Theme.of(context).textTheme.titleLarge!.copyWith( style: Theme.of(context).textTheme.titleLarge!.copyWith(
color: ColorsManager.primaryColorWithOpacity, color: ColorsManager.opaquePrimary,
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
fontSize: 30, fontSize: 30,
), ),
@ -171,8 +171,8 @@ class ScheduleDialogHelper {
return result; return result;
} }
static Widget _buildDayCheckboxes(BuildContext ctx, List<bool> selectedDays, static Widget _buildDayCheckboxes(
Function(int, bool) onChanged) { BuildContext ctx, List<bool> selectedDays, Function(int, bool) onChanged) {
final dayLabels = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; final dayLabels = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
@ -197,8 +197,7 @@ class ScheduleDialogHelper {
children: [ children: [
Text( Text(
'Function:', 'Function:',
style: style: Theme.of(ctx).textTheme.bodySmall!.copyWith(color: Colors.grey),
Theme.of(ctx).textTheme.bodySmall!.copyWith(color: Colors.grey),
), ),
const SizedBox(width: 10), const SizedBox(width: 10),
Radio<bool>( Radio<bool>(
@ -213,7 +212,6 @@ class ScheduleDialogHelper {
Radio<bool>( Radio<bool>(
activeColor: ColorsManager.secondaryColor, activeColor: ColorsManager.secondaryColor,
focusColor: ColorsManager.secondaryColor, focusColor: ColorsManager.secondaryColor,
value: false, value: false,
groupValue: isOn, groupValue: isOn,
onChanged: (val) => onChanged(false), onChanged: (val) => onChanged(false),

View File

@ -17,7 +17,7 @@ Future<void> showPopUpFilterMenu({
await showMenu( await showMenu(
context: context, context: context,
position: position, position: position,
color: ColorsManager.whiteColors, color: ColorsManager.white,
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(10)), borderRadius: BorderRadius.all(Radius.circular(10)),
), ),

View File

@ -51,7 +51,7 @@ class _RoleDropdownState extends State<RoleDropdown> {
const SizedBox(height: 8), const SizedBox(height: 8),
SizedBox( SizedBox(
child: DropdownButtonFormField<String>( child: DropdownButtonFormField<String>(
dropdownColor: ColorsManager.whiteColors, dropdownColor: ColorsManager.white,
// alignment: Alignment., // alignment: Alignment.,
focusColor: Colors.white, focusColor: Colors.white,
autofocus: true, autofocus: true,

View File

@ -28,9 +28,7 @@ class RolesAndPermission extends StatelessWidget {
Text( Text(
'Role & Permissions', 'Role & Permissions',
style: context.textTheme.bodyLarge?.copyWith( style: context.textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700, fontSize: 20, color: Colors.black),
fontSize: 20,
color: Colors.black),
), ),
const SizedBox( const SizedBox(
height: 15, height: 15,
@ -67,21 +65,18 @@ class RolesAndPermission extends StatelessWidget {
border: Border.all( border: Border.all(
color: ColorsManager.grayBorder)), color: ColorsManager.grayBorder)),
child: TextFormField( child: TextFormField(
style: style: const TextStyle(color: Colors.black),
const TextStyle(color: Colors.black), controller: _blocRole.roleSearchController,
controller:
_blocRole.roleSearchController,
onChanged: (value) { onChanged: (value) {
_blocRole.add(SearchPermission( _blocRole.add(SearchPermission(
nodes: _blocRole.permissions, nodes: _blocRole.permissions,
searchTerm: value)); searchTerm: value));
}, },
decoration: textBoxDecoration(radios: 20)! decoration:
.copyWith( textBoxDecoration(radios: 20)!.copyWith(
fillColor: Colors.white, fillColor: Colors.white,
suffixIcon: Padding( suffixIcon: Padding(
padding: padding: const EdgeInsets.only(right: 16),
const EdgeInsets.only(right: 16),
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.textFieldSearch, Assets.textFieldSearch,
width: 24, width: 24,
@ -108,7 +103,7 @@ class RolesAndPermission extends StatelessWidget {
color: ColorsManager.circleRolesBackground, color: ColorsManager.circleRolesBackground,
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Container( child: Container(
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: PermissionManagement( child: PermissionManagement(
bloc: _blocRole, bloc: _blocRole,
)))) ))))

View File

@ -23,7 +23,7 @@ Future<void> showDateFilterMenu({
await showMenu( await showMenu(
context: context, context: context,
position: position, position: position,
color: ColorsManager.whiteColors, color: ColorsManager.white,
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
bottomRight: Radius.circular(10), bottomRight: Radius.circular(10),
@ -41,9 +41,8 @@ Future<void> showDateFilterMenu({
title: Text( title: Text(
"Sort from newest to oldest", "Sort from newest to oldest",
style: TextStyle( style: TextStyle(
color: isSelected == "NewestToOldest" color:
? Colors.black isSelected == "NewestToOldest" ? Colors.black : Colors.blueGrey),
: Colors.blueGrey),
), ),
), ),
), ),
@ -57,9 +56,8 @@ Future<void> showDateFilterMenu({
title: Text( title: Text(
"Sort from oldest to newest", "Sort from oldest to newest",
style: TextStyle( style: TextStyle(
color: isSelected == "OldestToNewest" color:
? Colors.black isSelected == "OldestToNewest" ? Colors.black : Colors.blueGrey),
: Colors.blueGrey),
), ),
), ),
), ),

View File

@ -23,7 +23,7 @@ Future<void> showDeActivateFilterMenu({
await showMenu( await showMenu(
context: context, context: context,
position: position, position: position,
color: ColorsManager.whiteColors, color: ColorsManager.white,
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
bottomRight: Radius.circular(10), bottomRight: Radius.circular(10),
@ -41,9 +41,8 @@ Future<void> showDeActivateFilterMenu({
title: Text( title: Text(
"Sort A to Z", "Sort A to Z",
style: TextStyle( style: TextStyle(
color: isSelected == "NewestToOldest" color:
? Colors.black isSelected == "NewestToOldest" ? Colors.black : Colors.blueGrey),
: Colors.blueGrey),
), ),
), ),
), ),
@ -57,9 +56,8 @@ Future<void> showDeActivateFilterMenu({
title: Text( title: Text(
"Sort Z to A", "Sort Z to A",
style: TextStyle( style: TextStyle(
color: isSelected == "OldestToNewest" color:
? Colors.black isSelected == "OldestToNewest" ? Colors.black : Colors.blueGrey),
: Colors.blueGrey),
), ),
), ),
), ),

View File

@ -23,7 +23,7 @@ Future<void> showNameMenu({
await showMenu( await showMenu(
context: context, context: context,
position: position, position: position,
color: ColorsManager.whiteColors, color: ColorsManager.white,
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
bottomRight: Radius.circular(10), bottomRight: Radius.circular(10),

View File

@ -83,8 +83,7 @@ class _TableRow extends StatelessWidget {
for (int i = 0; i < cells.length; i++) for (int i = 0; i < cells.length; i++)
Container( Container(
width: columnWidths[i], width: columnWidths[i],
padding: padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
// decoration: BoxDecoration( // decoration: BoxDecoration(
// border: Border( // border: Border(
// right: BorderSide(color: ColorsManager.boxDivider), // right: BorderSide(color: ColorsManager.boxDivider),
@ -201,7 +200,7 @@ class _DynamicTableScreenState extends State<DynamicTableScreen> {
return Container( return Container(
decoration: containerDecoration.copyWith( decoration: containerDecoration.copyWith(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: const BorderRadius.only( borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(15), bottomLeft: Radius.circular(15),
bottomRight: Radius.circular(15), bottomRight: Radius.circular(15),
@ -231,8 +230,7 @@ class _DynamicTableScreenState extends State<DynamicTableScreen> {
if (_lastAvailableWidth != availableWidth) { if (_lastAvailableWidth != availableWidth) {
final equalWidth = final equalWidth =
(availableWidth - totalDividersWidth) / widget.titles.length; (availableWidth - totalDividersWidth) / widget.titles.length;
final clampedWidth = final clampedWidth = equalWidth.clamp(_minColumnWidth, _maxColumnWidth);
equalWidth.clamp(_minColumnWidth, _maxColumnWidth);
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() { setState(() {
@ -249,7 +247,7 @@ class _DynamicTableScreenState extends State<DynamicTableScreen> {
child: Container( child: Container(
width: totalTableWidth, width: totalTableWidth,
decoration: containerDecoration.copyWith( decoration: containerDecoration.copyWith(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: const BorderRadius.all(Radius.circular(20)), borderRadius: const BorderRadius.all(Radius.circular(20)),
), ),
child: Column( child: Column(

View File

@ -61,8 +61,7 @@ class UsersPage extends StatelessWidget {
: ColorsManager.disabledPink.withOpacity(0.5), : ColorsManager.disabledPink.withOpacity(0.5),
), ),
child: Padding( child: Padding(
padding: padding: const EdgeInsets.only(left: 10, right: 10, bottom: 5, top: 5),
const EdgeInsets.only(left: 10, right: 10, bottom: 5, top: 5),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@ -93,8 +92,7 @@ class UsersPage extends StatelessWidget {
child: InkWell( child: InkWell(
onTap: onTap, onTap: onTap,
child: Padding( child: Padding(
padding: padding: const EdgeInsets.only(left: 5, right: 5, bottom: 5, top: 5),
const EdgeInsets.only(left: 5, right: 5, bottom: 5, top: 5),
child: SvgPicture.asset( child: SvgPicture.asset(
status == "invited" status == "invited"
? Assets.invitedIcon ? Assets.invitedIcon
@ -142,7 +140,7 @@ class UsersPage extends StatelessWidget {
}, },
style: const TextStyle(color: Colors.black), style: const TextStyle(color: Colors.black),
decoration: textBoxDecoration(radios: 15)!.copyWith( decoration: textBoxDecoration(radios: 15)!.copyWith(
fillColor: ColorsManager.whiteColors, fillColor: ColorsManager.white,
errorStyle: const TextStyle(height: 0), errorStyle: const TextStyle(height: 0),
hintStyle: context.textTheme.titleSmall?.copyWith( hintStyle: context.textTheme.titleSmall?.copyWith(
color: Colors.grey, color: Colors.grey,
@ -430,14 +428,12 @@ class UsersPage extends StatelessWidget {
Text(user.createdTime ?? ''), Text(user.createdTime ?? ''),
Text(user.invitedBy), Text(user.invitedBy),
status( status(
status: user.isEnabled == false status:
? 'disabled' user.isEnabled == false ? 'disabled' : user.status,
: user.status,
), ),
changeIconStatus( changeIconStatus(
status: user.isEnabled == false status:
? 'disabled' user.isEnabled == false ? 'disabled' : user.status,
: user.status,
userId: user.uuid, userId: user.uuid,
onTap: user.status != "invited" onTap: user.status != "invited"
? () { ? () {
@ -484,11 +480,10 @@ class UsersPage extends StatelessWidget {
context: context, context: context,
barrierDismissible: false, barrierDismissible: false,
builder: (BuildContext context) { builder: (BuildContext context) {
return DeleteUserDialog( return DeleteUserDialog(onTapDelete: () async {
onTapDelete: () async {
try { try {
_blocRole.add(DeleteUserEvent( _blocRole.add(
user.uuid, context)); DeleteUserEvent(user.uuid, context));
await Future.delayed( await Future.delayed(
const Duration(seconds: 2)); const Duration(seconds: 2));
return true; return true;
@ -521,8 +516,7 @@ class UsersPage extends StatelessWidget {
visiblePagesCount: 4, visiblePagesCount: 4,
buttonRadius: 10, buttonRadius: 10,
selectedButtonColor: ColorsManager.secondaryColor, selectedButtonColor: ColorsManager.secondaryColor,
buttonUnSelectedBorderColor: buttonUnSelectedBorderColor: ColorsManager.grayBorder,
ColorsManager.grayBorder,
lastPageIcon: lastPageIcon:
const Icon(Icons.keyboard_double_arrow_right), const Icon(Icons.keyboard_double_arrow_right),
firstPageIcon: firstPageIcon:

View File

@ -9,7 +9,7 @@ class RoleCard extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, // Card background color color: ColorsManager.white, // Card background color
borderRadius: BorderRadius.circular(20), // Rounded corners borderRadius: BorderRadius.circular(20), // Rounded corners
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
@ -22,7 +22,7 @@ class RoleCard extends StatelessWidget {
), ),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
), ),
child: Column( child: Column(

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/shared/navigate_home_grid_view.dart'; import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.dart';
import 'package:syncrow_web/pages/roles_and_permission/bloc/roles_permission_bloc.dart'; import 'package:syncrow_web/pages/roles_and_permission/bloc/roles_permission_bloc.dart';
import 'package:syncrow_web/pages/roles_and_permission/bloc/roles_permission_state.dart'; import 'package:syncrow_web/pages/roles_and_permission/bloc/roles_permission_state.dart';
@ -30,8 +29,7 @@ class RolesAndPermissionPage extends StatelessWidget {
enableMenuSidebar: false, enableMenuSidebar: false,
appBarTitle: Text( appBarTitle: Text(
'Roles & Permissions', 'Roles & Permissions',
style: style: ResponsiveTextTheme.of(context).deviceManagementTitle,
ResponsiveTextTheme.of(context).deviceManagementTitle,
), ),
rightBody: const NavigateHomeGridView(), rightBody: const NavigateHomeGridView(),
centerBody: Row( centerBody: Row(
@ -66,7 +64,7 @@ class RolesAndPermissionPage extends StatelessWidget {
'Users', 'Users',
style: context.textTheme.titleMedium?.copyWith( style: context.textTheme.titleMedium?.copyWith(
color: (_blocRole.tapSelect == true) color: (_blocRole.tapSelect == true)
? ColorsManager.whiteColors ? ColorsManager.white
: ColorsManager.grayColor, : ColorsManager.grayColor,
fontWeight: (_blocRole.tapSelect == true) fontWeight: (_blocRole.tapSelect == true)
? FontWeight.w700 ? FontWeight.w700

View File

@ -32,7 +32,7 @@ class RolesPage extends StatelessWidget {
controller: searchController, controller: searchController,
style: const TextStyle(color: Colors.black), style: const TextStyle(color: Colors.black),
decoration: textBoxDecoration(radios: 15)!.copyWith( decoration: textBoxDecoration(radios: 15)!.copyWith(
fillColor: ColorsManager.whiteColors, fillColor: ColorsManager.white,
errorStyle: const TextStyle(height: 0), errorStyle: const TextStyle(height: 0),
hintStyle: context.textTheme.titleSmall?.copyWith( hintStyle: context.textTheme.titleSmall?.copyWith(
color: Colors.grey, color: Colors.grey,

View File

@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/routines/create_new_routines/dropdown_menu_content.dart'; import 'package:syncrow_web/pages/routines/create_new_routines/dropdown_menu_content.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
import 'space_tree_dropdown_bloc.dart'; import 'space_tree_dropdown_bloc.dart';
class SpaceTreeDropdown extends StatelessWidget { class SpaceTreeDropdown extends StatelessWidget {
@ -176,7 +177,7 @@ class _DropdownContentState extends State<_DropdownContent> {
showWhenUnlinked: false, showWhenUnlinked: false,
offset: const Offset(0, 48), offset: const Offset(0, 48),
child: Material( child: Material(
color: ColorsManager.whiteColors, color: ColorsManager.white,
elevation: 8, elevation: 8,
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
child: BlocProvider.value( child: BlocProvider.value(
@ -201,8 +202,7 @@ class _DropdownContentState extends State<_DropdownContent> {
Overlay.of(context).insert(_overlayEntry!); Overlay.of(context).insert(_overlayEntry!);
} }
CommunityModel? _findCommunity( CommunityModel? _findCommunity(SpaceTreeDropdownState state, String? communityId) {
SpaceTreeDropdownState state, String? communityId) {
if (communityId == null) return null; if (communityId == null) return null;
try { try {
return state.filteredCommunities.firstWhere((c) => c.uuid == communityId); return state.filteredCommunities.firstWhere((c) => c.uuid == communityId);

View File

@ -35,8 +35,7 @@ class SpaceDropdown extends StatelessWidget {
DropdownButton2<String>( DropdownButton2<String>(
underline: const SizedBox(), underline: const SizedBox(),
buttonStyleData: ButtonStyleData( buttonStyleData: ButtonStyleData(
decoration: decoration: BoxDecoration(borderRadius: BorderRadius.circular(12)),
BoxDecoration(borderRadius: BorderRadius.circular(12)),
), ),
value: selectedValue, value: selectedValue,
items: spaces.map((space) { items: spaces.map((space) {
@ -98,9 +97,7 @@ class SpaceDropdown extends StatelessWidget {
padding: const EdgeInsets.only(left: 10), padding: const EdgeInsets.only(left: 10),
child: Text( child: Text(
selectedValue != null selectedValue != null
? spaces ? spaces.firstWhere((e) => e.uuid == selectedValue).name
.firstWhere((e) => e.uuid == selectedValue)
.name
: hintMessage, : hintMessage,
style: Theme.of(context).textTheme.bodySmall!.copyWith( style: Theme.of(context).textTheme.bodySmall!.copyWith(
fontSize: 13, fontSize: 13,
@ -134,7 +131,7 @@ class SpaceDropdown extends StatelessWidget {
dropdownStyleData: DropdownStyleData( dropdownStyleData: DropdownStyleData(
maxHeight: MediaQuery.of(context).size.height * 0.4, maxHeight: MediaQuery.of(context).size.height * 0.4,
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
), ),
), ),

View File

@ -17,10 +17,9 @@ class SaveRoutineHelper {
builder: (context) { builder: (context) {
return BlocBuilder<RoutineBloc, RoutineState>( return BlocBuilder<RoutineBloc, RoutineState>(
builder: (context, state) { builder: (context, state) {
final selectedConditionLabel = final selectedConditionLabel = state.selectedAutomationOperator == 'and'
state.selectedAutomationOperator == 'and' ? 'All Conditions are met'
? 'All Conditions are met' : 'Any Condition is met';
: 'Any Condition is met';
return AlertDialog( return AlertDialog(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
@ -38,11 +37,10 @@ class SaveRoutineHelper {
Text( Text(
'Create a scene: ${state.routineName ?? ""}', 'Create a scene: ${state.routineName ?? ""}',
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: style: Theme.of(context).textTheme.headlineMedium!.copyWith(
Theme.of(context).textTheme.headlineMedium!.copyWith( color: ColorsManager.opaquePrimary,
color: ColorsManager.primaryColorWithOpacity, fontWeight: FontWeight.bold,
fontWeight: FontWeight.bold, ),
),
), ),
const SizedBox(height: 18), const SizedBox(height: 18),
_buildDivider(), _buildDivider(),
@ -60,8 +58,7 @@ class SaveRoutineHelper {
_buildIfConditions(state, context), _buildIfConditions(state, context),
Container( Container(
width: 1, width: 1,
color: ColorsManager.greyColor color: ColorsManager.greyColor.withValues(alpha: 0.8),
.withValues(alpha: 0.8),
), ),
_buildThenActions(state, context), _buildThenActions(state, context),
], ],
@ -100,8 +97,7 @@ class SaveRoutineHelper {
child: Row( child: Row(
spacing: 16, spacing: 16,
children: [ children: [
Expanded( Expanded(child: Text('IF: $selectedConditionLabel', style: textStyle)),
child: Text('IF: $selectedConditionLabel', style: textStyle)),
const Expanded(child: Text('THEN:', style: textStyle)), const Expanded(child: Text('THEN:', style: textStyle)),
], ],
), ),
@ -136,7 +132,7 @@ class SaveRoutineHelper {
Navigator.pop(context); Navigator.pop(context);
}, },
textColor: ColorsManager.primaryColorWithOpacity, textColor: ColorsManager.opaquePrimary,
), ),
], ],
); );
@ -147,8 +143,7 @@ class SaveRoutineHelper {
child: ListView( child: ListView(
// shrinkWrap: true, // shrinkWrap: true,
children: state.thenItems.map((item) { children: state.thenItems.map((item) {
final functions = final functions = state.selectedFunctions[item['uniqueCustomId']] ?? [];
state.selectedFunctions[item['uniqueCustomId']] ?? [];
return functionRow(item, context, functions); return functionRow(item, context, functions);
}).toList(), }).toList(),
), ),
@ -208,20 +203,19 @@ class SaveRoutineHelper {
), ),
), ),
child: Center( child: Center(
child: child: item['type'] == 'tap_to_run' || item['type'] == 'scene'
item['type'] == 'tap_to_run' || item['type'] == 'scene' ? Image.memory(
? Image.memory( base64Decode(item['icon']),
base64Decode(item['icon']), width: 12,
width: 12, height: 22,
height: 22, fit: BoxFit.scaleDown,
fit: BoxFit.scaleDown, )
) : SvgPicture.asset(
: SvgPicture.asset( item['imagePath'],
item['imagePath'], width: 12,
width: 12, height: 12,
height: 12, fit: BoxFit.scaleDown,
fit: BoxFit.scaleDown, ),
),
), ),
), ),
Flexible( Flexible(

View File

@ -35,7 +35,7 @@ class CreateNewRoutineView extends StatelessWidget {
child: Card( child: Card(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
), ),
child: const ConditionsRoutinesDevicesView()), child: const ConditionsRoutinesDevicesView()),
@ -53,7 +53,7 @@ class CreateNewRoutineView extends StatelessWidget {
margin: EdgeInsets.zero, margin: EdgeInsets.zero,
child: Container( child: Container(
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
topLeft: Radius.circular(15), topLeft: Radius.circular(15),
topRight: Radius.circular(15), topRight: Radius.circular(15),

View File

@ -12,11 +12,7 @@ class ConditionToggle extends StatelessWidget {
}); });
static const _conditions = ["<", "==", ">"]; static const _conditions = ["<", "==", ">"];
static const _icons = [ static const _icons = [Icons.chevron_left, Icons.drag_handle, Icons.chevron_right];
Icons.chevron_left,
Icons.drag_handle,
Icons.chevron_right
];
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -41,16 +37,14 @@ class ConditionToggle extends StatelessWidget {
duration: const Duration(milliseconds: 180), duration: const Duration(milliseconds: 180),
curve: Curves.ease, curve: Curves.ease,
decoration: BoxDecoration( decoration: BoxDecoration(
color: color: isSelected ? ColorsManager.vividBlue : Colors.transparent,
isSelected ? ColorsManager.vividBlue : Colors.transparent,
), ),
child: Center( child: Center(
child: Icon( child: Icon(
_icons[index], _icons[index],
size: 20, size: 20,
color: isSelected color:
? ColorsManager.whiteColors isSelected ? ColorsManager.white : ColorsManager.blackColor,
: ColorsManager.blackColor,
weight: isSelected ? 700 : 500, weight: isSelected ? 700 : 500,
), ),
), ),

View File

@ -39,7 +39,8 @@ class DeleteSceneWidget extends StatelessWidget {
), ),
), ),
), ),
Container(width: 1, height: 50, color: ColorsManager.greyColor), Container(
width: 1, height: 50, color: ColorsManager.greyColor),
InkWell( InkWell(
onTap: () { onTap: () {
context.read<RoutineBloc>().add(const DeleteScene()); context.read<RoutineBloc>().add(const DeleteScene());
@ -51,7 +52,7 @@ class DeleteSceneWidget extends StatelessWidget {
child: Text( child: Text(
'Confirm', 'Confirm',
style: Theme.of(context).textTheme.bodyMedium!.copyWith( style: Theme.of(context).textTheme.bodyMedium!.copyWith(
color: ColorsManager.primaryColorWithOpacity, color: ColorsManager.opaquePrimary,
), ),
), ),
), ),

View File

@ -37,9 +37,7 @@ class DialogFooter extends StatelessWidget {
DialogFooterButton( DialogFooterButton(
text: 'Confirm', text: 'Confirm',
onTap: onConfirm, onTap: onConfirm,
textColor: isConfirmEnabled textColor: isConfirmEnabled ? ColorsManager.opaquePrimary : Colors.red,
? ColorsManager.primaryColorWithOpacity
: Colors.red,
), ),
], ],
], ],
@ -65,7 +63,7 @@ class DialogFooterButton extends StatelessWidget {
return Expanded( return Expanded(
child: TextButton( child: TextButton(
style: TextButton.styleFrom( style: TextButton.styleFrom(
foregroundColor: ColorsManager.primaryColorWithOpacity, foregroundColor: ColorsManager.opaquePrimary,
disabledForegroundColor: ColorsManager.primaryColor, disabledForegroundColor: ColorsManager.primaryColor,
), ),
onPressed: onTap, onPressed: onTap,

View File

@ -18,7 +18,7 @@ class DialogHeader extends StatelessWidget {
title, title,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodyMedium!.copyWith( style: Theme.of(context).textTheme.bodyMedium!.copyWith(
color: ColorsManager.primaryColorWithOpacity, color: ColorsManager.opaquePrimary,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
), ),

View File

@ -33,17 +33,18 @@ class DraggableCard extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<RoutineBloc, RoutineState>( return BlocBuilder<RoutineBloc, RoutineState>(
builder: (context, state) { builder: (context, state) {
final deviceFunctions = state.selectedFunctions[deviceData['uniqueCustomId']] ?? []; final deviceFunctions =
state.selectedFunctions[deviceData['uniqueCustomId']] ?? [];
int index = state.thenItems int index = state.thenItems.indexWhere(
.indexWhere((item) => item['uniqueCustomId'] == deviceData['uniqueCustomId']); (item) => item['uniqueCustomId'] == deviceData['uniqueCustomId']);
if (index != -1) { if (index != -1) {
return _buildCardContent(context, deviceFunctions, padding: padding); return _buildCardContent(context, deviceFunctions, padding: padding);
} }
int ifIndex = state.ifItems int ifIndex = state.ifItems.indexWhere(
.indexWhere((item) => item['uniqueCustomId'] == deviceData['uniqueCustomId']); (item) => item['uniqueCustomId'] == deviceData['uniqueCustomId']);
if (ifIndex != -1) { if (ifIndex != -1) {
return _buildCardContent(context, deviceFunctions, padding: padding); return _buildCardContent(context, deviceFunctions, padding: padding);
@ -62,12 +63,13 @@ class DraggableCard extends StatelessWidget {
); );
} }
Widget _buildCardContent(BuildContext context, List<DeviceFunctionData> deviceFunctions, Widget _buildCardContent(
BuildContext context, List<DeviceFunctionData> deviceFunctions,
{EdgeInsetsGeometry? padding}) { {EdgeInsetsGeometry? padding}) {
return Stack( return Stack(
children: [ children: [
Card( Card(
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: Container( child: Container(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
width: 110, width: 110,
@ -92,7 +94,8 @@ class DraggableCard extends StatelessWidget {
), ),
), ),
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
child: deviceData['type'] == 'tap_to_run' || deviceData['type'] == 'scene' child: deviceData['type'] == 'tap_to_run' ||
deviceData['type'] == 'scene'
? Image.memory( ? Image.memory(
base64Decode(deviceData['icon']), base64Decode(deviceData['icon']),
) )
@ -123,7 +126,9 @@ class DraggableCard extends StatelessWidget {
spacing: 2, spacing: 2,
children: [ children: [
SizedBox( SizedBox(
width: 8, height: 8, child: SvgPicture.asset(Assets.deviceTagIcon)), width: 8,
height: 8,
child: SvgPicture.asset(Assets.deviceTagIcon)),
Flexible( Flexible(
child: Text( child: Text(
deviceData['tag'] ?? '', deviceData['tag'] ?? '',
@ -141,13 +146,15 @@ class DraggableCard extends StatelessWidget {
), ),
), ),
Visibility( Visibility(
visible: deviceData['subSpace'] != null && deviceData['subSpace'] != '', visible: deviceData['subSpace'] != null &&
deviceData['subSpace'] != '',
child: const SizedBox( child: const SizedBox(
height: 4, height: 4,
), ),
), ),
Visibility( Visibility(
visible: deviceData['subSpace'] != null && deviceData['subSpace'] != '', visible: deviceData['subSpace'] != null &&
deviceData['subSpace'] != '',
child: Row( child: Row(
spacing: 2, spacing: 2,
children: [ children: [
@ -222,7 +229,8 @@ class DraggableCard extends StatelessWidget {
} }
String _formatFunctionValue(DeviceFunctionData function) { String _formatFunctionValue(DeviceFunctionData function) {
if (function.functionCode == 'temp_set' || function.functionCode == 'temp_current') { if (function.functionCode == 'temp_set' ||
function.functionCode == 'temp_current') {
return '${(function.value / 10).toStringAsFixed(0)}°C'; return '${(function.value / 10).toStringAsFixed(0)}°C';
} else if (function.functionCode.contains('countdown')) { } else if (function.functionCode.contains('countdown')) {
final seconds = function.value?.toInt() ?? 0; final seconds = function.value?.toInt() ?? 0;

View File

@ -32,8 +32,7 @@ class IfContainer extends StatelessWidget {
fontSize: 18, fontWeight: FontWeight.bold)), fontSize: 18, fontWeight: FontWeight.bold)),
if (state.isAutomation && state.ifItems.isNotEmpty) if (state.isAutomation && state.ifItems.isNotEmpty)
AutomationOperatorSelector( AutomationOperatorSelector(
selectedOperator: selectedOperator: state.selectedAutomationOperator),
state.selectedAutomationOperator),
], ],
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
@ -57,8 +56,8 @@ class IfContainer extends StatelessWidget {
(index) => GestureDetector( (index) => GestureDetector(
onTap: () async { onTap: () async {
if (!state.isTabToRun) { if (!state.isTabToRun) {
final result = await DeviceDialogHelper final result =
.showDeviceDialog( await DeviceDialogHelper.showDeviceDialog(
context: context, context: context,
data: state.ifItems[index], data: state.ifItems[index],
removeComparetors: false, removeComparetors: false,
@ -79,8 +78,8 @@ class IfContainer extends StatelessWidget {
'NCPS', 'NCPS',
'WH', 'WH',
'PC', 'PC',
].contains(state.ifItems[index] ].contains(
['productType'])) { state.ifItems[index]['productType'])) {
context.read<RoutineBloc>().add( context.read<RoutineBloc>().add(
AddToIfContainer( AddToIfContainer(
state.ifItems[index], false)); state.ifItems[index], false));
@ -97,12 +96,11 @@ class IfContainer extends StatelessWidget {
isFromThen: false, isFromThen: false,
isFromIf: true, isFromIf: true,
onRemove: () { onRemove: () {
context.read<RoutineBloc>().add( context.read<RoutineBloc>().add(RemoveDragCard(
RemoveDragCard( index: index,
index: index, isFromThen: false,
isFromThen: false, key: state.ifItems[index]
key: state.ifItems[index] ['uniqueCustomId']));
['uniqueCustomId']));
}, },
), ),
)), )),
@ -123,9 +121,7 @@ class IfContainer extends StatelessWidget {
if (!state.isTabToRun) { if (!state.isTabToRun) {
if (mutableData['deviceId'] == 'tab_to_run') { if (mutableData['deviceId'] == 'tab_to_run') {
context context.read<RoutineBloc>().add(AddToIfContainer(mutableData, true));
.read<RoutineBloc>()
.add(AddToIfContainer(mutableData, true));
} else { } else {
final result = await DeviceDialogHelper.showDeviceDialog( final result = await DeviceDialogHelper.showDeviceDialog(
dialogType: 'IF', dialogType: 'IF',
@ -184,7 +180,7 @@ class AutomationOperatorSelector extends StatelessWidget {
style: TextButton.styleFrom( style: TextButton.styleFrom(
backgroundColor: selectedOperator.toLowerCase() == 'or' backgroundColor: selectedOperator.toLowerCase() == 'or'
? ColorsManager.dialogBlueTitle ? ColorsManager.dialogBlueTitle
: ColorsManager.whiteColors, : ColorsManager.white,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(0), borderRadius: BorderRadius.circular(0),
), ),
@ -193,7 +189,7 @@ class AutomationOperatorSelector extends StatelessWidget {
'Any condition is met', 'Any condition is met',
style: context.textTheme.bodyMedium?.copyWith( style: context.textTheme.bodyMedium?.copyWith(
color: selectedOperator.toLowerCase() == 'or' color: selectedOperator.toLowerCase() == 'or'
? ColorsManager.whiteColors ? ColorsManager.white
: ColorsManager.blackColor, : ColorsManager.blackColor,
), ),
), ),
@ -212,7 +208,7 @@ class AutomationOperatorSelector extends StatelessWidget {
style: TextButton.styleFrom( style: TextButton.styleFrom(
backgroundColor: selectedOperator.toLowerCase() == 'and' backgroundColor: selectedOperator.toLowerCase() == 'and'
? ColorsManager.dialogBlueTitle ? ColorsManager.dialogBlueTitle
: ColorsManager.whiteColors, : ColorsManager.white,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(0), borderRadius: BorderRadius.circular(0),
), ),
@ -221,7 +217,7 @@ class AutomationOperatorSelector extends StatelessWidget {
'All condition is met', 'All condition is met',
style: context.textTheme.bodyMedium?.copyWith( style: context.textTheme.bodyMedium?.copyWith(
color: selectedOperator.toLowerCase() == 'and' color: selectedOperator.toLowerCase() == 'and'
? ColorsManager.whiteColors ? ColorsManager.white
: ColorsManager.blackColor, : ColorsManager.blackColor,
), ),
), ),

View File

@ -91,7 +91,7 @@ class _RoutineViewCardState extends State<RoutineViewCard> {
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
), ),
color: ColorsManager.whiteColors, color: ColorsManager.white,
child: InkWell( child: InkWell(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
child: Padding( child: Padding(
@ -121,8 +121,7 @@ class _RoutineViewCardState extends State<RoutineViewCard> {
child: SizedBox( child: SizedBox(
width: 16, width: 16,
height: 16, height: 16,
child: child: CircularProgressIndicator(strokeWidth: 2),
CircularProgressIndicator(strokeWidth: 2),
), ),
), ),
) )
@ -160,9 +159,8 @@ class _RoutineViewCardState extends State<RoutineViewCard> {
height: iconSize, height: iconSize,
width: iconSize, width: iconSize,
fit: BoxFit.contain, fit: BoxFit.contain,
errorBuilder: errorBuilder: (context, error, stackTrace) =>
(context, error, stackTrace) => Image.asset(
Image.asset(
Assets.logo, Assets.logo,
height: iconSize, height: iconSize,
width: iconSize, width: iconSize,
@ -205,8 +203,7 @@ class _RoutineViewCardState extends State<RoutineViewCard> {
maxLines: 1, maxLines: 1,
style: context.textTheme.bodySmall?.copyWith( style: context.textTheme.bodySmall?.copyWith(
color: ColorsManager.blackColor, color: ColorsManager.blackColor,
fontSize: fontSize: widget.isSmallScreenSize(context) ? 10 : 12,
widget.isSmallScreenSize(context) ? 10 : 12,
), ),
), ),
if (widget.spaceName != '') if (widget.spaceName != '')
@ -225,9 +222,8 @@ class _RoutineViewCardState extends State<RoutineViewCard> {
maxLines: 1, maxLines: 1,
style: context.textTheme.bodySmall?.copyWith( style: context.textTheme.bodySmall?.copyWith(
color: ColorsManager.blackColor, color: ColorsManager.blackColor,
fontSize: widget.isSmallScreenSize(context) fontSize:
? 10 widget.isSmallScreenSize(context) ? 10 : 12,
: 12,
), ),
), ),
], ],

View File

@ -37,9 +37,7 @@ class RoutineDialogSelectionListTile extends StatelessWidget {
trailing: Icon( trailing: Icon(
isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked, isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked,
size: 24, size: 24,
color: isSelected color: isSelected ? ColorsManager.opaquePrimary : ColorsManager.textGray,
? ColorsManager.primaryColorWithOpacity
: ColorsManager.textGray,
), ),
onTap: onTap, onTap: onTap,
); );

View File

@ -65,9 +65,8 @@ class ACHelper {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
DialogHeader(dialogType == 'THEN' DialogHeader(
? 'AC Functions' dialogType == 'THEN' ? 'AC Functions' : 'AC Conditions'),
: 'AC Conditions'),
Expanded( Expanded(
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
@ -78,15 +77,12 @@ class ACHelper {
child: _buildFunctionsList( child: _buildFunctionsList(
context: context, context: context,
acFunctions: acFunctions, acFunctions: acFunctions,
onFunctionSelected: onFunctionSelected: (functionCode, operationName) {
(functionCode, operationName) { RoutineTapFunctionHelper.onTapFunction(context,
RoutineTapFunctionHelper.onTapFunction(
context,
functionCode: functionCode, functionCode: functionCode,
functionOperationName: operationName, functionOperationName: operationName,
functionValueDescription: functionValueDescription:
selectedFunctionData selectedFunctionData.valueDescription,
.valueDescription,
deviceUuid: device?.uuid, deviceUuid: device?.uuid,
codesToAddIntoFunctionsWithDefaultValue: [ codesToAddIntoFunctionsWithDefaultValue: [
'temp_set', 'temp_set',
@ -119,8 +115,7 @@ class ACHelper {
? () { ? () {
final selectedFunctionData = final selectedFunctionData =
state.addedFunctions.firstWhere( state.addedFunctions.firstWhere(
(f) => (f) => f.functionCode == state.selectedFunction,
f.functionCode == state.selectedFunction,
orElse: () => DeviceFunctionData( orElse: () => DeviceFunctionData(
entityId: '', entityId: '',
functionCode: state.selectedFunction ?? '', functionCode: state.selectedFunction ?? '',
@ -214,12 +209,10 @@ class ACHelper {
required String operationName, required String operationName,
bool? removeComparators, bool? removeComparators,
}) { }) {
final selectedFn = final selectedFn = acFunctions.firstWhere((f) => f.code == selectedFunction);
acFunctions.firstWhere((f) => f.code == selectedFunction);
if (selectedFunction == 'temp_set' || selectedFunction == 'temp_current') { if (selectedFunction == 'temp_set' || selectedFunction == 'temp_current') {
final displayValue = final displayValue = (selectedFunctionData?.value ?? selectedFn.min!) / 10;
(selectedFunctionData?.value ?? selectedFn.min!) / 10;
final minValue = selectedFn.min! / 10; final minValue = selectedFn.min! / 10;
final maxValue = selectedFn.max! / 10; final maxValue = selectedFn.max! / 10;
@ -462,13 +455,9 @@ class ACHelper {
style: context.textTheme.bodyMedium, style: context.textTheme.bodyMedium,
), ),
trailing: Icon( trailing: Icon(
isSelected isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked,
? Icons.radio_button_checked
: Icons.radio_button_unchecked,
size: 24, size: 24,
color: isSelected color: isSelected ? ColorsManager.opaquePrimary : ColorsManager.textGray,
? ColorsManager.primaryColorWithOpacity
: ColorsManager.textGray,
), ),
onTap: () { onTap: () {
if (!isSelected) { if (!isSelected) {
@ -480,8 +469,7 @@ class ACHelper {
operationName: operationName, operationName: operationName,
value: value.value, value: value.value,
condition: selectedFunctionData?.condition, condition: selectedFunctionData?.condition,
valueDescription: valueDescription: selectedFunctionData?.valueDescription,
selectedFunctionData?.valueDescription,
), ),
), ),
); );

View File

@ -71,10 +71,8 @@ class CurtainHelper {
child: _buildFunctionsList( child: _buildFunctionsList(
context: context, context: context,
curtainFunctions: curtainFunctions, curtainFunctions: curtainFunctions,
onFunctionSelected: onFunctionSelected: (functionCode, operationName) {
(functionCode, operationName) { RoutineTapFunctionHelper.onTapFunction(context,
RoutineTapFunctionHelper.onTapFunction(
context,
functionCode: functionCode, functionCode: functionCode,
functionOperationName: operationName, functionOperationName: operationName,
functionValueDescription: functionValueDescription:
@ -240,13 +238,9 @@ class CurtainHelper {
style: context.textTheme.bodyMedium, style: context.textTheme.bodyMedium,
), ),
trailing: Icon( trailing: Icon(
isSelected isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked,
? Icons.radio_button_checked
: Icons.radio_button_unchecked,
size: 24, size: 24,
color: isSelected color: isSelected ? ColorsManager.opaquePrimary : ColorsManager.textGray,
? ColorsManager.primaryColorWithOpacity
: ColorsManager.textGray,
), ),
onTap: () { onTap: () {
if (!isSelected) { if (!isSelected) {
@ -258,8 +252,7 @@ class CurtainHelper {
operationName: operationName, operationName: operationName,
value: value.value, value: value.value,
condition: selectedFunctionData?.condition, condition: selectedFunctionData?.condition,
valueDescription: valueDescription: selectedFunctionData?.valueDescription,
selectedFunctionData?.valueDescription,
), ),
), ),
); );

View File

@ -89,15 +89,14 @@ class OneGangSwitchHelper {
size: 16, size: 16,
color: ColorsManager.textGray, color: ColorsManager.textGray,
), ),
onTap: () => RoutineTapFunctionHelper onTap: () =>
.onTapFunction( RoutineTapFunctionHelper.onTapFunction(
context, context,
functionCode: function.code, functionCode: function.code,
functionOperationName: functionOperationName:
function.operationName, function.operationName,
functionValueDescription: functionValueDescription:
selectedFunctionData selectedFunctionData.valueDescription,
.valueDescription,
deviceUuid: device?.uuid, deviceUuid: device?.uuid,
codesToAddIntoFunctionsWithDefaultValue: [ codesToAddIntoFunctionsWithDefaultValue: [
'countdown_1', 'countdown_1',
@ -113,12 +112,10 @@ class OneGangSwitchHelper {
child: _buildValueSelector( child: _buildValueSelector(
context: context, context: context,
selectedFunction: selectedFunction, selectedFunction: selectedFunction,
selectedFunctionData: selectedFunctionData: selectedFunctionData,
selectedFunctionData,
acFunctions: oneGangFunctions, acFunctions: oneGangFunctions,
device: device, device: device,
operationName: operationName: selectedOperationName ?? '',
selectedOperationName ?? '',
removeComparetors: removeComparetors, removeComparetors: removeComparetors,
dialogType: dialogType), dialogType: dialogType),
), ),
@ -318,13 +315,9 @@ class OneGangSwitchHelper {
style: context.textTheme.bodyMedium, style: context.textTheme.bodyMedium,
), ),
trailing: Icon( trailing: Icon(
isSelected isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked,
? Icons.radio_button_checked
: Icons.radio_button_unchecked,
size: 24, size: 24,
color: isSelected color: isSelected ? ColorsManager.opaquePrimary : ColorsManager.textGray,
? ColorsManager.primaryColorWithOpacity
: ColorsManager.textGray,
), ),
onTap: () { onTap: () {
if (!isSelected) { if (!isSelected) {
@ -336,8 +329,7 @@ class OneGangSwitchHelper {
operationName: operationName, operationName: operationName,
value: value.value, value: value.value,
condition: selectedFunctionData?.condition, condition: selectedFunctionData?.condition,
valueDescription: valueDescription: selectedFunctionData?.valueDescription,
selectedFunctionData?.valueDescription,
), ),
), ),
); );

View File

@ -1,3 +1,4 @@
import 'package:flutter/cupertino.dart';
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/routines/bloc/effective_period/effect_period_bloc.dart'; import 'package:syncrow_web/pages/routines/bloc/effective_period/effect_period_bloc.dart';
@ -13,7 +14,6 @@ import 'package:syncrow_web/pages/routines/view/effective_period_view.dart';
import 'package:syncrow_web/pages/routines/widgets/delete_scene.dart'; import 'package:syncrow_web/pages/routines/widgets/delete_scene.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
import 'package:flutter/cupertino.dart';
class SettingHelper { class SettingHelper {
static Future<String?> showSettingDialog({ static Future<String?> showSettingDialog({
@ -30,14 +30,16 @@ class SettingHelper {
providers: [ providers: [
if (effectiveTime != null) if (effectiveTime != null)
BlocProvider( BlocProvider(
create: (_) => EffectPeriodBloc()..add(InitialEffectPeriodEvent(effectiveTime)), create: (_) =>
EffectPeriodBloc()..add(InitialEffectPeriodEvent(effectiveTime)),
), ),
if (effectiveTime == null) if (effectiveTime == null)
BlocProvider( BlocProvider(
create: (_) => EffectPeriodBloc(), create: (_) => EffectPeriodBloc(),
), ),
BlocProvider( BlocProvider(
create: (_) => SettingBloc()..add(InitialEvent(selectedIcon: iconId ?? ''))), create: (_) =>
SettingBloc()..add(InitialEvent(selectedIcon: iconId ?? ''))),
], ],
child: AlertDialog( child: AlertDialog(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
@ -53,7 +55,9 @@ class SettingHelper {
} }
return Container( return Container(
width: context.read<SettingBloc>().isExpanded ? 800 : 400, width: context.read<SettingBloc>().isExpanded ? 800 : 400,
height: context.read<SettingBloc>().isExpanded && isAutomation ? 500 : 350, height: context.read<SettingBloc>().isExpanded && isAutomation
? 500
: 350,
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
@ -76,14 +80,18 @@ class SettingHelper {
children: [ children: [
Container( Container(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
top: 10, left: 10, right: 10, bottom: 10), top: 10,
left: 10,
right: 10,
bottom: 10),
child: Column( child: Column(
children: [ children: [
InkWell( InkWell(
onTap: () {}, onTap: () {},
child: Row( child: Row(
mainAxisAlignment: mainAxisAlignment:
MainAxisAlignment.spaceBetween, MainAxisAlignment
.spaceBetween,
children: [ children: [
Text( Text(
'Validity', 'Validity',
@ -91,14 +99,17 @@ class SettingHelper {
.textTheme .textTheme
.bodyMedium! .bodyMedium!
.copyWith( .copyWith(
color: color: ColorsManager
ColorsManager.textPrimaryColor, .textPrimaryColor,
fontWeight: FontWeight.w400, fontWeight:
FontWeight.w400,
fontSize: 14), fontSize: 14),
), ),
const Icon( const Icon(
Icons.arrow_forward_ios_outlined, Icons
color: ColorsManager.textGray, .arrow_forward_ios_outlined,
color:
ColorsManager.textGray,
size: 15, size: 15,
) )
], ],
@ -115,15 +126,17 @@ class SettingHelper {
), ),
InkWell( InkWell(
onTap: () { onTap: () {
BlocProvider.of<SettingBloc>(context).add( BlocProvider.of<SettingBloc>(
FetchIcons( context)
.add(FetchIcons(
expanded: !context expanded: !context
.read<SettingBloc>() .read<SettingBloc>()
.isExpanded)); .isExpanded));
}, },
child: Row( child: Row(
mainAxisAlignment: mainAxisAlignment:
MainAxisAlignment.spaceBetween, MainAxisAlignment
.spaceBetween,
children: [ children: [
Text( Text(
'Effective Period', 'Effective Period',
@ -131,14 +144,17 @@ class SettingHelper {
.textTheme .textTheme
.bodyMedium! .bodyMedium!
.copyWith( .copyWith(
color: color: ColorsManager
ColorsManager.textPrimaryColor, .textPrimaryColor,
fontWeight: FontWeight.w400, fontWeight:
FontWeight.w400,
fontSize: 14), fontSize: 14),
), ),
const Icon( const Icon(
Icons.arrow_forward_ios_outlined, Icons
color: ColorsManager.textGray, .arrow_forward_ios_outlined,
color:
ColorsManager.textGray,
size: 15, size: 15,
) )
], ],
@ -154,7 +170,8 @@ class SettingHelper {
height: 5, height: 5,
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'Executed by', 'Executed by',
@ -162,8 +179,10 @@ class SettingHelper {
.textTheme .textTheme
.bodyMedium! .bodyMedium!
.copyWith( .copyWith(
color: ColorsManager.textPrimaryColor, color: ColorsManager
fontWeight: FontWeight.w400, .textPrimaryColor,
fontWeight:
FontWeight.w400,
fontSize: 14), fontSize: 14),
), ),
Text('Cloud', Text('Cloud',
@ -171,12 +190,17 @@ class SettingHelper {
.textTheme .textTheme
.bodyMedium! .bodyMedium!
.copyWith( .copyWith(
color: ColorsManager.textGray, color: ColorsManager
fontWeight: FontWeight.w400, .textGray,
fontWeight:
FontWeight.w400,
fontSize: 14)), fontSize: 14)),
], ],
), ),
if (context.read<RoutineBloc>().state.isUpdate ?? if (context
.read<RoutineBloc>()
.state
.isUpdate ??
false) false)
const DeleteSceneWidget() const DeleteSceneWidget()
], ],
@ -188,20 +212,25 @@ class SettingHelper {
children: [ children: [
Container( Container(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
top: 10, left: 10, right: 10, bottom: 10), top: 10,
left: 10,
right: 10,
bottom: 10),
child: Column( child: Column(
children: [ children: [
InkWell( InkWell(
onTap: () { onTap: () {
BlocProvider.of<SettingBloc>(context).add( BlocProvider.of<SettingBloc>(
FetchIcons( context)
.add(FetchIcons(
expanded: !context expanded: !context
.read<SettingBloc>() .read<SettingBloc>()
.isExpanded)); .isExpanded));
}, },
child: Row( child: Row(
mainAxisAlignment: mainAxisAlignment:
MainAxisAlignment.spaceBetween, MainAxisAlignment
.spaceBetween,
children: [ children: [
Text( Text(
'Icons', 'Icons',
@ -209,14 +238,17 @@ class SettingHelper {
.textTheme .textTheme
.bodyMedium! .bodyMedium!
.copyWith( .copyWith(
color: color: ColorsManager
ColorsManager.textPrimaryColor, .textPrimaryColor,
fontWeight: FontWeight.w400, fontWeight:
FontWeight.w400,
fontSize: 14), fontSize: 14),
), ),
const Icon( const Icon(
Icons.arrow_forward_ios_outlined, Icons
color: ColorsManager.textGray, .arrow_forward_ios_outlined,
color:
ColorsManager.textGray,
size: 15, size: 15,
) )
], ],
@ -232,7 +264,8 @@ class SettingHelper {
height: 5, height: 5,
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'Show on devices page', 'Show on devices page',
@ -240,17 +273,21 @@ class SettingHelper {
.textTheme .textTheme
.bodyMedium! .bodyMedium!
.copyWith( .copyWith(
color: ColorsManager.textPrimaryColor, color: ColorsManager
fontWeight: FontWeight.w400, .textPrimaryColor,
fontWeight:
FontWeight.w400,
fontSize: 14), fontSize: 14),
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment:
MainAxisAlignment.end,
children: [ children: [
Container( Container(
height: 30, height: 30,
width: 1, width: 1,
color: ColorsManager.graysColor, color: ColorsManager
.graysColor,
), ),
Transform.scale( Transform.scale(
scale: .8, scale: .8,
@ -274,7 +311,8 @@ class SettingHelper {
height: 5, height: 5,
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'Executed by', 'Executed by',
@ -282,8 +320,10 @@ class SettingHelper {
.textTheme .textTheme
.bodyMedium! .bodyMedium!
.copyWith( .copyWith(
color: ColorsManager.textPrimaryColor, color: ColorsManager
fontWeight: FontWeight.w400, .textPrimaryColor,
fontWeight:
FontWeight.w400,
fontSize: 14), fontSize: 14),
), ),
Text('Cloud', Text('Cloud',
@ -291,12 +331,17 @@ class SettingHelper {
.textTheme .textTheme
.bodyMedium! .bodyMedium!
.copyWith( .copyWith(
color: ColorsManager.textGray, color: ColorsManager
fontWeight: FontWeight.w400, .textGray,
fontWeight:
FontWeight.w400,
fontSize: 14)), fontSize: 14)),
], ],
), ),
if (context.read<RoutineBloc>().state.isUpdate ?? if (context
.read<RoutineBloc>()
.state
.isUpdate ??
false) false)
const DeleteSceneWidget() const DeleteSceneWidget()
], ],
@ -304,12 +349,14 @@ class SettingHelper {
], ],
), ),
), ),
if (context.read<SettingBloc>().isExpanded && !isAutomation) if (context.read<SettingBloc>().isExpanded &&
!isAutomation)
SizedBox( SizedBox(
width: 400, width: 400,
height: 150, height: 150,
child: settingState is LoadingState child: settingState is LoadingState
? const Center(child: CircularProgressIndicator()) ? const Center(
child: CircularProgressIndicator())
: GridView.builder( : GridView.builder(
gridDelegate: gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount( const SliverGridDelegateWithFixedCrossAxisCount(
@ -326,7 +373,8 @@ class SettingHelper {
height: 35, height: 35,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
BlocProvider.of<SettingBloc>(context) BlocProvider.of<SettingBloc>(
context)
.add(SelectIcon( .add(SelectIcon(
iconId: iconModel.uuid, iconId: iconModel.uuid,
)); ));
@ -335,12 +383,14 @@ class SettingHelper {
child: SizedBox( child: SizedBox(
child: ClipOval( child: ClipOval(
child: Container( child: Container(
padding: const EdgeInsets.all(1), padding:
const EdgeInsets.all(1),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all( border: Border.all(
color: selectedIcon == iconModel.uuid color: selectedIcon ==
iconModel.uuid
? ColorsManager ? ColorsManager
.primaryColorWithOpacity .opaquePrimary
: Colors.transparent, : Colors.transparent,
width: 2, width: 2,
), ),
@ -356,8 +406,12 @@ class SettingHelper {
); );
}, },
)), )),
if (context.read<SettingBloc>().isExpanded && isAutomation) if (context.read<SettingBloc>().isExpanded &&
const SizedBox(height: 350, width: 400, child: EffectivePeriodView()) isAutomation)
const SizedBox(
height: 350,
width: 400,
child: EffectivePeriodView())
], ],
), ),
Container( Container(
@ -381,23 +435,31 @@ class SettingHelper {
alignment: AlignmentDirectional.center, alignment: AlignmentDirectional.center,
child: Text( child: Text(
'Cancel', 'Cancel',
style: Theme.of(context).textTheme.bodyMedium!.copyWith( style: Theme.of(context)
.textTheme
.bodyMedium!
.copyWith(
color: ColorsManager.textGray, color: ColorsManager.textGray,
), ),
), ),
), ),
), ),
), ),
Container(width: 1, height: 50, color: ColorsManager.greyColor), Container(
width: 1,
height: 50,
color: ColorsManager.greyColor),
Expanded( Expanded(
child: InkWell( child: InkWell(
onTap: () { onTap: () {
if (isAutomation) { if (isAutomation) {
BlocProvider.of<RoutineBloc>(context).add( BlocProvider.of<RoutineBloc>(context).add(
EffectiveTimePeriodEvent(EffectiveTime( EffectiveTimePeriodEvent(EffectiveTime(
start: effectPeriodState.customStartTime!, start:
effectPeriodState.customStartTime!,
end: effectPeriodState.customEndTime!, end: effectPeriodState.customEndTime!,
loops: effectPeriodState.selectedDaysBinary))); loops: effectPeriodState
.selectedDaysBinary)));
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
Navigator.of(context).pop(selectedIcon); Navigator.of(context).pop(selectedIcon);
@ -407,8 +469,11 @@ class SettingHelper {
alignment: AlignmentDirectional.center, alignment: AlignmentDirectional.center,
child: Text( child: Text(
'Confirm', 'Confirm',
style: Theme.of(context).textTheme.bodyMedium!.copyWith( style: Theme.of(context)
color: ColorsManager.primaryColorWithOpacity, .textTheme
.bodyMedium!
.copyWith(
color: ColorsManager.opaquePrimary,
), ),
), ),
), ),

View File

@ -88,19 +88,17 @@ class ThreeGangSwitchHelper {
size: 16, size: 16,
color: ColorsManager.textGray, color: ColorsManager.textGray,
), ),
onTap: () => RoutineTapFunctionHelper onTap: () =>
.onTapFunction( RoutineTapFunctionHelper.onTapFunction(
context, context,
functionCode: function.code, functionCode: function.code,
functionOperationName: functionOperationName:
function.operationName, function.operationName,
functionValueDescription: functionValueDescription:
selectedFunctionData selectedFunctionData.valueDescription,
.valueDescription,
deviceUuid: device?.uuid, deviceUuid: device?.uuid,
codesToAddIntoFunctionsWithDefaultValue: codesToAddIntoFunctionsWithDefaultValue:
function.code function.code.startsWith('countdown')
.startsWith('countdown')
? [function.code] ? [function.code]
: [], : [],
), ),
@ -114,12 +112,10 @@ class ThreeGangSwitchHelper {
child: _buildValueSelector( child: _buildValueSelector(
context: context, context: context,
selectedFunction: selectedFunction, selectedFunction: selectedFunction,
selectedFunctionData: selectedFunctionData: selectedFunctionData,
selectedFunctionData,
switchFunctions: switchFunctions, switchFunctions: switchFunctions,
device: device, device: device,
operationName: operationName: selectedOperationName ?? '',
selectedOperationName ?? '',
removeComparetors: removeComparetors, removeComparetors: removeComparetors,
dialogType: dialogType), dialogType: dialogType),
), ),
@ -188,8 +184,7 @@ class ThreeGangSwitchHelper {
dialogType: dialogType); dialogType: dialogType);
} }
final selectedFn = final selectedFn = switchFunctions.firstWhere((f) => f.code == selectedFunction);
switchFunctions.firstWhere((f) => f.code == selectedFunction);
final values = selectedFn.getOperationalValues(); final values = selectedFn.getOperationalValues();
return _buildOperationalValuesList( return _buildOperationalValuesList(
@ -307,13 +302,9 @@ class ThreeGangSwitchHelper {
style: context.textTheme.bodyMedium, style: context.textTheme.bodyMedium,
), ),
trailing: Icon( trailing: Icon(
isSelected isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked,
? Icons.radio_button_checked
: Icons.radio_button_unchecked,
size: 24, size: 24,
color: isSelected color: isSelected ? ColorsManager.opaquePrimary : ColorsManager.textGray,
? ColorsManager.primaryColorWithOpacity
: ColorsManager.textGray,
), ),
onTap: () { onTap: () {
if (!isSelected) { if (!isSelected) {
@ -325,8 +316,7 @@ class ThreeGangSwitchHelper {
operationName: operationName, operationName: operationName,
value: value.value, value: value.value,
condition: selectedFunctionData?.condition, condition: selectedFunctionData?.condition,
valueDescription: valueDescription: selectedFunctionData?.valueDescription,
selectedFunctionData?.valueDescription,
), ),
), ),
); );

View File

@ -89,15 +89,14 @@ class TwoGangSwitchHelper {
size: 16, size: 16,
color: ColorsManager.textGray, color: ColorsManager.textGray,
), ),
onTap: () => RoutineTapFunctionHelper onTap: () =>
.onTapFunction( RoutineTapFunctionHelper.onTapFunction(
context, context,
functionCode: function.code, functionCode: function.code,
functionOperationName: functionOperationName:
function.operationName, function.operationName,
functionValueDescription: functionValueDescription:
selectedFunctionData selectedFunctionData.valueDescription,
.valueDescription,
deviceUuid: device?.uuid, deviceUuid: device?.uuid,
codesToAddIntoFunctionsWithDefaultValue: [ codesToAddIntoFunctionsWithDefaultValue: [
'countdown_1', 'countdown_1',
@ -147,13 +146,10 @@ class TwoGangSwitchHelper {
// } // }
final selectedFunctionData = final selectedFunctionData =
state.addedFunctions.firstWhere( state.addedFunctions.firstWhere(
(f) => (f) => f.functionCode == state.selectedFunction,
f.functionCode ==
state.selectedFunction,
orElse: () => DeviceFunctionData( orElse: () => DeviceFunctionData(
entityId: '', entityId: '',
functionCode: functionCode: state.selectedFunction ?? '',
state.selectedFunction ?? '',
operationName: '', operationName: '',
value: null, value: null,
), ),
@ -192,8 +188,7 @@ class TwoGangSwitchHelper {
required bool removeComparetors, required bool removeComparetors,
required String dialogType, required String dialogType,
}) { }) {
if (selectedFunction == 'countdown_1' || if (selectedFunction == 'countdown_1' || selectedFunction == 'countdown_2') {
selectedFunction == 'countdown_2') {
final initialValue = selectedFunctionData?.value ?? 0; final initialValue = selectedFunctionData?.value ?? 0;
return _buildTemperatureSelector( return _buildTemperatureSelector(
context: context, context: context,
@ -207,8 +202,7 @@ class TwoGangSwitchHelper {
dialogType: dialogType); dialogType: dialogType);
} }
final selectedFn = final selectedFn = switchFunctions.firstWhere((f) => f.code == selectedFunction);
switchFunctions.firstWhere((f) => f.code == selectedFunction);
final values = selectedFn.getOperationalValues(); final values = selectedFn.getOperationalValues();
return _buildOperationalValuesList( return _buildOperationalValuesList(
@ -270,16 +264,15 @@ class TwoGangSwitchHelper {
); );
}, },
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const BorderRadius.all(Radius.circular(8)),
selectedBorderColor: ColorsManager.primaryColorWithOpacity, selectedBorderColor: ColorsManager.opaquePrimary,
selectedColor: Colors.white, selectedColor: Colors.white,
fillColor: ColorsManager.primaryColorWithOpacity, fillColor: ColorsManager.opaquePrimary,
color: ColorsManager.primaryColorWithOpacity, color: ColorsManager.opaquePrimary,
constraints: const BoxConstraints( constraints: const BoxConstraints(
minHeight: 40.0, minHeight: 40.0,
minWidth: 40.0, minWidth: 40.0,
), ),
isSelected: isSelected: conditions.map((c) => c == (currentCondition ?? "==")).toList(),
conditions.map((c) => c == (currentCondition ?? "==")).toList(),
children: conditions.map((c) => Text(c)).toList(), children: conditions.map((c) => Text(c)).toList(),
); );
} }
@ -295,13 +288,13 @@ class TwoGangSwitchHelper {
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.primaryColorWithOpacity.withOpacity(0.1), color: ColorsManager.opaquePrimary.withOpacity(0.1),
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
), ),
child: Text( child: Text(
DurationFormatMixin.formatDuration(initialValue?.toInt() ?? 0), DurationFormatMixin.formatDuration(initialValue?.toInt() ?? 0),
style: context.textTheme.headlineMedium!.copyWith( style: context.textTheme.headlineMedium!.copyWith(
color: ColorsManager.primaryColorWithOpacity, color: ColorsManager.opaquePrimary,
), ),
), ),
); );
@ -338,8 +331,7 @@ class TwoGangSwitchHelper {
); );
}, },
onTextChanged: (value) { onTextChanged: (value) {
final roundedValue = final roundedValue = value.round(); // Round to nearest integer (stepSize 1)
value.round(); // Round to nearest integer (stepSize 1)
context.read<FunctionBloc>().add( context.read<FunctionBloc>().add(
AddFunction( AddFunction(
functionData: DeviceFunctionData( functionData: DeviceFunctionData(
@ -391,13 +383,9 @@ class TwoGangSwitchHelper {
style: context.textTheme.bodyMedium, style: context.textTheme.bodyMedium,
), ),
trailing: Icon( trailing: Icon(
isSelected isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked,
? Icons.radio_button_checked
: Icons.radio_button_unchecked,
size: 24, size: 24,
color: isSelected color: isSelected ? ColorsManager.opaquePrimary : ColorsManager.textGray,
? ColorsManager.primaryColorWithOpacity
: ColorsManager.textGray,
), ),
onTap: () { onTap: () {
if (!isSelected) { if (!isSelected) {
@ -409,8 +397,7 @@ class TwoGangSwitchHelper {
operationName: operationName, operationName: operationName,
value: value.value, value: value.value,
condition: selectedFunctionData?.condition, condition: selectedFunctionData?.condition,
valueDescription: valueDescription: selectedFunctionData?.valueDescription,
selectedFunctionData?.valueDescription,
), ),
), ),
); );

View File

@ -61,8 +61,9 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
children: [ children: [
ConstrainedBox( ConstrainedBox(
constraints: BoxConstraints( constraints: BoxConstraints(
maxWidth: maxWidth: constraints.maxWidth > 700
constraints.maxWidth > 700 ? 450 : constraints.maxWidth - 32), ? 450
: constraints.maxWidth - 32),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -71,7 +72,9 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
children: [ children: [
Text('* ', Text('* ',
style: context.textTheme.bodyMedium! style: context.textTheme.bodyMedium!
.copyWith(color: ColorsManager.red, fontSize: 13)), .copyWith(
color: ColorsManager.red,
fontSize: 13)),
Text( Text(
'Routine Name', 'Routine Name',
style: context.textTheme.bodyMedium!.copyWith( style: context.textTheme.bodyMedium!.copyWith(
@ -93,9 +96,11 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
decoration: InputDecoration( decoration: InputDecoration(
hintText: 'Please enter the name', hintText: 'Please enter the name',
hintStyle: context.textTheme.bodyMedium! hintStyle: context.textTheme.bodyMedium!
.copyWith(fontSize: 12, color: ColorsManager.grayColor), .copyWith(
contentPadding: fontSize: 12,
const EdgeInsets.symmetric(horizontal: 12, vertical: 10), color: ColorsManager.grayColor),
contentPadding: const EdgeInsets.symmetric(
horizontal: 12, vertical: 10),
border: InputBorder.none, border: InputBorder.none,
), ),
onTapOutside: (_) { onTapOutside: (_) {
@ -121,9 +126,11 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
width: 200, width: 200,
child: Center( child: Center(
child: DefaultButton( child: DefaultButton(
onPressed: state.isAutomation || state.isTabToRun onPressed: state.isAutomation ||
state.isTabToRun
? () async { ? () async {
final result = await SettingHelper.showSettingDialog( final result = await SettingHelper
.showSettingDialog(
context: context, context: context,
iconId: state.selectedIcon ?? '', iconId: state.selectedIcon ?? '',
); );
@ -186,10 +193,12 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
child: Center( child: Center(
child: DefaultButton( child: DefaultButton(
onPressed: () async { onPressed: () async {
if (state.routineName == null || state.routineName!.isEmpty) { if (state.routineName == null ||
state.routineName!.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: const Text('Please enter the routine name'), content: const Text(
'Please enter the routine name'),
duration: const Duration(seconds: 2), duration: const Duration(seconds: 2),
backgroundColor: ColorsManager.red, backgroundColor: ColorsManager.red,
action: SnackBarAction( action: SnackBarAction(
@ -203,10 +212,12 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
return; return;
} }
if (state.ifItems.isEmpty || state.thenItems.isEmpty) { if (state.ifItems.isEmpty ||
state.thenItems.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: const Text('Please add if and then condition'), content: const Text(
'Please add if and then condition'),
duration: const Duration(seconds: 2), duration: const Duration(seconds: 2),
backgroundColor: ColorsManager.red, backgroundColor: ColorsManager.red,
action: SnackBarAction( action: SnackBarAction(
@ -221,7 +232,8 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
} }
// final result = // final result =
// await // await
BlocProvider.of<RoutineBloc>(context).add(ResetErrorMessage()); BlocProvider.of<RoutineBloc>(context)
.add(ResetErrorMessage());
SaveRoutineHelper.showSaveRoutineDialog(context); SaveRoutineHelper.showSaveRoutineDialog(context);
// if (result != null && result) { // if (result != null && result) {
// BlocProvider.of<RoutineBloc>(context).add( // BlocProvider.of<RoutineBloc>(context).add(
@ -240,7 +252,7 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
color: ColorsManager.whiteColors, color: ColorsManager.white,
), ),
), ),
), ),
@ -261,10 +273,14 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
child: DefaultButton( child: DefaultButton(
onPressed: state.isAutomation || state.isTabToRun onPressed: state.isAutomation || state.isTabToRun
? () async { ? () async {
final result = await SettingHelper.showSettingDialog( final result =
context: context, iconId: state.selectedIcon ?? ''); await SettingHelper.showSettingDialog(
context: context,
iconId: state.selectedIcon ?? '');
if (result != null) { if (result != null) {
context.read<RoutineBloc>().add(AddSelectedIcon(result)); context
.read<RoutineBloc>()
.add(AddSelectedIcon(result));
} }
} }
: null, : null,
@ -314,10 +330,12 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
child: Center( child: Center(
child: DefaultButton( child: DefaultButton(
onPressed: () async { onPressed: () async {
if (state.routineName == null || state.routineName!.isEmpty) { if (state.routineName == null ||
state.routineName!.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: const Text('Please enter the routine name'), content:
const Text('Please enter the routine name'),
duration: const Duration(seconds: 2), duration: const Duration(seconds: 2),
backgroundColor: ColorsManager.red, backgroundColor: ColorsManager.red,
action: SnackBarAction( action: SnackBarAction(
@ -334,7 +352,8 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
if (state.ifItems.isEmpty || state.thenItems.isEmpty) { if (state.ifItems.isEmpty || state.thenItems.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: const Text('Please add if and then condition'), content: const Text(
'Please add if and then condition'),
duration: const Duration(seconds: 2), duration: const Duration(seconds: 2),
backgroundColor: ColorsManager.red, backgroundColor: ColorsManager.red,
action: SnackBarAction( action: SnackBarAction(
@ -349,7 +368,8 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
} }
// final result = // final result =
// await // await
BlocProvider.of<RoutineBloc>(context).add(ResetErrorMessage()); BlocProvider.of<RoutineBloc>(context)
.add(ResetErrorMessage());
SaveRoutineHelper.showSaveRoutineDialog(context); SaveRoutineHelper.showSaveRoutineDialog(context);
// if (result != null && result) { // if (result != null && result) {
// BlocProvider.of<RoutineBloc>(context).add( // BlocProvider.of<RoutineBloc>(context).add(
@ -368,7 +388,7 @@ class _RoutineSearchAndButtonsState extends State<RoutineSearchAndButtons> {
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
color: ColorsManager.whiteColors, color: ColorsManager.white,
), ),
), ),
), ),

View File

@ -19,13 +19,13 @@ class ValueDisplay extends StatelessWidget {
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.primaryColorWithOpacity.withOpacity(0.1), color: ColorsManager.opaquePrimary.withOpacity(0.1),
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
), ),
child: Text( child: Text(
'$label $unit ', '$label $unit ',
style: context.textTheme.headlineMedium!.copyWith( style: context.textTheme.headlineMedium!.copyWith(
color: ColorsManager.primaryColorWithOpacity, color: ColorsManager.opaquePrimary,
), ),
), ),
); );

View File

@ -68,4 +68,20 @@ abstract final class SpacesRecursiveHelper {
return space; return space;
}).toList(); }).toList();
} }
static SpaceModel? findParent(
List<SpaceModel> spaces,
String targetUuid,
) {
for (final space in spaces) {
if (space.children.any((child) => child.uuid == targetUuid)) {
return space;
}
final parent = findParent(space.children, targetUuid);
if (parent != null) {
return parent;
}
}
return null;
}
} }

View File

@ -1,12 +1,29 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/community_model.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/community_model.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/presentation/bloc/communities_bloc.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/presentation/communities_tree_selection_bloc/communities_tree_selection_bloc.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/create_community/presentation/create_community_dialog.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/create_community/presentation/create_community_dialog.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/update_community/presentation/edit_community_dialog.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/update_community/presentation/edit_community_dialog.dart';
import 'package:syncrow_web/utils/extension/app_snack_bar.dart';
abstract final class SpaceManagementCommunityDialogHelper { abstract final class SpaceManagementCommunityDialogHelper {
static void showCreateDialog(BuildContext context) => showDialog<void>( static void showCreateDialog(BuildContext context) => showDialog<void>(
context: context, context: context,
builder: (_) => const CreateCommunityDialog(), builder: (_) => CreateCommunityDialog(
onSuccess: (community) {
context.showSuccessSnackbar(
'${community.name} community created successfully',
);
context.read<CommunitiesBloc>().add(
InsertCommunity(community),
);
context.read<CommunitiesTreeSelectionBloc>().add(
SelectCommunityEvent(community: community),
);
},
),
); );
static void showEditDialog( static void showEditDialog(

View File

@ -50,7 +50,7 @@ class _CommunityDialogState extends State<CommunityDialog> {
width: MediaQuery.of(context).size.width * 0.3, width: MediaQuery.of(context).size.width * 0.3,
padding: const EdgeInsets.all(20), padding: const EdgeInsets.all(20),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
@ -110,7 +110,7 @@ class _CommunityDialogState extends State<CommunityDialog> {
} }
}, },
borderRadius: 10, borderRadius: 10,
foregroundColor: ColorsManager.whiteColors, foregroundColor: ColorsManager.white,
child: const Text('OK'), child: const Text('OK'),
), ),
); );

View File

@ -17,7 +17,7 @@ class CommunityStructureHeader extends StatelessWidget {
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 16.0), padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 16.0),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.whiteColors, color: ColorsManager.white,
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: ColorsManager.shadowBlackColor.withValues(alpha: 0.1), color: ColorsManager.shadowBlackColor.withValues(alpha: 0.1),

View File

@ -49,8 +49,8 @@ class CommunityStructureHeaderActionButtonsComposer extends StatelessWidget {
context: context, context: context,
builder: (_) => DuplicateSpaceDialog( builder: (_) => DuplicateSpaceDialog(
initialName: space.spaceName, initialName: space.spaceName,
selectedSpaceUuid: space.uuid, selectedSpace: space,
selectedCommunityUuid: selectedCommunity.uuid, selectedCommunity: selectedCommunity,
onSuccess: (spaces) { onSuccess: (spaces) {
final updatedCommunity = selectedCommunity.copyWith( final updatedCommunity = selectedCommunity.copyWith(
spaces: spaces, spaces: spaces,

Some files were not shown because too many files have changed in this diff Show More