mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 15:17:31 +00:00
Dev (#314)
<!-- 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 Release ## 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) - [ ] ❌ Breaking change (fix or feature that would cause existing functionality to change) - [ ] 🧹 Code refactor - [ ] ✅ Build configuration change - [ ] 📝 Documentation - [ ] 🗑️ Chore
This commit is contained in:
@ -46,11 +46,11 @@ class AirQualityDistributionBloc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _onClearAirQualityDistribution(
|
void _onClearAirQualityDistribution(
|
||||||
ClearAirQualityDistribution event,
|
ClearAirQualityDistribution event,
|
||||||
Emitter<AirQualityDistributionState> emit,
|
Emitter<AirQualityDistributionState> emit,
|
||||||
) async {
|
) {
|
||||||
emit(const AirQualityDistributionState());
|
emit(AirQualityDistributionState(selectedAqiType: state.selectedAqiType));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onUpdateAqiTypeEvent(
|
void _onUpdateAqiTypeEvent(
|
||||||
|
@ -75,6 +75,6 @@ class RangeOfAqiBloc extends Bloc<RangeOfAqiEvent, RangeOfAqiState> {
|
|||||||
ClearRangeOfAqiEvent event,
|
ClearRangeOfAqiEvent event,
|
||||||
Emitter<RangeOfAqiState> emit,
|
Emitter<RangeOfAqiState> emit,
|
||||||
) {
|
) {
|
||||||
emit(const RangeOfAqiState());
|
emit(RangeOfAqiState(selectedAqiType: state.selectedAqiType));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@ class AqiDistributionChartTitle extends StatelessWidget {
|
|||||||
alignment: AlignmentDirectional.centerEnd,
|
alignment: AlignmentDirectional.centerEnd,
|
||||||
fit: BoxFit.scaleDown,
|
fit: BoxFit.scaleDown,
|
||||||
child: AqiTypeDropdown(
|
child: AqiTypeDropdown(
|
||||||
|
selectedAqiType: context.watch<AirQualityDistributionBloc>().state.selectedAqiType,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
final bloc = context.read<AirQualityDistributionBloc>();
|
final bloc = context.read<AirQualityDistributionBloc>();
|
||||||
|
@ -18,19 +18,20 @@ enum AqiType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class AqiTypeDropdown extends StatefulWidget {
|
class AqiTypeDropdown extends StatefulWidget {
|
||||||
const AqiTypeDropdown({super.key, required this.onChanged});
|
const AqiTypeDropdown({
|
||||||
|
required this.onChanged,
|
||||||
|
this.selectedAqiType,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
final ValueChanged<AqiType?> onChanged;
|
final ValueChanged<AqiType?> onChanged;
|
||||||
|
final AqiType? selectedAqiType;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<AqiTypeDropdown> createState() => _AqiTypeDropdownState();
|
State<AqiTypeDropdown> createState() => _AqiTypeDropdownState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _AqiTypeDropdownState extends State<AqiTypeDropdown> {
|
class _AqiTypeDropdownState extends State<AqiTypeDropdown> {
|
||||||
AqiType? _selectedItem = AqiType.aqi;
|
|
||||||
|
|
||||||
void _updateSelectedItem(AqiType? item) => setState(() => _selectedItem = item);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Container(
|
||||||
@ -41,8 +42,8 @@ class _AqiTypeDropdownState extends State<AqiTypeDropdown> {
|
|||||||
width: 1,
|
width: 1,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: DropdownButton<AqiType?>(
|
child: DropdownButton<AqiType>(
|
||||||
value: _selectedItem,
|
value: widget.selectedAqiType,
|
||||||
isDense: true,
|
isDense: true,
|
||||||
borderRadius: BorderRadius.circular(16),
|
borderRadius: BorderRadius.circular(16),
|
||||||
dropdownColor: ColorsManager.whiteColors,
|
dropdownColor: ColorsManager.whiteColors,
|
||||||
@ -59,10 +60,7 @@ class _AqiTypeDropdownState extends State<AqiTypeDropdown> {
|
|||||||
items: AqiType.values
|
items: AqiType.values
|
||||||
.map((e) => DropdownMenuItem(value: e, child: Text(e.value)))
|
.map((e) => DropdownMenuItem(value: e, child: Text(e.value)))
|
||||||
.toList(),
|
.toList(),
|
||||||
onChanged: (value) {
|
onChanged: widget.onChanged,
|
||||||
_updateSelectedItem(value);
|
|
||||||
widget.onChanged(value);
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -63,15 +63,15 @@ class RangeOfAqiChartTitle extends StatelessWidget {
|
|||||||
fit: BoxFit.scaleDown,
|
fit: BoxFit.scaleDown,
|
||||||
alignment: AlignmentDirectional.centerEnd,
|
alignment: AlignmentDirectional.centerEnd,
|
||||||
child: AqiTypeDropdown(
|
child: AqiTypeDropdown(
|
||||||
|
selectedAqiType: context.watch<RangeOfAqiBloc>().state.selectedAqiType,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
final spaceTreeState = context.read<SpaceTreeBloc>().state;
|
final spaceTreeState = context.read<SpaceTreeBloc>().state;
|
||||||
final spaceUuid = spaceTreeState.selectedSpaces.firstOrNull;
|
final spaceUuid = spaceTreeState.selectedSpaces.firstOrNull;
|
||||||
|
|
||||||
if (spaceUuid == null) return;
|
|
||||||
|
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
context.read<RangeOfAqiBloc>().add(UpdateAqiTypeEvent(value));
|
context.read<RangeOfAqiBloc>().add(UpdateAqiTypeEvent(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (spaceUuid == null) return;
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -16,11 +16,12 @@ class DeviceManagementBloc
|
|||||||
int _onlineCount = 0;
|
int _onlineCount = 0;
|
||||||
int _offlineCount = 0;
|
int _offlineCount = 0;
|
||||||
int _lowBatteryCount = 0;
|
int _lowBatteryCount = 0;
|
||||||
List<AllDevicesModel> _selectedDevices = [];
|
final List<AllDevicesModel> _selectedDevices = [];
|
||||||
List<AllDevicesModel> _filteredDevices = [];
|
List<AllDevicesModel> _filteredDevices = [];
|
||||||
String currentProductName = '';
|
String currentProductName = '';
|
||||||
String? currentCommunity;
|
String? currentCommunity;
|
||||||
String? currentUnitName;
|
String? currentUnitName;
|
||||||
|
String subSpaceName = '';
|
||||||
|
|
||||||
DeviceManagementBloc() : super(DeviceManagementInitial()) {
|
DeviceManagementBloc() : super(DeviceManagementInitial()) {
|
||||||
on<FetchDevices>(_onFetchDevices);
|
on<FetchDevices>(_onFetchDevices);
|
||||||
@ -31,24 +32,29 @@ class DeviceManagementBloc
|
|||||||
on<ResetFilters>(_onResetFilters);
|
on<ResetFilters>(_onResetFilters);
|
||||||
on<ResetSelectedDevices>(_onResetSelectedDevices);
|
on<ResetSelectedDevices>(_onResetSelectedDevices);
|
||||||
on<UpdateSelection>(_onUpdateSelection);
|
on<UpdateSelection>(_onUpdateSelection);
|
||||||
|
on<UpdateDeviceName>(_onUpdateDeviceName);
|
||||||
|
on<UpdateSubSpaceName>(_onUpdateSubSpaceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _onFetchDevices(
|
Future<void> _onFetchDevices(
|
||||||
FetchDevices event, Emitter<DeviceManagementState> emit) async {
|
FetchDevices event, Emitter<DeviceManagementState> emit) async {
|
||||||
emit(DeviceManagementLoading());
|
emit(DeviceManagementLoading());
|
||||||
try {
|
try {
|
||||||
List<AllDevicesModel> devices = [];
|
var devices = <AllDevicesModel>[];
|
||||||
_devices.clear();
|
_devices.clear();
|
||||||
var spaceBloc = event.context.read<SpaceTreeBloc>();
|
final spaceBloc = event.context.read<SpaceTreeBloc>();
|
||||||
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
||||||
|
|
||||||
if (spaceBloc.state.selectedCommunities.isEmpty) {
|
if (spaceBloc.state.selectedCommunities.isEmpty) {
|
||||||
devices = await DevicesManagementApi().fetchDevices(projectUuid);
|
devices = await DevicesManagementApi().fetchDevices('', '', projectUuid);
|
||||||
} else {
|
} else {
|
||||||
for (var community in spaceBloc.state.selectedCommunities) {
|
for (final community in spaceBloc.state.selectedCommunities) {
|
||||||
List<String> spacesList =
|
final spacesList =
|
||||||
spaceBloc.state.selectedCommunityAndSpaces[community] ?? [];
|
spaceBloc.state.selectedCommunityAndSpaces[community] ?? [];
|
||||||
|
for (final space in spacesList) {
|
||||||
devices.addAll(await DevicesManagementApi()
|
devices.addAll(await DevicesManagementApi()
|
||||||
.fetchDevices(projectUuid, spacesId: spacesList));
|
.fetchDevices(community, space, projectUuid));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,7 +76,7 @@ class DeviceManagementBloc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onFilterDevices(
|
Future<void> _onFilterDevices(
|
||||||
FilterDevices event, Emitter<DeviceManagementState> emit) async {
|
FilterDevices event, Emitter<DeviceManagementState> emit) async {
|
||||||
if (_devices.isNotEmpty) {
|
if (_devices.isNotEmpty) {
|
||||||
_filteredDevices = List.from(_devices.where((device) {
|
_filteredDevices = List.from(_devices.where((device) {
|
||||||
@ -152,8 +158,7 @@ class DeviceManagementBloc
|
|||||||
add(FilterDevices(_getFilterFromIndex(_selectedIndex)));
|
add(FilterDevices(_getFilterFromIndex(_selectedIndex)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onSelectDevice(
|
void _onSelectDevice(SelectDevice event, Emitter<DeviceManagementState> emit) {
|
||||||
SelectDevice event, Emitter<DeviceManagementState> emit) {
|
|
||||||
final selectedUuid = event.selectedDevice.uuid;
|
final selectedUuid = event.selectedDevice.uuid;
|
||||||
|
|
||||||
if (_selectedDevices.any((device) => device.uuid == selectedUuid)) {
|
if (_selectedDevices.any((device) => device.uuid == selectedUuid)) {
|
||||||
@ -162,9 +167,9 @@ class DeviceManagementBloc
|
|||||||
_selectedDevices.add(event.selectedDevice);
|
_selectedDevices.add(event.selectedDevice);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<AllDevicesModel> clonedSelectedDevices = List.from(_selectedDevices);
|
final clonedSelectedDevices = List<AllDevicesModel>.from(_selectedDevices);
|
||||||
|
|
||||||
bool isControlButtonEnabled =
|
final isControlButtonEnabled =
|
||||||
_checkIfControlButtonEnabled(clonedSelectedDevices);
|
_checkIfControlButtonEnabled(clonedSelectedDevices);
|
||||||
|
|
||||||
if (state is DeviceManagementLoaded) {
|
if (state is DeviceManagementLoaded) {
|
||||||
@ -194,8 +199,8 @@ class DeviceManagementBloc
|
|||||||
|
|
||||||
void _onUpdateSelection(
|
void _onUpdateSelection(
|
||||||
UpdateSelection event, Emitter<DeviceManagementState> emit) {
|
UpdateSelection event, Emitter<DeviceManagementState> emit) {
|
||||||
List<AllDevicesModel> selectedDevices = [];
|
final selectedDevices = <AllDevicesModel>[];
|
||||||
List<AllDevicesModel> devicesToSelectFrom = [];
|
var devicesToSelectFrom = <AllDevicesModel>[];
|
||||||
|
|
||||||
if (state is DeviceManagementLoaded) {
|
if (state is DeviceManagementLoaded) {
|
||||||
devicesToSelectFrom = (state as DeviceManagementLoaded).devices;
|
devicesToSelectFrom = (state as DeviceManagementLoaded).devices;
|
||||||
@ -203,7 +208,7 @@ class DeviceManagementBloc
|
|||||||
devicesToSelectFrom = (state as DeviceManagementFiltered).filteredDevices;
|
devicesToSelectFrom = (state as DeviceManagementFiltered).filteredDevices;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < event.selectedRows.length; i++) {
|
for (var i = 0; i < event.selectedRows.length; i++) {
|
||||||
if (event.selectedRows[i]) {
|
if (event.selectedRows[i]) {
|
||||||
selectedDevices.add(devicesToSelectFrom[i]);
|
selectedDevices.add(devicesToSelectFrom[i]);
|
||||||
}
|
}
|
||||||
@ -249,8 +254,7 @@ class DeviceManagementBloc
|
|||||||
_onlineCount = _devices.where((device) => device.online == true).length;
|
_onlineCount = _devices.where((device) => device.online == true).length;
|
||||||
_offlineCount = _devices.where((device) => device.online == false).length;
|
_offlineCount = _devices.where((device) => device.online == false).length;
|
||||||
_lowBatteryCount = _devices
|
_lowBatteryCount = _devices
|
||||||
.where((device) =>
|
.where((device) => device.batteryLevel != null && device.batteryLevel! < 20)
|
||||||
device.batteryLevel != null && device.batteryLevel! < 20)
|
|
||||||
.length;
|
.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,8 +271,7 @@ class DeviceManagementBloc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onSearchDevices(
|
void _onSearchDevices(SearchDevices event, Emitter<DeviceManagementState> emit) {
|
||||||
SearchDevices event, Emitter<DeviceManagementState> emit) {
|
|
||||||
if ((event.community == null || event.community!.isEmpty) &&
|
if ((event.community == null || event.community!.isEmpty) &&
|
||||||
(event.unitName == null || event.unitName!.isEmpty) &&
|
(event.unitName == null || event.unitName!.isEmpty) &&
|
||||||
(event.deviceNameOrProductName == null ||
|
(event.deviceNameOrProductName == null ||
|
||||||
@ -297,7 +300,7 @@ class DeviceManagementBloc
|
|||||||
currentCommunity = event.community;
|
currentCommunity = event.community;
|
||||||
currentUnitName = event.unitName;
|
currentUnitName = event.unitName;
|
||||||
|
|
||||||
List<AllDevicesModel> devicesToSearch = _devices;
|
final devicesToSearch = _devices;
|
||||||
|
|
||||||
if (devicesToSearch.isNotEmpty) {
|
if (devicesToSearch.isNotEmpty) {
|
||||||
final searchText = event.deviceNameOrProductName?.toLowerCase() ?? '';
|
final searchText = event.deviceNameOrProductName?.toLowerCase() ?? '';
|
||||||
@ -340,5 +343,134 @@ class DeviceManagementBloc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _onUpdateDeviceName(
|
||||||
|
UpdateDeviceName event, Emitter<DeviceManagementState> emit) {
|
||||||
|
final devices = _devices.map((device) {
|
||||||
|
if (device.uuid == event.deviceId) {
|
||||||
|
final modifiedDevice = device.copyWith(name: event.newName);
|
||||||
|
_selectedDevices.removeWhere((device) => device.uuid == event.deviceId);
|
||||||
|
_selectedDevices.add(modifiedDevice);
|
||||||
|
return modifiedDevice;
|
||||||
|
}
|
||||||
|
return device;
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
final filteredDevices = _filteredDevices.map((device) {
|
||||||
|
if (device.uuid == event.deviceId) {
|
||||||
|
final modifiedDevice = device.copyWith(name: event.newName);
|
||||||
|
_selectedDevices.removeWhere((device) => device.uuid == event.deviceId);
|
||||||
|
_selectedDevices.add(modifiedDevice);
|
||||||
|
return modifiedDevice;
|
||||||
|
}
|
||||||
|
return device;
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
_devices = devices;
|
||||||
|
_filteredDevices = filteredDevices;
|
||||||
|
|
||||||
|
if (state is DeviceManagementLoaded) {
|
||||||
|
final loaded = state as DeviceManagementLoaded;
|
||||||
|
final selectedDevices01 = _selectedDevices.map((device) {
|
||||||
|
if (device.uuid == event.deviceId) {
|
||||||
|
final modifiedDevice = device.copyWith(name: event.newName);
|
||||||
|
return modifiedDevice;
|
||||||
|
}
|
||||||
|
return device;
|
||||||
|
}).toList();
|
||||||
|
emit(DeviceManagementLoaded(
|
||||||
|
devices: devices,
|
||||||
|
selectedIndex: loaded.selectedIndex,
|
||||||
|
onlineCount: loaded.onlineCount,
|
||||||
|
offlineCount: loaded.offlineCount,
|
||||||
|
lowBatteryCount: loaded.lowBatteryCount,
|
||||||
|
selectedDevice: selectedDevices01,
|
||||||
|
isControlButtonEnabled: loaded.isControlButtonEnabled,
|
||||||
|
));
|
||||||
|
} else if (state is DeviceManagementFiltered) {
|
||||||
|
final filtered = state as DeviceManagementFiltered;
|
||||||
|
final selectedDevices01 = filtered.selectedDevice?.map((device) {
|
||||||
|
if (device.uuid == event.deviceId) {
|
||||||
|
final modifiedDevice = device.copyWith(name: event.newName);
|
||||||
|
return modifiedDevice;
|
||||||
|
}
|
||||||
|
return device;
|
||||||
|
}).toList();
|
||||||
|
emit(DeviceManagementFiltered(
|
||||||
|
filteredDevices: filteredDevices,
|
||||||
|
selectedIndex: filtered.selectedIndex,
|
||||||
|
onlineCount: filtered.onlineCount,
|
||||||
|
offlineCount: filtered.offlineCount,
|
||||||
|
lowBatteryCount: filtered.lowBatteryCount,
|
||||||
|
selectedDevice: selectedDevices01,
|
||||||
|
isControlButtonEnabled: filtered.isControlButtonEnabled,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onUpdateSubSpaceName(
|
||||||
|
UpdateSubSpaceName event, Emitter<DeviceManagementState> emit) {
|
||||||
|
final devices = _devices.map((device) {
|
||||||
|
if (device.uuid == event.deviceId) {
|
||||||
|
return device.copyWith(
|
||||||
|
subspace:
|
||||||
|
device.subspace?.copyWith(subspaceName: event.newSubSpaceName));
|
||||||
|
}
|
||||||
|
return device;
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
final filteredDevices = _filteredDevices.map((device) {
|
||||||
|
if (device.uuid == event.deviceId) {
|
||||||
|
return device.copyWith(
|
||||||
|
subspace:
|
||||||
|
device.subspace?.copyWith(subspaceName: event.newSubSpaceName));
|
||||||
|
}
|
||||||
|
return device;
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
_devices = devices;
|
||||||
|
_filteredDevices = filteredDevices;
|
||||||
|
|
||||||
|
if (state is DeviceManagementLoaded) {
|
||||||
|
final loaded = state as DeviceManagementLoaded;
|
||||||
|
final selectedDevices = loaded.selectedDevice?.map((device) {
|
||||||
|
if (device.uuid == event.deviceId) {
|
||||||
|
return device.copyWith(
|
||||||
|
subspace:
|
||||||
|
device.subspace?.copyWith(subspaceName: event.newSubSpaceName));
|
||||||
|
}
|
||||||
|
return device;
|
||||||
|
}).toList();
|
||||||
|
emit(DeviceManagementLoaded(
|
||||||
|
devices: _devices,
|
||||||
|
selectedIndex: loaded.selectedIndex,
|
||||||
|
onlineCount: loaded.onlineCount,
|
||||||
|
offlineCount: loaded.offlineCount,
|
||||||
|
lowBatteryCount: loaded.lowBatteryCount,
|
||||||
|
selectedDevice: selectedDevices,
|
||||||
|
isControlButtonEnabled: loaded.isControlButtonEnabled,
|
||||||
|
));
|
||||||
|
} else if (state is DeviceManagementFiltered) {
|
||||||
|
// final filtered = state as DeviceManagementFiltered;
|
||||||
|
// emit(DeviceManagementFiltered(
|
||||||
|
// filteredDevices: _filteredDevices,
|
||||||
|
// selectedIndex: filtered.selectedIndex,
|
||||||
|
// onlineCount: filtered.onlineCount,
|
||||||
|
// offlineCount: filtered.offlineCount,
|
||||||
|
// lowBatteryCount: filtered.lowBatteryCount,
|
||||||
|
// selectedDevice: filtered.selectedDevice,
|
||||||
|
// isControlButtonEnabled: filtered.isControlButtonEnabled,
|
||||||
|
// ));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void changeSubspaceName(
|
||||||
|
String deviceId, String newSubSpaceName, String subspaceId) {
|
||||||
|
add(UpdateSubSpaceName(
|
||||||
|
deviceId: deviceId,
|
||||||
|
newSubSpaceName: newSubSpaceName,
|
||||||
|
subspaceId: subspaceId,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
List<AllDevicesModel> get selectedDevices => _selectedDevices;
|
List<AllDevicesModel> get selectedDevices => _selectedDevices;
|
||||||
}
|
}
|
||||||
|
@ -70,3 +70,21 @@ class UpdateSelection extends DeviceManagementEvent {
|
|||||||
|
|
||||||
const UpdateSelection(this.selectedRows);
|
const UpdateSelection(this.selectedRows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class UpdateDeviceName extends DeviceManagementEvent {
|
||||||
|
final String deviceId;
|
||||||
|
final String newName;
|
||||||
|
|
||||||
|
const UpdateDeviceName({required this.deviceId, required this.newName});
|
||||||
|
}
|
||||||
|
|
||||||
|
class UpdateSubSpaceName extends DeviceManagementEvent {
|
||||||
|
final String deviceId;
|
||||||
|
final String newSubSpaceName;
|
||||||
|
final String subspaceId;
|
||||||
|
|
||||||
|
const UpdateSubSpaceName(
|
||||||
|
{required this.deviceId,
|
||||||
|
required this.newSubSpaceName,
|
||||||
|
required this.subspaceId});
|
||||||
|
}
|
||||||
|
@ -44,4 +44,20 @@ class DeviceSubspace {
|
|||||||
static List<Map<String, dynamic>> listToJson(List<DeviceSubspace> subspaces) {
|
static List<Map<String, dynamic>> listToJson(List<DeviceSubspace> subspaces) {
|
||||||
return subspaces.map((subspace) => subspace.toJson()).toList();
|
return subspaces.map((subspace) => subspace.toJson()).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DeviceSubspace copyWith({
|
||||||
|
String? uuid,
|
||||||
|
DateTime? createdAt,
|
||||||
|
DateTime? updatedAt,
|
||||||
|
String? subspaceName,
|
||||||
|
bool? disabled,
|
||||||
|
}) {
|
||||||
|
return DeviceSubspace(
|
||||||
|
uuid: uuid ?? this.uuid,
|
||||||
|
createdAt: createdAt ?? this.createdAt,
|
||||||
|
updatedAt: updatedAt ?? this.updatedAt,
|
||||||
|
subspaceName: subspaceName ?? this.subspaceName,
|
||||||
|
disabled: disabled ?? this.disabled,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -588,4 +588,72 @@ SOS
|
|||||||
"NCPS": DeviceType.NCPS,
|
"NCPS": DeviceType.NCPS,
|
||||||
"PC": DeviceType.PC,
|
"PC": DeviceType.PC,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
AllDevicesModel copyWith({
|
||||||
|
DevicesModelRoom? room,
|
||||||
|
DeviceSubspace? subspace,
|
||||||
|
DevicesModelUnit? unit,
|
||||||
|
DeviceCommunityModel? community,
|
||||||
|
String? productUuid,
|
||||||
|
String? productType,
|
||||||
|
String? permissionType,
|
||||||
|
int? activeTime,
|
||||||
|
String? category,
|
||||||
|
String? categoryName,
|
||||||
|
int? createTime,
|
||||||
|
String? gatewayId,
|
||||||
|
String? icon,
|
||||||
|
String? ip,
|
||||||
|
String? lat,
|
||||||
|
String? localKey,
|
||||||
|
String? lon,
|
||||||
|
String? model,
|
||||||
|
String? name,
|
||||||
|
String? nodeId,
|
||||||
|
bool? online,
|
||||||
|
String? ownerId,
|
||||||
|
bool? sub,
|
||||||
|
String? timeZone,
|
||||||
|
int? updateTime,
|
||||||
|
String? uuid,
|
||||||
|
int? batteryLevel,
|
||||||
|
String? productName,
|
||||||
|
List<DeviceSpaceModel>? spaces,
|
||||||
|
List<DeviceTagModel>? deviceTags,
|
||||||
|
DeviceSubSpace? deviceSubSpace,
|
||||||
|
}) {
|
||||||
|
return AllDevicesModel(
|
||||||
|
room: room ?? this.room,
|
||||||
|
subspace: subspace ?? this.subspace,
|
||||||
|
unit: unit ?? this.unit,
|
||||||
|
community: community ?? this.community,
|
||||||
|
productUuid: productUuid ?? this.productUuid,
|
||||||
|
productType: productType ?? this.productType,
|
||||||
|
permissionType: permissionType ?? this.permissionType,
|
||||||
|
activeTime: activeTime ?? this.activeTime,
|
||||||
|
category: category ?? this.category,
|
||||||
|
categoryName: categoryName ?? this.categoryName,
|
||||||
|
createTime: createTime ?? this.createTime,
|
||||||
|
gatewayId: gatewayId ?? this.gatewayId,
|
||||||
|
icon: icon ?? this.icon,
|
||||||
|
ip: ip ?? this.ip,
|
||||||
|
lat: lat ?? this.lat,
|
||||||
|
localKey: localKey ?? this.localKey,
|
||||||
|
lon: lon ?? this.lon,
|
||||||
|
model: model ?? this.model,
|
||||||
|
name: name ?? this.name,
|
||||||
|
nodeId: nodeId ?? this.nodeId,
|
||||||
|
online: online ?? this.online,
|
||||||
|
ownerId: ownerId ?? this.ownerId,
|
||||||
|
sub: sub ?? this.sub,
|
||||||
|
timeZone: timeZone ?? this.timeZone,
|
||||||
|
updateTime: updateTime ?? this.updateTime,
|
||||||
|
uuid: uuid ?? this.uuid,
|
||||||
|
batteryLevel: batteryLevel ?? this.batteryLevel,
|
||||||
|
productName: productName ?? this.productName,
|
||||||
|
spaces: spaces ?? this.spaces,
|
||||||
|
deviceTags: deviceTags ?? this.deviceTags,
|
||||||
|
deviceSubSpace: deviceSubSpace ?? this.deviceSubSpace,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BlocBuilder<DeviceManagementBloc, DeviceManagementState>(
|
return BlocBuilder<DeviceManagementBloc, DeviceManagementState>(
|
||||||
|
buildWhen: (previous, current) => previous != current,
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
List<AllDevicesModel> devicesToShow = [];
|
List<AllDevicesModel> devicesToShow = [];
|
||||||
int selectedIndex = 0;
|
int selectedIndex = 0;
|
||||||
@ -31,7 +32,6 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
|
|||||||
int lowBatteryCount = 0;
|
int lowBatteryCount = 0;
|
||||||
bool isControlButtonEnabled = false;
|
bool isControlButtonEnabled = false;
|
||||||
List<AllDevicesModel> selectedDevices = [];
|
List<AllDevicesModel> selectedDevices = [];
|
||||||
|
|
||||||
if (state is DeviceManagementLoaded) {
|
if (state is DeviceManagementLoaded) {
|
||||||
devicesToShow = state.devices;
|
devicesToShow = state.devices;
|
||||||
selectedIndex = state.selectedIndex;
|
selectedIndex = state.selectedIndex;
|
||||||
@ -111,6 +111,8 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
|
|||||||
onPressed: isControlButtonEnabled
|
onPressed: isControlButtonEnabled
|
||||||
? () {
|
? () {
|
||||||
if (isAnyDeviceOffline) {
|
if (isAnyDeviceOffline) {
|
||||||
|
ScaffoldMessenger.of(context)
|
||||||
|
.clearSnackBars();
|
||||||
ScaffoldMessenger.of(context)
|
ScaffoldMessenger.of(context)
|
||||||
.showSnackBar(
|
.showSnackBar(
|
||||||
const SnackBar(
|
const SnackBar(
|
||||||
@ -190,7 +192,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
|
|||||||
'Product Name',
|
'Product Name',
|
||||||
'Device ID',
|
'Device ID',
|
||||||
'Space Name',
|
'Space Name',
|
||||||
'location',
|
'Location',
|
||||||
'Battery Level',
|
'Battery Level',
|
||||||
'Installation Date and Time',
|
'Installation Date and Time',
|
||||||
'Status',
|
'Status',
|
||||||
@ -242,7 +244,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
|
|||||||
.map((device) => device.uuid!)
|
.map((device) => device.uuid!)
|
||||||
.toList(),
|
.toList(),
|
||||||
isEmpty: devicesToShow.isEmpty,
|
isEmpty: devicesToShow.isEmpty,
|
||||||
onSettingsPressed: (rowIndex) {
|
onSettingsPressed: (rowIndex) async {
|
||||||
final device = devicesToShow[rowIndex];
|
final device = devicesToShow[rowIndex];
|
||||||
showDeviceSettingsSidebar(context, device);
|
showDeviceSettingsSidebar(context, device);
|
||||||
},
|
},
|
||||||
@ -264,7 +266,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
|
|||||||
barrierDismissible: true,
|
barrierDismissible: true,
|
||||||
barrierLabel: "Device Settings",
|
barrierLabel: "Device Settings",
|
||||||
transitionDuration: const Duration(milliseconds: 300),
|
transitionDuration: const Duration(milliseconds: 300),
|
||||||
pageBuilder: (context, anim1, anim2) {
|
pageBuilder: (_, anim1, anim2) {
|
||||||
return Align(
|
return Align(
|
||||||
alignment: Alignment.centerRight,
|
alignment: Alignment.centerRight,
|
||||||
child: Material(
|
child: Material(
|
||||||
@ -274,6 +276,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
|
|||||||
child: DeviceSettingsPanel(
|
child: DeviceSettingsPanel(
|
||||||
device: device,
|
device: device,
|
||||||
onClose: () => Navigator.of(context).pop(),
|
onClose: () => Navigator.of(context).pop(),
|
||||||
|
deviceManagementBloc: context.read<DeviceManagementBloc>(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -23,8 +23,8 @@ class AccurteCalibratingDialog extends StatelessWidget {
|
|||||||
body: const NormalTextBodyForDialog(
|
body: const NormalTextBodyForDialog(
|
||||||
title: '',
|
title: '',
|
||||||
step1:
|
step1:
|
||||||
'1. Click Close Button to make the Curtain run to Full Close and Position.',
|
'Click Close Button to make the Curtain run to Full Close and Position.',
|
||||||
step2: '2. click Next to complete the Calibration.',
|
step2: 'click Next to complete the Calibration.',
|
||||||
),
|
),
|
||||||
leftOnTap: () => Navigator.of(parentContext).pop(),
|
leftOnTap: () => Navigator.of(parentContext).pop(),
|
||||||
rightOnTap: () {
|
rightOnTap: () {
|
||||||
|
@ -20,8 +20,8 @@ class AccurateCalibrationDialog extends StatelessWidget {
|
|||||||
title: 'Accurate Calibration',
|
title: 'Accurate Calibration',
|
||||||
body: const NormalTextBodyForDialog(
|
body: const NormalTextBodyForDialog(
|
||||||
title: 'Prepare Calibration:',
|
title: 'Prepare Calibration:',
|
||||||
step1: '1. Run The Curtain to the Fully Open Position,and pause.',
|
step1: 'Run The Curtain to the Fully Open Position,and pause.',
|
||||||
step2: '2. click Next to Start accurate calibration.',
|
step2: 'click Next to Start accurate calibration.',
|
||||||
),
|
),
|
||||||
leftOnTap: () => Navigator.of(parentContext).pop(),
|
leftOnTap: () => Navigator.of(parentContext).pop(),
|
||||||
rightOnTap: () {
|
rightOnTap: () {
|
||||||
|
@ -17,32 +17,38 @@ class AccurateDialogWidget extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return SizedBox(
|
return SizedBox(
|
||||||
height: 300,
|
height: 250,
|
||||||
width: 400,
|
width: 500,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.all(10),
|
padding: const EdgeInsets.all(10),
|
||||||
child: Text(
|
child: Text(
|
||||||
title,
|
title,
|
||||||
style: const TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 24,
|
fontSize: 24,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
color: ColorsManager.blueColor,
|
color: ColorsManager.dialogBlueTitle,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 5),
|
|
||||||
const Divider(
|
const Divider(
|
||||||
indent: 10,
|
indent: 60,
|
||||||
endIndent: 10,
|
endIndent: 60,
|
||||||
),
|
),
|
||||||
Padding(
|
],
|
||||||
padding: const EdgeInsets.all(10),
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
child: body,
|
child: body,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
Expanded(
|
||||||
const Spacer(),
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: [
|
||||||
const Divider(),
|
const Divider(),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
@ -50,7 +56,7 @@ class AccurateDialogWidget extends StatelessWidget {
|
|||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: leftOnTap,
|
onTap: leftOnTap,
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 60,
|
height: 40,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
border: Border(
|
border: Border(
|
||||||
@ -70,7 +76,7 @@ class AccurateDialogWidget extends StatelessWidget {
|
|||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: rightOnTap,
|
onTap: rightOnTap,
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 60,
|
height: 40,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
border: Border(
|
border: Border(
|
||||||
@ -92,6 +98,9 @@ class AccurateDialogWidget extends StatelessWidget {
|
|||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
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:flutter_svg/svg.dart';
|
||||||
import 'package:syncrow_web/pages/device_managment/curtain_module/bloc/curtain_module_bloc.dart';
|
import 'package:syncrow_web/pages/device_managment/curtain_module/bloc/curtain_module_bloc.dart';
|
||||||
import 'package:syncrow_web/utils/color_manager.dart';
|
import 'package:syncrow_web/utils/color_manager.dart';
|
||||||
|
import 'package:syncrow_web/utils/constants/assets.dart';
|
||||||
|
|
||||||
class CalibrateCompletedDialog extends StatelessWidget {
|
class CalibrateCompletedDialog extends StatelessWidget {
|
||||||
final BuildContext parentContext;
|
final BuildContext parentContext;
|
||||||
@ -21,14 +23,17 @@ class CalibrateCompletedDialog extends StatelessWidget {
|
|||||||
width: 400,
|
width: 400,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
const Padding(
|
Expanded(
|
||||||
padding: EdgeInsets.all(10),
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(10),
|
||||||
child: Text(
|
child: Text(
|
||||||
'Calibration Completed',
|
'Calibration Completed',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 24,
|
fontSize: 24,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
color: ColorsManager.blueColor,
|
color: ColorsManager.dialogBlueTitle,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -37,12 +42,16 @@ class CalibrateCompletedDialog extends StatelessWidget {
|
|||||||
indent: 10,
|
indent: 10,
|
||||||
endIndent: 10,
|
endIndent: 10,
|
||||||
),
|
),
|
||||||
const Icon(
|
],
|
||||||
Icons.check_circle,
|
|
||||||
size: 100,
|
|
||||||
color: ColorsManager.blueColor,
|
|
||||||
),
|
),
|
||||||
const Spacer(),
|
),
|
||||||
|
Expanded(
|
||||||
|
child: SvgPicture.asset(Assets.completedDoneIcon),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: [
|
||||||
const Divider(
|
const Divider(
|
||||||
indent: 10,
|
indent: 10,
|
||||||
endIndent: 10,
|
endIndent: 10,
|
||||||
@ -71,6 +80,9 @@ class CalibrateCompletedDialog extends StatelessWidget {
|
|||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -15,28 +15,72 @@ class NormalTextBodyForDialog extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Column(
|
return Padding(
|
||||||
|
padding: EdgeInsetsGeometry.only(left: 15),
|
||||||
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
if (title.isEmpty)
|
||||||
|
const SizedBox()
|
||||||
|
else
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
title,
|
title,
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
color: ColorsManager.grayColor,
|
color: ColorsManager.grayColor,
|
||||||
|
fontSize: 17,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
const SizedBox(
|
||||||
|
width: 10,
|
||||||
|
),
|
||||||
|
const Text('1. ',
|
||||||
|
style: TextStyle(
|
||||||
|
color: ColorsManager.grayColor,
|
||||||
|
fontSize: 17,
|
||||||
|
)),
|
||||||
|
SizedBox(
|
||||||
|
width: 450,
|
||||||
|
child: Text(
|
||||||
step1,
|
step1,
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
color: ColorsManager.grayColor,
|
color: ColorsManager.grayColor,
|
||||||
|
fontSize: 17,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
const SizedBox(
|
||||||
|
width: 10,
|
||||||
|
),
|
||||||
|
const Text('2. ',
|
||||||
|
style: TextStyle(
|
||||||
|
color: ColorsManager.grayColor,
|
||||||
|
fontSize: 17,
|
||||||
|
)),
|
||||||
Text(
|
Text(
|
||||||
step2,
|
step2,
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
color: ColorsManager.grayColor,
|
color: ColorsManager.grayColor,
|
||||||
|
fontSize: 17,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ class NumberInputField extends StatelessWidget {
|
|||||||
contentPadding: EdgeInsets.zero,
|
contentPadding: EdgeInsets.zero,
|
||||||
),
|
),
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 20,
|
fontSize: 15,
|
||||||
color: ColorsManager.blackColor,
|
color: ColorsManager.blackColor,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -18,7 +18,7 @@ class PrefReversCardWidget extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return DefaultContainer(
|
return DefaultContainer(
|
||||||
padding: const EdgeInsets.all(12),
|
padding: const EdgeInsets.all(18),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
@ -23,12 +23,12 @@ class CurtainModulePrefrencesDialog extends StatelessWidget {
|
|||||||
Widget build(_) {
|
Widget build(_) {
|
||||||
return AlertDialog(
|
return AlertDialog(
|
||||||
backgroundColor: ColorsManager.CircleImageBackground,
|
backgroundColor: ColorsManager.CircleImageBackground,
|
||||||
contentPadding: const EdgeInsets.all(30),
|
contentPadding: const EdgeInsets.all(20),
|
||||||
title: const Center(
|
title: Center(
|
||||||
child: Text(
|
child: Text(
|
||||||
'Preferences',
|
'Preferences',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: ColorsManager.blueColor,
|
color: ColorsManager.dialogBlueTitle,
|
||||||
fontSize: 24,
|
fontSize: 24,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
|
@ -69,14 +69,23 @@ class _QuickCalibratingDialogState extends State<QuickCalibratingDialog> {
|
|||||||
body: Column(
|
body: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
const Text(
|
const Expanded(
|
||||||
'1. please Enter the Travel Time:',
|
child: Align(
|
||||||
style: TextStyle(color: ColorsManager.grayBorder),
|
alignment: Alignment.center,
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(right: 75),
|
||||||
|
child: Text(
|
||||||
|
'1.please Enter the Travel Time:',
|
||||||
|
style: TextStyle(color: ColorsManager.lightGrayColor),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 10),
|
),
|
||||||
Container(
|
),
|
||||||
width: 150,
|
),
|
||||||
height: 40,
|
Expanded(
|
||||||
|
child: Align(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: Container(
|
||||||
|
width: 110,
|
||||||
padding: const EdgeInsets.all(5),
|
padding: const EdgeInsets.all(5),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: ColorsManager.whiteColors,
|
color: ColorsManager.whiteColors,
|
||||||
@ -88,12 +97,12 @@ class _QuickCalibratingDialogState extends State<QuickCalibratingDialog> {
|
|||||||
Expanded(
|
Expanded(
|
||||||
child: NumberInputField(controller: _controller),
|
child: NumberInputField(controller: _controller),
|
||||||
),
|
),
|
||||||
const Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Text(
|
||||||
'seconds',
|
'seconds',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 15,
|
fontSize: 12,
|
||||||
color: ColorsManager.blueColor,
|
color: ColorsManager.dialogBlueTitle,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -101,8 +110,11 @@ class _QuickCalibratingDialogState extends State<QuickCalibratingDialog> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
if (_errorText != null)
|
if (_errorText != null)
|
||||||
Padding(
|
Expanded(
|
||||||
|
child: Padding(
|
||||||
padding: const EdgeInsets.only(top: 8.0),
|
padding: const EdgeInsets.only(top: 8.0),
|
||||||
child: Text(
|
child: Text(
|
||||||
_errorText!,
|
_errorText!,
|
||||||
@ -112,6 +124,16 @@ class _QuickCalibratingDialogState extends State<QuickCalibratingDialog> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
const Expanded(
|
||||||
|
child: Align(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: Text(
|
||||||
|
'2.click Next to Complete the calibration',
|
||||||
|
style: TextStyle(color: ColorsManager.lightGrayColor),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
leftOnTap: () => Navigator.of(widget.parentContext).pop(),
|
leftOnTap: () => Navigator.of(widget.parentContext).pop(),
|
||||||
|
@ -23,8 +23,8 @@ class QuickCalibrationDialog extends StatelessWidget {
|
|||||||
body: const NormalTextBodyForDialog(
|
body: const NormalTextBodyForDialog(
|
||||||
title: 'Prepare Calibration:',
|
title: 'Prepare Calibration:',
|
||||||
step1:
|
step1:
|
||||||
'1. Confirm that the curtain is in the fully closed and suspended state.',
|
'Confirm that the curtain is in the fully closed and suspended state.',
|
||||||
step2: '2. click Next to Start calibration.',
|
step2: 'click Next to Start calibration.',
|
||||||
),
|
),
|
||||||
leftOnTap: () => Navigator.of(parentContext).pop(),
|
leftOnTap: () => Navigator.of(parentContext).pop(),
|
||||||
rightOnTap: () {
|
rightOnTap: () {
|
||||||
|
@ -19,11 +19,14 @@ class DeviceManagementContent extends StatelessWidget {
|
|||||||
required this.device,
|
required this.device,
|
||||||
required this.subSpaces,
|
required this.subSpaces,
|
||||||
required this.deviceInfo,
|
required this.deviceInfo,
|
||||||
|
required this.deviceManagementBloc,
|
||||||
});
|
});
|
||||||
|
|
||||||
final AllDevicesModel device;
|
final AllDevicesModel device;
|
||||||
final List<SubSpaceModel> subSpaces;
|
final List<SubSpaceModel> subSpaces;
|
||||||
final DeviceInfoModel deviceInfo;
|
final DeviceInfoModel deviceInfo;
|
||||||
|
final DeviceManagementBloc deviceManagementBloc;
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -87,6 +90,11 @@ class DeviceManagementContent extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
deviceManagementBloc.add(UpdateSubSpaceName(
|
||||||
|
subspaceId: selectedSubSpace.id!,
|
||||||
|
deviceId: device.uuid!,
|
||||||
|
newSubSpaceName: selectedSubSpace.name ?? ''));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: infoRow(
|
child: infoRow(
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
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/models/devices_model.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/bloc/setting_bloc_state.dart';
|
||||||
import 'package:syncrow_web/pages/device_managment/device_setting/device_icon_type_helper.dart';
|
import 'package:syncrow_web/pages/device_managment/device_setting/device_icon_type_helper.dart';
|
||||||
import 'package:syncrow_web/pages/device_managment/device_setting/device_management_content.dart';
|
import 'package:syncrow_web/pages/device_managment/device_setting/device_management_content.dart';
|
||||||
import 'package:syncrow_web/pages/device_managment/device_setting/remove_device_widget.dart';
|
import 'package:syncrow_web/pages/device_managment/device_setting/remove_device_widget.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/device_info_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/bloc/setting_bloc_state.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/settings_model/sub_space_model.dart';
|
||||||
import 'package:syncrow_web/utils/color_manager.dart';
|
import 'package:syncrow_web/utils/color_manager.dart';
|
||||||
import 'package:syncrow_web/utils/constants/assets.dart';
|
import 'package:syncrow_web/utils/constants/assets.dart';
|
||||||
@ -17,7 +19,13 @@ import 'package:syncrow_web/web_layout/default_container.dart';
|
|||||||
class DeviceSettingsPanel extends StatelessWidget {
|
class DeviceSettingsPanel extends StatelessWidget {
|
||||||
final VoidCallback? onClose;
|
final VoidCallback? onClose;
|
||||||
final AllDevicesModel device;
|
final AllDevicesModel device;
|
||||||
const DeviceSettingsPanel({super.key, this.onClose, required this.device});
|
final DeviceManagementBloc deviceManagementBloc;
|
||||||
|
const DeviceSettingsPanel({
|
||||||
|
super.key,
|
||||||
|
this.onClose,
|
||||||
|
required this.device,
|
||||||
|
required this.deviceManagementBloc,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -134,8 +142,14 @@ class DeviceSettingsPanel extends StatelessWidget {
|
|||||||
onFieldSubmitted: (value) {
|
onFieldSubmitted: (value) {
|
||||||
_bloc.add(const ChangeNameEvent(
|
_bloc.add(const ChangeNameEvent(
|
||||||
value: false));
|
value: false));
|
||||||
|
deviceManagementBloc
|
||||||
|
..add(UpdateDeviceName(
|
||||||
|
deviceId: device.uuid!,
|
||||||
|
newName: _bloc
|
||||||
|
.nameController
|
||||||
|
.text))..add(ResetSelectedDevices());
|
||||||
},
|
},
|
||||||
decoration: InputDecoration(
|
decoration:const InputDecoration(
|
||||||
isDense: true,
|
isDense: true,
|
||||||
contentPadding: EdgeInsets.zero,
|
contentPadding: EdgeInsets.zero,
|
||||||
border: InputBorder.none,
|
border: InputBorder.none,
|
||||||
@ -190,6 +204,7 @@ class DeviceSettingsPanel extends StatelessWidget {
|
|||||||
device: device,
|
device: device,
|
||||||
subSpaces: subSpaces.cast<SubSpaceModel>(),
|
subSpaces: subSpaces.cast<SubSpaceModel>(),
|
||||||
deviceInfo: deviceInfo,
|
deviceInfo: deviceInfo,
|
||||||
|
deviceManagementBloc: deviceManagementBloc,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 32),
|
const SizedBox(height: 32),
|
||||||
RemoveDeviceWidget(bloc: _bloc),
|
RemoveDeviceWidget(bloc: _bloc),
|
||||||
|
@ -195,10 +195,10 @@ class _ScheduleTableView extends StatelessWidget {
|
|||||||
child: Text(_getSelectedDays(
|
child: Text(_getSelectedDays(
|
||||||
ScheduleModel.parseSelectedDays(schedule.days)))),
|
ScheduleModel.parseSelectedDays(schedule.days)))),
|
||||||
Center(child: Text(formatIsoStringToTime(schedule.time, context))),
|
Center(child: Text(formatIsoStringToTime(schedule.time, context))),
|
||||||
schedule.category == 'CUR_2'
|
if (schedule.category == 'CUR_2')
|
||||||
? Center(
|
Center(child: Text(schedule.function.value))
|
||||||
child: Text(schedule.function.value == true ? 'open' : 'close'))
|
else
|
||||||
: Center(child: Text(schedule.function.value ? 'On' : 'Off')),
|
Center(child: Text(schedule.function.value ? 'On' : 'Off')),
|
||||||
Center(
|
Center(
|
||||||
child: Wrap(
|
child: Wrap(
|
||||||
runAlignment: WrapAlignment.center,
|
runAlignment: WrapAlignment.center,
|
||||||
|
@ -19,13 +19,19 @@ class ScheduleDialogHelper {
|
|||||||
bool isEdit = false,
|
bool isEdit = false,
|
||||||
String? code,
|
String? code,
|
||||||
}) {
|
}) {
|
||||||
|
bool temp;
|
||||||
|
if (schedule?.category == 'CUR_2') {
|
||||||
|
temp = schedule!.function.value == 'open' ? true : false;
|
||||||
|
} else {
|
||||||
|
temp = schedule!.function.value;
|
||||||
|
}
|
||||||
final initialTime = schedule != null
|
final initialTime = schedule != null
|
||||||
? _convertStringToTimeOfDay(schedule.time)
|
? _convertStringToTimeOfDay(schedule.time)
|
||||||
: TimeOfDay.now();
|
: TimeOfDay.now();
|
||||||
final initialDays = schedule != null
|
final initialDays = schedule != null
|
||||||
? _convertDaysStringToBooleans(schedule.days)
|
? _convertDaysStringToBooleans(schedule.days)
|
||||||
: List.filled(7, false);
|
: List.filled(7, false);
|
||||||
bool? functionOn = schedule?.function.value ?? true;
|
bool? functionOn = temp;
|
||||||
TimeOfDay selectedTime = initialTime;
|
TimeOfDay selectedTime = initialTime;
|
||||||
List<bool> selectedDays = List.of(initialDays);
|
List<bool> selectedDays = List.of(initialDays);
|
||||||
|
|
||||||
|
@ -170,7 +170,7 @@ class RoutineBloc extends Bloc<RoutineEvent, RoutineState> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _onLoadScenes(
|
Future<void> _onLoadScenes(
|
||||||
LoadScenes event, Emitter<RoutineState> emit) async {
|
LoadScenes event, Emitter<RoutineState> emit) async {
|
||||||
emit(state.copyWith(isLoading: true, errorMessage: null));
|
emit(state.copyWith(isLoading: true, errorMessage: null));
|
||||||
List<ScenesModel> scenes = [];
|
List<ScenesModel> scenes = [];
|
||||||
@ -208,7 +208,7 @@ class RoutineBloc extends Bloc<RoutineEvent, RoutineState> {
|
|||||||
loadAutomationErrorMessage: '',
|
loadAutomationErrorMessage: '',
|
||||||
scenes: scenes));
|
scenes: scenes));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _onLoadAutomation(
|
Future<void> _onLoadAutomation(
|
||||||
LoadAutomation event, Emitter<RoutineState> emit) async {
|
LoadAutomation event, Emitter<RoutineState> emit) async {
|
||||||
@ -936,12 +936,16 @@ class RoutineBloc extends Bloc<RoutineEvent, RoutineState> {
|
|||||||
for (var communityId in spaceBloc.state.selectedCommunities) {
|
for (var communityId in spaceBloc.state.selectedCommunities) {
|
||||||
List<String> spacesList =
|
List<String> spacesList =
|
||||||
spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? [];
|
spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? [];
|
||||||
|
for (var spaceId in spacesList) {
|
||||||
devices.addAll(await DevicesManagementApi()
|
devices.addAll(await DevicesManagementApi()
|
||||||
.fetchDevices(projectUuid, spacesId: spacesList));
|
.fetchDevices(communityId, spaceId, projectUuid));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
devices.addAll(await DevicesManagementApi().fetchDevices(projectUuid,
|
devices.addAll(await DevicesManagementApi().fetchDevices(
|
||||||
spacesId: [createRoutineBloc.selectedSpaceId]));
|
createRoutineBloc.selectedCommunityId,
|
||||||
|
createRoutineBloc.selectedSpaceId,
|
||||||
|
projectUuid));
|
||||||
}
|
}
|
||||||
|
|
||||||
emit(state.copyWith(isLoading: false, devices: devices));
|
emit(state.copyWith(isLoading: false, devices: devices));
|
||||||
|
@ -58,7 +58,9 @@ class CurtainHelper {
|
|||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
const DialogHeader('AC Functions'),
|
DialogHeader(dialogType == 'THEN'
|
||||||
|
? 'Curtain Functions'
|
||||||
|
: 'Curtain Conditions'),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Row(
|
child: Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
@ -2,10 +2,8 @@ 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:flutter_svg/svg.dart';
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
|
|
||||||
import 'package:syncrow_web/pages/common/buttons/default_button.dart';
|
import 'package:syncrow_web/pages/common/buttons/default_button.dart';
|
||||||
import 'package:syncrow_web/pages/common/date_time_widget.dart';
|
import 'package:syncrow_web/pages/common/date_time_widget.dart';
|
||||||
import 'package:syncrow_web/pages/common/text_field/custom_web_textfield.dart';
|
|
||||||
import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart';
|
import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_event.dart';
|
import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_event.dart';
|
||||||
import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_state.dart';
|
import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_state.dart';
|
||||||
@ -23,8 +21,8 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
Size size = MediaQuery.of(context).size;
|
final size = MediaQuery.of(context).size;
|
||||||
var text = Theme.of(context)
|
final text = Theme.of(context)
|
||||||
.textTheme
|
.textTheme
|
||||||
.bodySmall!
|
.bodySmall!
|
||||||
.copyWith(color: Colors.black, fontSize: 13);
|
.copyWith(color: Colors.black, fontSize: 13);
|
||||||
@ -41,8 +39,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
title: 'Sent Successfully',
|
title: 'Sent Successfully',
|
||||||
widgeta: Column(
|
widgeta: Column(
|
||||||
children: [
|
children: [
|
||||||
if (visitorBloc
|
if (visitorBloc.passwordStatus!.failedOperations.isNotEmpty)
|
||||||
.passwordStatus!.failedOperations.isNotEmpty)
|
|
||||||
Column(
|
Column(
|
||||||
children: [
|
children: [
|
||||||
const Text('Failed Devices'),
|
const Text('Failed Devices'),
|
||||||
@ -56,22 +53,19 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
.passwordStatus!.failedOperations.length,
|
.passwordStatus!.failedOperations.length,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
return Container(
|
return Container(
|
||||||
margin: EdgeInsets.all(5),
|
margin: const EdgeInsets.all(5),
|
||||||
decoration: containerDecoration,
|
decoration: containerDecoration,
|
||||||
height: 45,
|
height: 45,
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Text(visitorBloc
|
child: Text(visitorBloc.passwordStatus!
|
||||||
.passwordStatus!
|
.failedOperations[index].deviceName)),
|
||||||
.failedOperations[index]
|
|
||||||
.deviceName)),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
if (visitorBloc
|
if (visitorBloc.passwordStatus!.successOperations.isNotEmpty)
|
||||||
.passwordStatus!.successOperations.isNotEmpty)
|
|
||||||
Column(
|
Column(
|
||||||
children: [
|
children: [
|
||||||
const Text('Success Devices'),
|
const Text('Success Devices'),
|
||||||
@ -85,14 +79,12 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
.passwordStatus!.successOperations.length,
|
.passwordStatus!.successOperations.length,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
return Container(
|
return Container(
|
||||||
margin: EdgeInsets.all(5),
|
margin: const EdgeInsets.all(5),
|
||||||
decoration: containerDecoration,
|
decoration: containerDecoration,
|
||||||
height: 45,
|
height: 45,
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Text(visitorBloc
|
child: Text(visitorBloc.passwordStatus!
|
||||||
.passwordStatus!
|
.successOperations[index].deviceName)),
|
||||||
.successOperations[index]
|
|
||||||
.deviceName)),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -115,16 +107,14 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
child: BlocBuilder<VisitorPasswordBloc, VisitorPasswordState>(
|
child: BlocBuilder<VisitorPasswordBloc, VisitorPasswordState>(
|
||||||
builder: (BuildContext context, VisitorPasswordState state) {
|
builder: (BuildContext context, VisitorPasswordState state) {
|
||||||
final visitorBloc = BlocProvider.of<VisitorPasswordBloc>(context);
|
final visitorBloc = BlocProvider.of<VisitorPasswordBloc>(context);
|
||||||
bool isRepeat =
|
final isRepeat =
|
||||||
state is IsRepeatState ? state.repeat : visitorBloc.repeat;
|
state is IsRepeatState ? state.repeat : visitorBloc.repeat;
|
||||||
return AlertDialog(
|
return AlertDialog(
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
title: Text(
|
title: Text(
|
||||||
'Create visitor password',
|
'Create visitor password',
|
||||||
style: Theme.of(context).textTheme.headlineLarge!.copyWith(
|
style: Theme.of(context).textTheme.headlineLarge!.copyWith(
|
||||||
fontWeight: FontWeight.w400,
|
fontWeight: FontWeight.w400, fontSize: 24, color: Colors.black),
|
||||||
fontSize: 24,
|
|
||||||
color: Colors.black),
|
|
||||||
),
|
),
|
||||||
content: state is LoadingInitialState
|
content: state is LoadingInitialState
|
||||||
? const Center(child: CircularProgressIndicator())
|
? const Center(child: CircularProgressIndicator())
|
||||||
@ -310,11 +300,9 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
visitorBloc.accessTypeSelected ==
|
visitorBloc.accessTypeSelected ==
|
||||||
'Offline Password') {
|
'Offline Password') {
|
||||||
visitorBloc.add(SelectTimeEvent(
|
visitorBloc.add(SelectTimeEvent(
|
||||||
context: context,
|
context: context, isEffective: false));
|
||||||
isEffective: false));
|
|
||||||
} else {
|
} else {
|
||||||
visitorBloc.add(
|
visitorBloc.add(SelectTimeVisitorPassword(
|
||||||
SelectTimeVisitorPassword(
|
|
||||||
context: context,
|
context: context,
|
||||||
isStart: false,
|
isStart: false,
|
||||||
isRepeat: false));
|
isRepeat: false));
|
||||||
@ -326,31 +314,28 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
visitorBloc.accessTypeSelected ==
|
visitorBloc.accessTypeSelected ==
|
||||||
'Offline Password') {
|
'Offline Password') {
|
||||||
visitorBloc.add(SelectTimeEvent(
|
visitorBloc.add(SelectTimeEvent(
|
||||||
context: context,
|
context: context, isEffective: true));
|
||||||
isEffective: true));
|
|
||||||
} else {
|
} else {
|
||||||
visitorBloc.add(
|
visitorBloc.add(SelectTimeVisitorPassword(
|
||||||
SelectTimeVisitorPassword(
|
|
||||||
context: context,
|
context: context,
|
||||||
isStart: true,
|
isStart: true,
|
||||||
isRepeat: false));
|
isRepeat: false));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
firstString: (visitorBloc
|
firstString:
|
||||||
.usageFrequencySelected ==
|
(visitorBloc.usageFrequencySelected ==
|
||||||
'Periodic' &&
|
'Periodic' &&
|
||||||
visitorBloc.accessTypeSelected ==
|
visitorBloc.accessTypeSelected ==
|
||||||
'Offline Password')
|
'Offline Password')
|
||||||
? visitorBloc.effectiveTime
|
? visitorBloc.effectiveTime
|
||||||
: visitorBloc.startTimeAccess
|
: visitorBloc.startTimeAccess,
|
||||||
.toString(),
|
|
||||||
secondString: (visitorBloc
|
secondString: (visitorBloc
|
||||||
.usageFrequencySelected ==
|
.usageFrequencySelected ==
|
||||||
'Periodic' &&
|
'Periodic' &&
|
||||||
visitorBloc.accessTypeSelected ==
|
visitorBloc.accessTypeSelected ==
|
||||||
'Offline Password')
|
'Offline Password')
|
||||||
? visitorBloc.expirationTime
|
? visitorBloc.expirationTime
|
||||||
: visitorBloc.endTimeAccess.toString(),
|
: visitorBloc.endTimeAccess,
|
||||||
icon: Assets.calendarIcon),
|
icon: Assets.calendarIcon),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 10,
|
height: 10,
|
||||||
@ -410,8 +395,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
child: CupertinoSwitch(
|
child: CupertinoSwitch(
|
||||||
value: visitorBloc.repeat,
|
value: visitorBloc.repeat,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
visitorBloc
|
visitorBloc.add(ToggleRepeatEvent());
|
||||||
.add(ToggleRepeatEvent());
|
|
||||||
},
|
},
|
||||||
applyTheme: true,
|
applyTheme: true,
|
||||||
),
|
),
|
||||||
@ -442,8 +426,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
).then((listDevice) {
|
).then((listDevice) {
|
||||||
if (listDevice != null) {
|
if (listDevice != null) {
|
||||||
visitorBloc.selectedDevices =
|
visitorBloc.selectedDevices = listDevice;
|
||||||
listDevice;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -455,8 +438,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
.bodySmall!
|
.bodySmall!
|
||||||
.copyWith(
|
.copyWith(
|
||||||
fontWeight: FontWeight.w400,
|
fontWeight: FontWeight.w400,
|
||||||
color:
|
color: ColorsManager.whiteColors,
|
||||||
ColorsManager.whiteColors,
|
|
||||||
fontSize: 12),
|
fontSize: 12),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -495,37 +477,30 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (visitorBloc.forgetFormKey.currentState!.validate()) {
|
if (visitorBloc.forgetFormKey.currentState!.validate()) {
|
||||||
if (visitorBloc.selectedDevices.isNotEmpty) {
|
if (visitorBloc.selectedDevices.isNotEmpty) {
|
||||||
if (visitorBloc.usageFrequencySelected ==
|
if (visitorBloc.usageFrequencySelected == 'One-Time' &&
|
||||||
'One-Time' &&
|
visitorBloc.accessTypeSelected == 'Offline Password') {
|
||||||
visitorBloc.accessTypeSelected ==
|
|
||||||
'Offline Password') {
|
|
||||||
setPasswordFunction(context, size, visitorBloc);
|
setPasswordFunction(context, size, visitorBloc);
|
||||||
} else if (visitorBloc.usageFrequencySelected ==
|
} else if (visitorBloc.usageFrequencySelected ==
|
||||||
'Periodic' &&
|
'Periodic' &&
|
||||||
visitorBloc.accessTypeSelected ==
|
visitorBloc.accessTypeSelected == 'Offline Password') {
|
||||||
'Offline Password') {
|
|
||||||
if (visitorBloc.expirationTime != 'End Time' &&
|
if (visitorBloc.expirationTime != 'End Time' &&
|
||||||
visitorBloc.effectiveTime != 'Start Time') {
|
visitorBloc.effectiveTime != 'Start Time') {
|
||||||
setPasswordFunction(context, size, visitorBloc);
|
setPasswordFunction(context, size, visitorBloc);
|
||||||
} else {
|
} else {
|
||||||
visitorBloc.stateDialog(
|
visitorBloc.stateDialog(
|
||||||
context: context,
|
context: context,
|
||||||
message:
|
message: 'Please select Access Period to continue',
|
||||||
'Please select Access Period to continue',
|
|
||||||
title: 'Access Period');
|
title: 'Access Period');
|
||||||
}
|
}
|
||||||
} else if (visitorBloc.endTimeAccess.toString() !=
|
} else if (visitorBloc.endTimeAccess != 'End Time' &&
|
||||||
'End Time' &&
|
visitorBloc.startTimeAccess != 'Start Time') {
|
||||||
visitorBloc.startTimeAccess.toString() !=
|
|
||||||
'Start Time') {
|
|
||||||
if (visitorBloc.effectiveTimeTimeStamp != null &&
|
if (visitorBloc.effectiveTimeTimeStamp != null &&
|
||||||
visitorBloc.expirationTimeTimeStamp != null) {
|
visitorBloc.expirationTimeTimeStamp != null) {
|
||||||
if (isRepeat == true) {
|
if (isRepeat == true) {
|
||||||
if (visitorBloc.expirationTime != 'End Time' &&
|
if (visitorBloc.expirationTime != 'End Time' &&
|
||||||
visitorBloc.effectiveTime != 'Start Time' &&
|
visitorBloc.effectiveTime != 'Start Time' &&
|
||||||
visitorBloc.selectedDays.isNotEmpty) {
|
visitorBloc.selectedDays.isNotEmpty) {
|
||||||
setPasswordFunction(
|
setPasswordFunction(context, size, visitorBloc);
|
||||||
context, size, visitorBloc);
|
|
||||||
} else {
|
} else {
|
||||||
visitorBloc.stateDialog(
|
visitorBloc.stateDialog(
|
||||||
context: context,
|
context: context,
|
||||||
@ -539,15 +514,13 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
} else {
|
} else {
|
||||||
visitorBloc.stateDialog(
|
visitorBloc.stateDialog(
|
||||||
context: context,
|
context: context,
|
||||||
message:
|
message: 'Please select Access Period to continue',
|
||||||
'Please select Access Period to continue',
|
|
||||||
title: 'Access Period');
|
title: 'Access Period');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
visitorBloc.stateDialog(
|
visitorBloc.stateDialog(
|
||||||
context: context,
|
context: context,
|
||||||
message:
|
message: 'Please select Access Period to continue',
|
||||||
'Please select Access Period to continue',
|
|
||||||
title: 'Access Period');
|
title: 'Access Period');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -593,17 +566,17 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
content: SizedBox(
|
content: SizedBox(
|
||||||
height: size.height * 0.25,
|
height: size.height * 0.25,
|
||||||
child: Center(
|
child: const Center(
|
||||||
child:
|
child: CircularProgressIndicator(), // Display a loading spinner
|
||||||
CircularProgressIndicator(), // Display a loading spinner
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return AlertDialog(
|
return AlertDialog(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
|
backgroundColor: Colors.white,
|
||||||
content: SizedBox(
|
content: SizedBox(
|
||||||
height: size.height * 0.25,
|
height: size.height * 0.13,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Column(
|
Column(
|
||||||
@ -617,13 +590,16 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
width: 35,
|
width: 35,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
Text(
|
Text(
|
||||||
'Set Password',
|
'Set Password',
|
||||||
style: Theme.of(context)
|
style: Theme.of(context)
|
||||||
.textTheme
|
.textTheme
|
||||||
.headlineLarge!
|
.headlineLarge!
|
||||||
.copyWith(
|
.copyWith(
|
||||||
fontSize: 30,
|
fontSize: 24,
|
||||||
fontWeight: FontWeight.w400,
|
fontWeight: FontWeight.w400,
|
||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
),
|
),
|
||||||
@ -631,15 +607,6 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
const SizedBox(width: 15),
|
const SizedBox(width: 15),
|
||||||
Text(
|
|
||||||
'This action will update all of the selected\n door locks passwords in the property.\n\nAre you sure you want to continue?',
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
|
|
||||||
color: ColorsManager.grayColor,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
fontSize: 18,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -668,12 +635,12 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
decoration: containerDecoration,
|
decoration: containerDecoration,
|
||||||
width: size.width * 0.1,
|
width: size.width * 0.1,
|
||||||
child: DefaultButton(
|
child: DefaultButton(
|
||||||
|
backgroundColor: Color(0xff023DFE),
|
||||||
borderRadius: 8,
|
borderRadius: 8,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
if (visitorBloc.usageFrequencySelected == 'One-Time' &&
|
if (visitorBloc.usageFrequencySelected == 'One-Time' &&
|
||||||
visitorBloc.accessTypeSelected ==
|
visitorBloc.accessTypeSelected == 'Online Password') {
|
||||||
'Online Password') {
|
|
||||||
visitorBloc.add(OnlineOneTimePasswordEvent(
|
visitorBloc.add(OnlineOneTimePasswordEvent(
|
||||||
context: context,
|
context: context,
|
||||||
passwordName: visitorBloc.userNameController.text,
|
passwordName: visitorBloc.userNameController.text,
|
||||||
@ -681,8 +648,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
));
|
));
|
||||||
} else if (visitorBloc.usageFrequencySelected ==
|
} else if (visitorBloc.usageFrequencySelected ==
|
||||||
'Periodic' &&
|
'Periodic' &&
|
||||||
visitorBloc.accessTypeSelected ==
|
visitorBloc.accessTypeSelected == 'Online Password') {
|
||||||
'Online Password') {
|
|
||||||
visitorBloc.add(OnlineMultipleTimePasswordEvent(
|
visitorBloc.add(OnlineMultipleTimePasswordEvent(
|
||||||
passwordName: visitorBloc.userNameController.text,
|
passwordName: visitorBloc.userNameController.text,
|
||||||
email: visitorBloc.emailController.text,
|
email: visitorBloc.emailController.text,
|
||||||
@ -693,8 +659,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
));
|
));
|
||||||
} else if (visitorBloc.usageFrequencySelected ==
|
} else if (visitorBloc.usageFrequencySelected ==
|
||||||
'One-Time' &&
|
'One-Time' &&
|
||||||
visitorBloc.accessTypeSelected ==
|
visitorBloc.accessTypeSelected == 'Offline Password') {
|
||||||
'Offline Password') {
|
|
||||||
visitorBloc.add(OfflineOneTimePasswordEvent(
|
visitorBloc.add(OfflineOneTimePasswordEvent(
|
||||||
context: context,
|
context: context,
|
||||||
passwordName: visitorBloc.userNameController.text,
|
passwordName: visitorBloc.userNameController.text,
|
||||||
@ -702,8 +667,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
));
|
));
|
||||||
} else if (visitorBloc.usageFrequencySelected ==
|
} else if (visitorBloc.usageFrequencySelected ==
|
||||||
'Periodic' &&
|
'Periodic' &&
|
||||||
visitorBloc.accessTypeSelected ==
|
visitorBloc.accessTypeSelected == 'Offline Password') {
|
||||||
'Offline Password') {
|
|
||||||
visitorBloc.add(OfflineMultipleTimePasswordEvent(
|
visitorBloc.add(OfflineMultipleTimePasswordEvent(
|
||||||
passwordName: visitorBloc.userNameController.text,
|
passwordName: visitorBloc.userNameController.text,
|
||||||
email: visitorBloc.emailController.text,
|
email: visitorBloc.emailController.text,
|
||||||
@ -715,7 +679,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: Text(
|
child: Text(
|
||||||
'Ok',
|
'Confirm',
|
||||||
style: Theme.of(context).textTheme.bodySmall!.copyWith(
|
style: Theme.of(context).textTheme.bodySmall!.copyWith(
|
||||||
fontWeight: FontWeight.w400,
|
fontWeight: FontWeight.w400,
|
||||||
color: ColorsManager.whiteColors,
|
color: ColorsManager.whiteColors,
|
||||||
|
@ -13,13 +13,15 @@ import 'package:syncrow_web/utils/constants/api_const.dart';
|
|||||||
|
|
||||||
class DevicesManagementApi {
|
class DevicesManagementApi {
|
||||||
Future<List<AllDevicesModel>> fetchDevices(
|
Future<List<AllDevicesModel>> fetchDevices(
|
||||||
String projectId, {
|
String communityId, String spaceId, String projectId) async {
|
||||||
List<String>? spacesId,
|
|
||||||
}) async {
|
|
||||||
try {
|
try {
|
||||||
final response = await HTTPService().get(
|
final response = await HTTPService().get(
|
||||||
queryParameters: {if (spacesId != null) 'spaces': spacesId},
|
path: communityId.isNotEmpty && spaceId.isNotEmpty
|
||||||
path: ApiEndpoints.getAllDevices.replaceAll('{projectId}', projectId),
|
? ApiEndpoints.getSpaceDevices
|
||||||
|
.replaceAll('{spaceUuid}', spaceId)
|
||||||
|
.replaceAll('{communityUuid}', communityId)
|
||||||
|
.replaceAll('{projectId}', projectId)
|
||||||
|
: ApiEndpoints.getAllDevices.replaceAll('{projectId}', projectId),
|
||||||
showServerMessage: true,
|
showServerMessage: true,
|
||||||
expectedResponseModel: (json) {
|
expectedResponseModel: (json) {
|
||||||
List<dynamic> jsonData = json['data'];
|
List<dynamic> jsonData = json['data'];
|
||||||
@ -414,4 +416,5 @@ class DevicesManagementApi {
|
|||||||
);
|
);
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -84,6 +84,4 @@ abstract class ColorsManager {
|
|||||||
static const Color minBlue = Color(0xFF93AAFD);
|
static const Color minBlue = Color(0xFF93AAFD);
|
||||||
static const Color minBlueDot = Color(0xFF023DFE);
|
static const Color minBlueDot = Color(0xFF023DFE);
|
||||||
static const Color grey25 = Color(0xFFF9F9F9);
|
static const Color grey25 = Color(0xFFF9F9F9);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ abstract class ApiEndpoints {
|
|||||||
|
|
||||||
static const String getAllDevices = '/projects/{projectId}/devices';
|
static const String getAllDevices = '/projects/{projectId}/devices';
|
||||||
static const String getSpaceDevices =
|
static const String getSpaceDevices =
|
||||||
'/projects/{projectId}/devices';
|
'/projects/{projectId}/communities/{communityUuid}/spaces/{spaceUuid}/devices';
|
||||||
static const String getDeviceStatus = '/devices/{uuid}/functions/status';
|
static const String getDeviceStatus = '/devices/{uuid}/functions/status';
|
||||||
static const String getBatchStatus = '/devices/batch';
|
static const String getBatchStatus = '/devices/batch';
|
||||||
|
|
||||||
|
@ -394,6 +394,7 @@ class Assets {
|
|||||||
static const String emptyBox = 'assets/icons/empty_box.png';
|
static const String emptyBox = 'assets/icons/empty_box.png';
|
||||||
static const String completeProcessIcon =
|
static const String completeProcessIcon =
|
||||||
'assets/icons/compleate_process_icon.svg';
|
'assets/icons/compleate_process_icon.svg';
|
||||||
|
static const String completedDoneIcon = 'assets/images/completed_done.svg';
|
||||||
static const String currentProcessIcon =
|
static const String currentProcessIcon =
|
||||||
'assets/icons/current_process_icon.svg';
|
'assets/icons/current_process_icon.svg';
|
||||||
static const String uncomplete_ProcessIcon =
|
static const String uncomplete_ProcessIcon =
|
||||||
@ -505,5 +506,6 @@ class Assets {
|
|||||||
static const String aqiAirQuality = 'assets/icons/aqi_air_quality.svg';
|
static const String aqiAirQuality = 'assets/icons/aqi_air_quality.svg';
|
||||||
static const String temperatureAqiSidebar = 'assets/icons/thermometer.svg';
|
static const String temperatureAqiSidebar = 'assets/icons/thermometer.svg';
|
||||||
static const String humidityAqiSidebar = 'assets/icons/humidity.svg';
|
static const String humidityAqiSidebar = 'assets/icons/humidity.svg';
|
||||||
static const String autocadOccupancyImage = 'assets/images/autocad_occupancy_image.png';
|
static const String autocadOccupancyImage =
|
||||||
|
'assets/images/autocad_occupancy_image.png';
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user