]> gitweb.hamatoma.de Git - flutter_bones.git/commitdiff
daily work
authorHamatoma <author@hamatoma.de>
Tue, 3 Nov 2020 17:50:55 +0000 (18:50 +0100)
committerHamatoma <author@hamatoma.de>
Tue, 3 Nov 2020 17:50:55 +0000 (18:50 +0100)
lib/src/model/combo_base_model.dart
lib/src/model/db_reference_model.dart
lib/src/model/standard/user_model.dart
lib/src/page/user/user_list_page.dart
lib/src/private/bsettings.dart
lib/src/widget/callback_controller_bones.dart
lib/src/widget/page_controller_bones.dart
lib/src/widget/view.dart
lib/src/widget/widget_list.dart
test/persistence_cache_test.dart

index 264644adc9d2b105935c13b9dfb8430d14d2b428..f7a6c266bae5c4a908741b77427189cc8ecf05a8 100644 (file)
@@ -45,7 +45,7 @@ abstract class ComboBaseModel extends FieldModel {
     texts = parseStringList('texts', map);
     listType =
         parseEnum<ComboboxListType>('listType', map, ComboboxListType.values);
-    listOption = parseString('listOption', map) ?? '';
+    listOption = parseString('listOption', map);
     values = parseValueList('values', map, dataType);
     switch (listType) {
       case ComboboxListType.undef:
@@ -85,37 +85,48 @@ abstract class ComboBaseModel extends FieldModel {
   /// and [values].
   static ComboboxData createByType(
       DataType dataType, List<String> texts, Iterable values) {
-    ComboboxData rc;
-    switch (dataType) {
-      case DataType.bool:
-        rc = ComboboxData<bool>(texts, values);
-        break;
-      case DataType.currency:
-      case DataType.int:
-      case DataType.reference:
-        rc = ComboboxData<int>(texts, values);
-        break;
-      case DataType.date:
-      case DataType.dateTime:
-        rc = ComboboxData<DateTime>(texts, values);
-        break;
-      case DataType.float:
-        rc = ComboboxData<double>(texts, values);
-        break;
-      case DataType.string:
-        rc = ComboboxData<String>(texts, values);
-        break;
+    if (values != null && values.length == 0) {
+      values = null;
     }
+    ComboboxData rc = ComboboxData(texts, values);
     return rc;
   }
 }
 
-class ComboboxData<T> {
+class ComboboxData {
   final List<String> texts;
-  final List<T> values;
+  List _values;
   WaitState waitState;
 
-  ComboboxData(this.texts, this.values, [this.waitState = WaitState.undef]);
+  ComboboxData(this.texts, this._values, [this.waitState = WaitState.undef]);
+
+  /// Returns the length of [_values].
+  int get valuesLength => _values == null ? 0 : _values.length;
+
+  /// Adds a [value] to the [values].
+  void addValue(dynamic value) {
+    if (_values == null) {
+      _values = [value];
+    } else {
+      _values.add(value);
+    }
+  }
+
+  /// Adds a [value] to the [values].
+  void insertValue(int index, dynamic value) {
+    if (_values == null) {
+      _values = [value];
+    } else {
+      _values.insert(index, value);
+    }
+  }
+
+  /// Returns the value at the [index] or null on error.
+  dynamic value(int index) {
+    final rc =
+        _values == null || index >= _values.length ? null : _values[index];
+    return rc;
+  }
 }
 
 enum ComboboxListType {
index aa74170859726075e8b4aa3ba753d5f5e73b8ee8..48137b53867e09de5cd5cc1c5921ef6a38756686 100644 (file)
@@ -65,6 +65,16 @@ class DbReferenceModel extends ComboBaseModel {
     maxSize = parseInt('maxSize', map, required: false);
     rows = parseInt('rows', map, required: false);
     options = parseOptions('options', map);
+    label ??= column.label;
+    toolTip ??= column.toolTip;
+    filterType ??= column.filterType;
+    options = parseOptions('options', map);
+    dataType ??= column.dataType;
+    texts ??= column.texts;
+    values ??= column.values;
+    listOption ??= column.listOption;
+    listType ??= column.listType;
     checkOptionsByRegExpr(options, regExprOptions);
+    options += column.options;
   }
 }
index 9fcb1c9adf289caa6d91dc89e4481676a6e50d68..98c68b76bbc0c7f3df208ee793ecc3e6c25db33e 100644 (file)
@@ -102,7 +102,7 @@ class UserModel extends ModuleModel {
                 "name": "user_name",
                 "column": "user_name",
                 "toolTip":
-                    "Filter bezüglich des Names der anzuzeigenden Einträge: Joker '*' (beliebiger String) ist erlaubt."
+                    "Filter bezüglich des Namens der anzuzeigenden Einträge: Joker '*' (beliebiger String) ist erlaubt."
               },
               {
                 "widgetType": "dbReference",
index 84832de36b159286f6dea9197e3cd44f0c137e04..3ff9de216330ac492b72291d29491785c7a34e02 100644 (file)
@@ -1,7 +1,6 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_bones/src/widget/callback_controller_bones.dart';
 
-import '../../widget/widget_list.dart';
 import '../../widget/list_form.dart';
 import '../application_data.dart';
 import 'user_controller.dart';
@@ -29,7 +28,6 @@ class UserListPageState extends State<UserListPage> {
       GlobalKey<FormState>(debugLabel: 'user_list');
   Iterable<dynamic> rowsDeprecated;
   UserController controller;
-  WidgetList filters;
 
   UserListPageState(this.applicationData);
 
@@ -88,7 +86,7 @@ class UserListPageState extends State<UserListPage> {
             ),
           ]),
         ],
-        filters: filters,
+        filters: controller.widgetList,
         errorMessage:
             applicationData.lastErrorMessage(controller.page.fullName()),
       ),
index aeb84fa15365cc115b7d6f5cad986613f6a6f218..4879c64cf86f536248a6222dcd6f3b079c2e5cba 100644 (file)
@@ -10,7 +10,7 @@ class BSettings {
   Persistence persistence;
   static BSettings lastInstance;
 
-  /// Returns the singleton of VSetting.
+  /// Returns the singleton of BSetting.
   factory BSettings() {
     final map = {
       'form.card.padding': '16.0',
index 300d0e6a54cadf30d1bbf80cb37ea630a0a02e23..30909242371022efd7b54dadb465104d39c86e79 100644 (file)
@@ -1,6 +1,5 @@
 import 'package:flutter/material.dart';
 
-import '../model/model_types.dart';
 import '../model/combobox_model.dart';
 import '../model/combo_base_model.dart';
 import '../model/field_model.dart';
@@ -19,7 +18,7 @@ abstract class CallbackControllerBones {
   void buildRows();
 
   /// Returns the [ComboboxData] (texts and values) of the [ComboboxModel] named [name].
-  ComboboxData comboboxData(String name, DataType dataType);
+  ComboboxData comboboxData(String name);
 
   /// Frees all resources.
   void dispose();
index 48a13b2cb2c577465f14151ab177463da468fe98..a100337536ff05ded4d835eb7d9604d7535019a1 100644 (file)
@@ -86,64 +86,38 @@ class PageControllerBones implements CallbackControllerBones {
   /// Completes database based components to the model, e.g. the list for
   /// comboboxes.
   void completeModelByPersistence(WidgetModel model) {
-    if (model is ComboBaseModel) {
+    if (model is ComboBaseModel && model.listType != null) {
       if (model.data == null) {
         if (model.listType == ComboboxListType.explicite) {
           model.data = ComboBaseModel.createByType(
               model.dataType, model.texts, model.values);
           model.data.waitState = WaitState.ready;
         } else {
-          model.data = comboboxData(model.name, model.dataType);
+          model.data = comboboxData(model.name);
         }
       }
     }
   }
 
-  @override
-  ComboboxData comboboxData(String name, DataType dataType) {
-    ComboboxData rc;
-    switch (dataType) {
-      case DataType.bool:
-        rc = comboboxDataByType<bool>(name);
-        break;
-      case DataType.currency:
-      case DataType.int:
-      case DataType.reference:
-        rc = comboboxDataByType<int>(name);
-        break;
-      case DataType.date:
-      case DataType.dateTime:
-        rc = comboboxDataByType<DateTime>(name);
-        break;
-      case DataType.float:
-        rc = comboboxDataByType<double>(name);
-        break;
-      case DataType.string:
-        comboboxDataByType<String>(name);
-        break;
-    }
-    return rc;
-  }
-
-  ComboboxData<T> comboboxDataByType<T>(String name) {
+  ComboboxData comboboxData(String name) {
     ComboboxData rc = comboboxDataMap.containsKey(name)
         ? comboboxDataMap[name]
-        : ComboboxData<T>([], []);
+        : ComboboxData([], null);
     comboboxDataMap[name] = rc;
     if (rc.waitState == WaitState.undef) {
       ComboBaseModel model = page.fieldByName(name) as ComboBaseModel;
       if (model != null) {
         switch (model.listType) {
           case ComboboxListType.explicite:
-            rc = ComboboxData<T>(model.texts, model.values, WaitState.ready);
+            rc = ComboboxData(model.texts, model.values, WaitState.ready);
             comboboxDataMap[name] = rc;
             break;
           case ComboboxListType.undef:
-            rc = ComboboxData<T>([], [], WaitState.ready);
+            rc = ComboboxData([], [], WaitState.ready);
             comboboxDataMap[name] = rc;
             break;
           case ComboboxListType.dbColumn:
-            comboboxDataDb<T>(model, rc);
+            comboboxDataDb(model, rc);
             break;
           case ComboboxListType.configuration:
             break;
@@ -153,28 +127,32 @@ class PageControllerBones implements CallbackControllerBones {
     return rc;
   }
 
-  void comboboxDataDb<T>(ComboBaseModel model, ComboboxData<T> data) {
-    // example: role.list;role_displayname role_id;:role_name=% :excluded=0'
-    final parts = model.listOption.split(';');
-    final moduleName = parts[0].split('.');
-    final cols = parts[1].split(' ');
+  void comboboxDataDb(ComboBaseModel model, ComboboxData data) {
+    // example: xxx.role.list;role_displayname role_id;:role_name=% :excluded=0'
+    final keyColumnsParams = model.listOption.split(';');
+    final nameModuleSql = keyColumnsParams[0].split('.');
+    final cols = keyColumnsParams[1].split(' ');
     final params = <String, dynamic>{};
-    if (parts.length > 2 && parts[2].isNotEmpty) {
-      parts[2].split(' ').forEach((element) {
+    if (keyColumnsParams.length > 2 && keyColumnsParams[2].isNotEmpty) {
+      keyColumnsParams[2].split(' ').forEach((element) {
         final keyValue = element.split('=');
         params[keyValue[0]] = keyValue[1];
       });
     }
     applicationData.persistence
-        .list(module: moduleName[0], sqlName: moduleName[1], params: params)
+        .list(module: nameModuleSql[1], sqlName: nameModuleSql[2], params: params)
         .then((rows) {
       rows.forEach((row) {
         data.texts.add(row[cols[0]]);
-        data.values.add(row[cols[1]]);
+        var value = row[cols[1]];
+        if (value is String){
+          value = StringHelper.fromString(value, model.dataType);
+        }
+        data.addValue(value);
       });
       if (model.hasOption('undef')) {
         data.texts.insert(0, '-');
-        data.values.insert(0, null);
+        data.insertValue(0, null);
       }
       data.waitState = WaitState.ready;
       redraw(RedrawReason.redraw);
index bd650d98dd657ebbab0a7fa4ad2b7cb8edd17a95..e297f35365892d86b94554a61cf67f676f1996f8 100644 (file)
@@ -95,7 +95,7 @@ class View {
         rc = comboboxByType<double>(model, controller, initialValue);
         break;
       case DataType.string:
-        comboboxByType<String>(model, controller, initialValue);
+        rc = comboboxByType<String>(model, controller, initialValue);
         break;
     }
     return rc;
@@ -105,13 +105,20 @@ class View {
   /// with an [initialValue].
   Widget comboboxByType<T>(
       FieldModel model, CallbackControllerBones controller, initialValue) {
-    ComboboxData<T> comboboxData = (model as ComboBaseModel).data;
+    ComboboxData comboboxData = (model as ComboBaseModel).data;
     final items = <DropdownMenuItem<T>>[];
-    for (var ix = 0; ix < comboboxData.texts.length; ix++) {
+    if (comboboxData == null || comboboxData.texts.length == 0) {
       items.add(DropdownMenuItem(
           onTap: controller.getOnTap(model.name, controller),
-          value: comboboxData.values[ix],
-          child: Text(comboboxData.texts[ix])));
+          value: null,
+          child: Text('-')));
+    } else {
+      for (var ix = 0; ix < comboboxData.texts.length; ix++) {
+        items.add(DropdownMenuItem(
+            onTap: controller.getOnTap(model.name, controller),
+            value: comboboxData.value(ix),
+            child: Text(comboboxData.texts[ix])));
+      }
     }
     final rc = DropdownButtonFormBone(
       model.name,
index fd861eec108e7808f46b91cb04a4c956f43b80c5..434367a64f00cdc1696fe7f32dec7b8bff11e751 100644 (file)
@@ -109,7 +109,7 @@ class WidgetList {
       again = false;
       for (var model in waitCandidates) {
         if (model is ComboBaseModel) {
-          data = controller.comboboxData(model.listOption, model.dataType);
+          data = controller.comboboxData(model.listOption);
           if (data != null && data.waitState == WaitState.ready) {
             model.data = data;
             waitCandidates.remove(model);
index 69e017e20761f059877ab15f0ff62cbac0161523..c05a1f42eada96a84b1ab1d5825e4fe008eaf052 100644 (file)
@@ -45,11 +45,11 @@ void main() async {
       expect(logger.errors.length, equals(0));
       expect(data, isNotNull);
       expect(data.texts.length, greaterThan(4));
-      expect(data.texts.length, equals(data.values.length));
+      expect(data.texts.length, equals(data.valuesLength));
       expect(data2, isNotNull);
       expect(data2.texts.length, greaterThan(4));
-      expect(data2.texts.length, equals(data2.values.length));
-      expect(data.texts.length, equals(data2.values.length + 1));
+      expect(data2.texts.length, equals(data2.valuesLength));
+      expect(data.texts.length, equals(data2.valuesLength + 1));
       expect(cache.leastReasentlyUsed.length, equals(2));
       const key3 = 'id3.role.list;role_name role_id;:role_name=%';
       var data3 = cache.combobox(key3, hasUndef: false);