Skip to content

Commit 7e497ef

Browse files
committed
feat(app_configuration): automatically select text in TextEditingController
- Add text selection logic to UserController initialization for user preference limits - Implement similar text selection for feed decorator and ad config forms - Ensure cursor is positioned at the end of the text for all relevant fields
1 parent e6a55d1 commit 7e497ef

File tree

1 file changed

+140
-46
lines changed

1 file changed

+140
-46
lines changed

lib/app_configuration/view/app_configuration_page.dart

Lines changed: 140 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -764,47 +764,75 @@ class _UserPreferenceLimitsFormState extends State<_UserPreferenceLimitsForm> {
764764
case AppUserRole.guestUser:
765765
_followedItemsLimitController = TextEditingController(
766766
text: config.guestFollowedItemsLimit.toString(),
767-
);
767+
)..selection = TextSelection.collapsed(
768+
offset: config.guestFollowedItemsLimit.toString().length,
769+
);
768770
_savedHeadlinesLimitController = TextEditingController(
769771
text: config.guestSavedHeadlinesLimit.toString(),
770-
);
772+
)..selection = TextSelection.collapsed(
773+
offset: config.guestSavedHeadlinesLimit.toString().length,
774+
);
771775
case AppUserRole.standardUser:
772776
_followedItemsLimitController = TextEditingController(
773777
text: config.authenticatedFollowedItemsLimit.toString(),
774-
);
778+
)..selection = TextSelection.collapsed(
779+
offset: config.authenticatedFollowedItemsLimit.toString().length,
780+
);
775781
_savedHeadlinesLimitController = TextEditingController(
776782
text: config.authenticatedSavedHeadlinesLimit.toString(),
777-
);
783+
)..selection = TextSelection.collapsed(
784+
offset: config.authenticatedSavedHeadlinesLimit.toString().length,
785+
);
778786
case AppUserRole.premiumUser:
779787
_followedItemsLimitController = TextEditingController(
780788
text: config.premiumFollowedItemsLimit.toString(),
781-
);
789+
)..selection = TextSelection.collapsed(
790+
offset: config.premiumFollowedItemsLimit.toString().length,
791+
);
782792
_savedHeadlinesLimitController = TextEditingController(
783793
text: config.premiumSavedHeadlinesLimit.toString(),
784-
);
794+
)..selection = TextSelection.collapsed(
795+
offset: config.premiumSavedHeadlinesLimit.toString().length,
796+
);
785797
}
786798
}
787799

788800
void _updateControllers() {
789801
final config = widget.remoteConfig.userPreferenceConfig;
790802
switch (widget.userRole) {
791803
case AppUserRole.guestUser:
792-
_followedItemsLimitController.text = config.guestFollowedItemsLimit
793-
.toString();
794-
_savedHeadlinesLimitController.text = config.guestSavedHeadlinesLimit
795-
.toString();
804+
_followedItemsLimitController.text =
805+
config.guestFollowedItemsLimit.toString();
806+
_followedItemsLimitController.selection = TextSelection.collapsed(
807+
offset: _followedItemsLimitController.text.length,
808+
);
809+
_savedHeadlinesLimitController.text =
810+
config.guestSavedHeadlinesLimit.toString();
811+
_savedHeadlinesLimitController.selection = TextSelection.collapsed(
812+
offset: _savedHeadlinesLimitController.text.length,
813+
);
796814
case AppUserRole.standardUser:
797-
_followedItemsLimitController.text = config
798-
.authenticatedFollowedItemsLimit
799-
.toString();
800-
_savedHeadlinesLimitController.text = config
801-
.authenticatedSavedHeadlinesLimit
802-
.toString();
815+
_followedItemsLimitController.text =
816+
config.authenticatedFollowedItemsLimit.toString();
817+
_followedItemsLimitController.selection = TextSelection.collapsed(
818+
offset: _followedItemsLimitController.text.length,
819+
);
820+
_savedHeadlinesLimitController.text =
821+
config.authenticatedSavedHeadlinesLimit.toString();
822+
_savedHeadlinesLimitController.selection = TextSelection.collapsed(
823+
offset: _savedHeadlinesLimitController.text.length,
824+
);
803825
case AppUserRole.premiumUser:
804-
_followedItemsLimitController.text = config.premiumFollowedItemsLimit
805-
.toString();
806-
_savedHeadlinesLimitController.text = config.premiumSavedHeadlinesLimit
807-
.toString();
826+
_followedItemsLimitController.text =
827+
config.premiumFollowedItemsLimit.toString();
828+
_followedItemsLimitController.selection = TextSelection.collapsed(
829+
offset: _followedItemsLimitController.text.length,
830+
);
831+
_savedHeadlinesLimitController.text =
832+
config.premiumSavedHeadlinesLimit.toString();
833+
_savedHeadlinesLimitController.selection = TextSelection.collapsed(
834+
offset: _savedHeadlinesLimitController.text.length,
835+
);
808836
}
809837
}
810838

@@ -1002,17 +1030,24 @@ class _FeedDecoratorFormState extends State<_FeedDecoratorForm> {
10021030
void _initializeControllers() {
10031031
final decoratorConfig =
10041032
widget.remoteConfig.feedDecoratorConfig[widget.decoratorType]!;
1005-
_itemsToDisplayController = TextEditingController(
1006-
text: decoratorConfig.itemsToDisplay?.toString() ?? '',
1007-
);
1033+
_itemsToDisplayController = TextEditingController(
1034+
text: decoratorConfig.itemsToDisplay?.toString() ?? '',
1035+
)..selection = TextSelection.collapsed(
1036+
offset: decoratorConfig.itemsToDisplay?.toString().length ?? 0,
1037+
);
10081038

10091039
_roleControllers = {
10101040
for (final role in AppUserRole.values)
10111041
role: TextEditingController(
10121042
text:
10131043
decoratorConfig.visibleTo[role]?.daysBetweenViews.toString() ??
10141044
'',
1015-
),
1045+
)..selection = TextSelection.collapsed(
1046+
offset: decoratorConfig.visibleTo[role]?.daysBetweenViews
1047+
.toString()
1048+
.length ??
1049+
0,
1050+
),
10161051
};
10171052
}
10181053

@@ -1021,9 +1056,15 @@ class _FeedDecoratorFormState extends State<_FeedDecoratorForm> {
10211056
widget.remoteConfig.feedDecoratorConfig[widget.decoratorType]!;
10221057
_itemsToDisplayController.text =
10231058
decoratorConfig.itemsToDisplay?.toString() ?? '';
1059+
_itemsToDisplayController.selection = TextSelection.collapsed(
1060+
offset: _itemsToDisplayController.text.length,
1061+
);
10241062
for (final role in AppUserRole.values) {
10251063
_roleControllers[role]?.text =
10261064
decoratorConfig.visibleTo[role]?.daysBetweenViews.toString() ?? '';
1065+
_roleControllers[role]?.selection = TextSelection.collapsed(
1066+
offset: _roleControllers[role]?.text.length ?? 0,
1067+
);
10271068
}
10281069
}
10291070

@@ -1212,41 +1253,67 @@ class _AdConfigFormState extends State<_AdConfigForm> {
12121253
case AppUserRole.guestUser:
12131254
_adFrequencyController = TextEditingController(
12141255
text: adConfig.guestAdFrequency.toString(),
1215-
);
1256+
)..selection = TextSelection.collapsed(
1257+
offset: adConfig.guestAdFrequency.toString().length,
1258+
);
12161259
_adPlacementIntervalController = TextEditingController(
12171260
text: adConfig.guestAdPlacementInterval.toString(),
1218-
);
1261+
)..selection = TextSelection.collapsed(
1262+
offset: adConfig.guestAdPlacementInterval.toString().length,
1263+
);
12191264
_articlesToReadBeforeShowingInterstitialAdsController =
12201265
TextEditingController(
12211266
text: adConfig.guestArticlesToReadBeforeShowingInterstitialAds
12221267
.toString(),
1223-
);
1268+
)..selection = TextSelection.collapsed(
1269+
offset: adConfig.guestArticlesToReadBeforeShowingInterstitialAds
1270+
.toString()
1271+
.length,
1272+
);
12241273
case AppUserRole.standardUser:
12251274
_adFrequencyController = TextEditingController(
12261275
text: adConfig.authenticatedAdFrequency.toString(),
1227-
);
1276+
)..selection = TextSelection.collapsed(
1277+
offset: adConfig.authenticatedAdFrequency.toString().length,
1278+
);
12281279
_adPlacementIntervalController = TextEditingController(
12291280
text: adConfig.authenticatedAdPlacementInterval.toString(),
1230-
);
1281+
)..selection = TextSelection.collapsed(
1282+
offset: adConfig.authenticatedAdPlacementInterval.toString().length,
1283+
);
12311284
_articlesToReadBeforeShowingInterstitialAdsController =
12321285
TextEditingController(
12331286
text: adConfig
12341287
.standardUserArticlesToReadBeforeShowingInterstitialAds
12351288
.toString(),
1236-
);
1289+
)..selection = TextSelection.collapsed(
1290+
offset: adConfig
1291+
.standardUserArticlesToReadBeforeShowingInterstitialAds
1292+
.toString()
1293+
.length,
1294+
);
12371295
case AppUserRole.premiumUser:
12381296
_adFrequencyController = TextEditingController(
12391297
text: adConfig.premiumAdFrequency.toString(),
1240-
);
1298+
)..selection = TextSelection.collapsed(
1299+
offset: adConfig.premiumAdFrequency.toString().length,
1300+
);
12411301
_adPlacementIntervalController = TextEditingController(
12421302
text: adConfig.premiumAdPlacementInterval.toString(),
1243-
);
1303+
)..selection = TextSelection.collapsed(
1304+
offset: adConfig.premiumAdPlacementInterval.toString().length,
1305+
);
12441306
_articlesToReadBeforeShowingInterstitialAdsController =
12451307
TextEditingController(
12461308
text: adConfig
12471309
.premiumUserArticlesToReadBeforeShowingInterstitialAds
12481310
.toString(),
1249-
);
1311+
)..selection = TextSelection.collapsed(
1312+
offset: adConfig
1313+
.premiumUserArticlesToReadBeforeShowingInterstitialAds
1314+
.toString()
1315+
.length,
1316+
);
12501317
}
12511318
}
12521319

@@ -1255,28 +1322,55 @@ class _AdConfigFormState extends State<_AdConfigForm> {
12551322
switch (widget.userRole) {
12561323
case AppUserRole.guestUser:
12571324
_adFrequencyController.text = adConfig.guestAdFrequency.toString();
1258-
_adPlacementIntervalController.text = adConfig.guestAdPlacementInterval
1259-
.toString();
1260-
_articlesToReadBeforeShowingInterstitialAdsController.text = adConfig
1261-
.guestArticlesToReadBeforeShowingInterstitialAds
1262-
.toString();
1325+
_adFrequencyController.selection = TextSelection.collapsed(
1326+
offset: _adFrequencyController.text.length,
1327+
);
1328+
_adPlacementIntervalController.text =
1329+
adConfig.guestAdPlacementInterval.toString();
1330+
_adPlacementIntervalController.selection = TextSelection.collapsed(
1331+
offset: _adPlacementIntervalController.text.length,
1332+
);
1333+
_articlesToReadBeforeShowingInterstitialAdsController.text =
1334+
adConfig.guestArticlesToReadBeforeShowingInterstitialAds.toString();
1335+
_articlesToReadBeforeShowingInterstitialAdsController.selection =
1336+
TextSelection.collapsed(
1337+
offset: _articlesToReadBeforeShowingInterstitialAdsController.text.length,
1338+
);
12631339
case AppUserRole.standardUser:
1264-
_adFrequencyController.text = adConfig.authenticatedAdFrequency
1265-
.toString();
1266-
_adPlacementIntervalController.text = adConfig
1267-
.authenticatedAdPlacementInterval
1268-
.toString();
1340+
_adFrequencyController.text =
1341+
adConfig.authenticatedAdFrequency.toString();
1342+
_adFrequencyController.selection = TextSelection.collapsed(
1343+
offset: _adFrequencyController.text.length,
1344+
);
1345+
_adPlacementIntervalController.text =
1346+
adConfig.authenticatedAdPlacementInterval.toString();
1347+
_adPlacementIntervalController.selection = TextSelection.collapsed(
1348+
offset: _adPlacementIntervalController.text.length,
1349+
);
12691350
_articlesToReadBeforeShowingInterstitialAdsController.text = adConfig
12701351
.standardUserArticlesToReadBeforeShowingInterstitialAds
12711352
.toString();
1353+
_articlesToReadBeforeShowingInterstitialAdsController.selection =
1354+
TextSelection.collapsed(
1355+
offset: _articlesToReadBeforeShowingInterstitialAdsController.text.length,
1356+
);
12721357
case AppUserRole.premiumUser:
12731358
_adFrequencyController.text = adConfig.premiumAdFrequency.toString();
1274-
_adPlacementIntervalController.text = adConfig
1275-
.premiumAdPlacementInterval
1276-
.toString();
1359+
_adFrequencyController.selection = TextSelection.collapsed(
1360+
offset: _adFrequencyController.text.length,
1361+
);
1362+
_adPlacementIntervalController.text =
1363+
adConfig.premiumAdPlacementInterval.toString();
1364+
_adPlacementIntervalController.selection = TextSelection.collapsed(
1365+
offset: _adPlacementIntervalController.text.length,
1366+
);
12771367
_articlesToReadBeforeShowingInterstitialAdsController.text = adConfig
12781368
.premiumUserArticlesToReadBeforeShowingInterstitialAds
12791369
.toString();
1370+
_articlesToReadBeforeShowingInterstitialAdsController.selection =
1371+
TextSelection.collapsed(
1372+
offset: _articlesToReadBeforeShowingInterstitialAdsController.text.length,
1373+
);
12801374
}
12811375
}
12821376

0 commit comments

Comments
 (0)