Compare commits

..
Author SHA1 Message Date
Faris Armoush d10df2ffb8 SP-1723-FE-Integrate-Charts-with-API-s-for-AQI-sensor 2025-06-16 11:17:33 +03:00
raf-dev1 5b3152e833 SP-1673-fe-validation-red-borders-not-displayed-correctly-on-create-visitor-password-modal (#251)
<!--
  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-1673](https://syncrow.atlassian.net/browse/SP-1673?atlOrigin=eyJpIjoiZmU3YTRmMjQ3MDk4NDM0Y2I0MTVmOTA0Yjc1ZWE2NTEiLCJwIjoiamlyYS1zbGFjay1pbnQifQ)

## Description
fix the bug when validator activated textfield height get confused

## 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-1673]:
https://syncrow.atlassian.net/browse/SP-1673?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
2025-06-16 08:46:52 +03:00
raf-dev1 c1d3296b59 SP-1613-fe-remove-the-word-condition-from-the-task-dialog-in-the-routine (#253)
<!--
  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-1613](https://syncrow.atlassian.net/browse/SP-1613)

## Description

use word condition when going to if and functions when going to THEN

## 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-1613]:
https://syncrow.atlassian.net/browse/SP-1613?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
2025-06-16 08:46:07 +03:00
raf-dev1 b3069ab749 Sp 1661 fe enhance the landing page to be responsive and look like design (#252)
<!--
  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-1661](https://syncrow.atlassian.net/browse/SP-1661)

## Description

insure the colors of cards and font size with responsive 
make 4 cards in row as in figma
## 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-1661]:
https://syncrow.atlassian.net/browse/SP-1661?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
2025-06-16 08:42:38 +03:00
raf-dev1 13360fe6f3 when use THEN dialog type Funtions is the word but hen if it should be condition 2025-06-13 16:10:24 +03:00
raf-dev1 3e5b501167 Merge branch 'dev' into SP-1661-FE-Enhance-the-landing-page-to-be-responsive-and-look-like-design 2025-06-13 14:52:51 +03:00
raf-dev1 4d9f08af31 make the font size big s possible as can depending on responsive UI 2025-06-13 14:48:37 +03:00
raf-dev1 28aa3bc406 make 4 elements in a row using crossAxisCount 2025-06-13 14:48:09 +03:00
raf-dev1 51ad74b2be fix the bug 2025-06-13 14:15:23 +03:00
18 changed files with 97 additions and 48 deletions
@@ -38,7 +38,7 @@ abstract final class EnergyManagementChartsHelper {
sideTitles: SideTitles(
showTitles: true,
maxIncluded: false,
minIncluded: true,
minIncluded: false,
interval: leftTitlesInterval,
reservedSize: 110,
getTitlesWidget: (value, meta) => Padding(
@@ -78,7 +78,7 @@ class CustomWebTextField extends StatelessWidget {
controller: controller,
style: const TextStyle(color: Colors.black),
decoration: textBoxDecoration()!.copyWith(
errorStyle: const TextStyle(height: 0),
errorStyle: const TextStyle(height: 0.01),
hintStyle: context.textTheme.titleSmall!
.copyWith(color: Colors.grey, fontSize: 12),
hintText: hintText ?? 'Please enter'),
@@ -1,10 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/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/models/devices_model.dart';
import 'package:syncrow_web/pages/device_managment/device_setting/bloc/setting_bloc_bloc.dart';
import 'package:syncrow_web/pages/device_managment/device_setting/settings_model/device_info_model.dart';
import 'package:syncrow_web/pages/device_managment/device_setting/settings_model/sub_space_model.dart';
import 'package:syncrow_web/pages/device_managment/device_setting/sub_space_dialog.dart';
@@ -69,25 +66,14 @@ class DeviceManagementContent extends StatelessWidget {
Padding(
padding: const EdgeInsets.all(10.0),
child: InkWell(
onTap: () async {
final selectedSubSpace = await showSubSpaceDialog(
onTap: () {
showSubSpaceDialog(
context,
communityUuid: device.community!.uuid!,
spaceUuid: device.spaces!.first.uuid!,
subSpaces: subSpaces,
selected: deviceInfo.subspace.uuid,
selected: device.subspace!.uuid,
);
if (selectedSubSpace != null) {
Future.delayed(const Duration(milliseconds: 500), () {
context.read<SettingDeviceBloc>().add(
SettingBlocAssignRoom(
communityUuid: device.community!.uuid!,
spaceUuid: device.spaces!.first.uuid!,
subSpaceUuid: selectedSubSpace.id ?? '',
),
);
});
}
},
child: infoRow(
label: 'Sub-Space:',
@@ -9,11 +9,13 @@ import 'package:syncrow_web/utils/extension/build_context_x.dart';
class SubSpaceDialog extends StatefulWidget {
final List<SubSpaceModel> subSpaces;
final String? selected;
final void Function(SubSpaceModel?) onConfirmed;
const SubSpaceDialog({
Key? key,
required this.subSpaces,
this.selected,
required this.onConfirmed,
}) : super(key: key);
@override
@@ -84,21 +86,30 @@ class _SubSpaceDialogState extends State<SubSpaceDialog> {
}
}
Future<SubSpaceModel?> showSubSpaceDialog(
void showSubSpaceDialog(
BuildContext context, {
required List<SubSpaceModel> subSpaces,
String? selected,
required String communityUuid,
required String spaceUuid,
}) {
return showDialog<SubSpaceModel>(
showDialog(
context: context,
builder: (ctx) => BlocProvider.value(
value: BlocProvider.of<SettingDeviceBloc>(context),
child: SubSpaceDialog(
subSpaces: subSpaces,
selected: selected,
),
barrierDismissible: true,
builder: (ctx) => SubSpaceDialog(
subSpaces: subSpaces,
selected: selected,
onConfirmed: (selectedModel) {
if (selectedModel != null) {
context.read<SettingDeviceBloc>().add(
SettingBlocAssignRoom(
communityUuid: communityUuid,
spaceUuid: spaceUuid,
subSpaceUuid: selectedModel.id ?? '',
),
);
}
},
),
);
}
@@ -1,4 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/device_managment/device_setting/bloc/setting_bloc_bloc.dart';
import 'package:syncrow_web/pages/device_managment/device_setting/settings_model/sub_space_model.dart';
import 'package:syncrow_web/pages/device_managment/device_setting/sub_space_dialog.dart';
import 'package:syncrow_web/utils/color_manager.dart';
@@ -60,12 +62,11 @@ class SubSpaceDialogButtons extends StatelessWidget {
? null
: () {
final selectedModel = widget.subSpaces.firstWhere(
(space) => space.id == _selectedId,
orElse: () =>
SubSpaceModel(id: null, name: '', devices: []),
);
Navigator.of(context)
.pop(selectedModel);
(space) => space.id == _selectedId,
orElse: () =>
SubSpaceModel(id: null, name: '', devices: []));
widget.onConfirmed(selectedModel);
Navigator.of(context).pop();
},
child: Text(
'Confirm',
@@ -83,3 +84,31 @@ class SubSpaceDialogButtons extends StatelessWidget {
);
}
}
void showSubSpaceDialog(
BuildContext context, {
required List<SubSpaceModel> subSpaces,
String? selected,
required String communityUuid,
required String spaceUuid,
}) {
showDialog(
context: context,
barrierDismissible: true,
builder: (ctx) => SubSpaceDialog(
subSpaces: subSpaces,
selected: selected,
onConfirmed: (selectedModel) {
if (selectedModel != null) {
context.read<SettingDeviceBloc>().add(
SettingBlocAssignRoom(
communityUuid: communityUuid,
spaceUuid: spaceUuid,
subSpaceUuid: selectedModel.id ?? '',
),
);
}
},
),
);
}
+1 -1
View File
@@ -40,7 +40,7 @@ class HomeCard extends StatelessWidget {
child: Text(
name,
style: const TextStyle(
fontSize: 20,
fontSize: 30,
color: Colors.white,
fontWeight: FontWeight.bold,
),
+1 -1
View File
@@ -97,7 +97,7 @@ class _HomeWebPageState extends State<HomeWebPage> {
itemCount: homeBloc.homeItems.length,
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3, // Adjust as needed.
crossAxisCount: 4, // Adjust as needed.
crossAxisSpacing: 20.0,
mainAxisSpacing: 20.0,
childAspectRatio: 1.5,
@@ -118,6 +118,7 @@ class DeviceDialogHelper {
uniqueCustomId: data['uniqueCustomId'],
deviceSelectedFunctions: deviceSelectedFunctions,
device: data['device'],
dialogType: dialogType,
);
case 'NCPS':
return FlushPresenceSensor.showFlushFunctionsDialog(
@@ -65,7 +65,9 @@ class ACHelper {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const DialogHeader('AC Functions'),
DialogHeader(dialogType == 'THEN'
? 'AC Functions'
: 'AC Conditions'),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
@@ -96,7 +96,9 @@ class _WallPresenceSensorState extends State<FlushPresenceSensor> {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const DialogHeader('Presence Sensor Condition'),
DialogHeader(widget.dialogType == 'THEN'
? 'Presence Sensor Functions'
: 'Presence Sensor Condition'),
Expanded(child: _buildMainContent(context, state)),
_buildDialogFooter(context, state),
],
@@ -16,9 +16,10 @@ class GatewayDialog extends StatefulWidget {
required this.functions,
required this.deviceSelectedFunctions,
required this.device,
required this.dialogType,
super.key,
});
final String dialogType;
final String? uniqueCustomId;
final List<DeviceFunction> functions;
final List<DeviceFunctionData> deviceSelectedFunctions;
@@ -55,7 +56,9 @@ class _GatewayDialogState extends State<GatewayDialog> {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const DialogHeader('Gateway Conditions'),
DialogHeader(widget.dialogType == 'THEN'
? 'Gateway Functions'
: 'Gateway Conditions'),
Expanded(child: _buildMainContent(context, state)),
_buildDialogFooter(context, state),
],
@@ -14,6 +14,7 @@ abstract final class GatewayHelper {
required String? uniqueCustomId,
required List<DeviceFunctionData> deviceSelectedFunctions,
required AllDevicesModel? device,
required String dialogType,
}) async {
return showDialog(
context: context,
@@ -27,6 +28,7 @@ abstract final class GatewayHelper {
functions: functions,
deviceSelectedFunctions: deviceSelectedFunctions,
device: device,
dialogType:dialogType,
),
),
);
@@ -59,7 +59,9 @@ class OneGangSwitchHelper {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const DialogHeader('1 Gang Light Switch Condition'),
DialogHeader(dialogType == 'THEN'
? '1 Gang Light Switch Functions'
: '1 Gang Light Switch Condition'),
Expanded(
child: Row(
children: [
@@ -246,9 +248,9 @@ class OneGangSwitchHelper {
withSpecialChar: false,
currentCondition: selectedFunctionData?.condition,
dialogType: dialogType,
sliderRange: (0, 43200),
sliderRange: (0, 43200),
displayedValue: (initialValue ?? 0).toString(),
initialValue: (initialValue ?? 0).toString(),
initialValue: (initialValue ?? 0).toString(),
onConditionChanged: (condition) {
context.read<FunctionBloc>().add(
AddFunction(
@@ -98,7 +98,9 @@ class _EnergyClampDialogState extends State<EnergyClampDialog> {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const DialogHeader('Energy Clamp Conditions'),
DialogHeader(widget.dialogType == 'THEN'
? 'Energy Clamp Functions'
: 'Energy Clamp Conditions'),
Expanded(
child: Visibility(
visible: _functions.isNotEmpty,
@@ -58,7 +58,9 @@ class ThreeGangSwitchHelper {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const DialogHeader('3 Gangs Light Switch Condition'),
DialogHeader(dialogType == 'THEN'
? '3 Gangs Light Switch Functions'
: '3 Gangs Light Switch Condition'),
Expanded(
child: Row(
children: [
@@ -59,7 +59,9 @@ class TwoGangSwitchHelper {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const DialogHeader('2 Gangs Light Switch Condition'),
DialogHeader(dialogType == 'THEN'
? '2 Gangs Light Switch Functions'
: '2 Gangs Light Switch Condition'),
Expanded(
child: Row(
children: [
@@ -63,7 +63,8 @@ class _WallPresenceSensorState extends State<WallPresenceSensor> {
@override
void initState() {
super.initState();
_wpsFunctions = widget.functions.whereType<WpsFunctions>().where((function) {
_wpsFunctions =
widget.functions.whereType<WpsFunctions>().where((function) {
if (widget.dialogType == 'THEN') {
return function.type == 'THEN' || function.type == 'BOTH';
}
@@ -97,7 +98,9 @@ class _WallPresenceSensorState extends State<WallPresenceSensor> {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const DialogHeader('Presence Sensor Condition'),
DialogHeader(widget.dialogType == 'THEN'
? 'Presence Sensor Functions'
: 'Presence Sensor Condition'),
Expanded(child: _buildMainContent(context, state)),
_buildDialogFooter(context, state),
],
@@ -93,7 +93,9 @@ class _WaterHeaterDialogRoutinesState extends State<WaterHeaterDialogRoutines> {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const DialogHeader('Water Heater Condition'),
DialogHeader(widget.dialogType == 'THEN'
? 'Water Heater Funtions'
: 'Water Heater Condition'),
Expanded(child: _buildMainContent(context, state)),
_buildDialogFooter(context, state),
],