import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/modules/asset_inventory_module/provider/asset_inventory_provider.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import '../../../extensions/text_extensions.dart'; import '../../../new_views/app_style/app_text_style.dart'; class LookUpAutoCompleteField extends StatefulWidget { final String initialValue; final String label; final num? assetId; final bool forAssetName; final bool forSupplier; final bool clearAfterPick, isManufacturer; final Function(Lookup) onPick; final Function(String) onChanged; //need to pass directly url const LookUpAutoCompleteField( {Key? key, this.isManufacturer = false, required this.initialValue, required this.label, this.forAssetName = false, this.forSupplier = false, this.assetId, required this.onPick, this.clearAfterPick = true, required this.onChanged}) : super(key: key); @override _AutoCompletePartsFieldState createState() => _AutoCompletePartsFieldState(); } class _AutoCompletePartsFieldState extends State { AssetInventoryProvider? assetInventoryProvider; late TextEditingController _controller; @override void initState() { _controller = TextEditingController(text: widget.initialValue); super.initState(); } @override void didUpdateWidget(covariant LookUpAutoCompleteField oldWidget) { if (widget.initialValue != oldWidget.initialValue) { _controller = TextEditingController(text: widget.initialValue); } super.didUpdateWidget(oldWidget); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { assetInventoryProvider ??= Provider.of(context); final border = UnderlineInputBorder(borderSide: BorderSide.none, borderRadius: BorderRadius.circular(10)); return Container( decoration: BoxDecoration( color: AppColor.background(context), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), child: Autocomplete( optionsBuilder: (TextEditingValue textEditingValue) async { if (textEditingValue.text.isEmpty) { return const Iterable.empty(); } return (await assetInventoryProvider!.getAutoCompleteDetails(query: textEditingValue.text, isManufacturer: widget.isManufacturer, type: widget.forAssetName?1:widget.forSupplier?2:0)); }, displayStringForOption: (Lookup option) => option.name ?? "", fieldViewBuilder: (BuildContext context, TextEditingController fieldTextEditingController, FocusNode fieldFocusNode, VoidCallback onFieldSubmitted) { return TextField( controller: _controller, focusNode: fieldFocusNode, style: AppTextStyles.bodyText.copyWith(color: AppColor.black10), textAlign: TextAlign.start, decoration: InputDecoration( border: border, disabledBorder: border, focusedBorder: border, enabledBorder: border, errorBorder: border, contentPadding: EdgeInsets.symmetric(vertical: 8.toScreenHeight, horizontal: 16.toScreenWidth), constraints: const BoxConstraints(), suffixIconConstraints: const BoxConstraints(minWidth: 0), filled: true, fillColor: AppColor.fieldBgColor(context), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), labelText: widget.label, labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)), ), textInputAction: TextInputAction.search, onChanged: (text) { widget.onChanged(text); fieldTextEditingController.text = text; }, onSubmitted: (String value) { onFieldSubmitted(); }, ); }, onSelected: (Lookup selection) { if (widget.clearAfterPick) { _controller.clear(); } else { _controller.text = selection.name ?? ''; } widget.onPick(selection); }, ), ); } }