]> gitweb.hamatoma.de Git - flutter_bones.git/commitdiff
daily work: role+user+config work
authorHamatoma <author@hamatoma.de>
Thu, 29 Oct 2020 18:25:29 +0000 (19:25 +0100)
committerHamatoma <author@hamatoma.de>
Thu, 29 Oct 2020 23:06:46 +0000 (00:06 +0100)
15 files changed:
data/ddl/configuration.sql
data/rest/configuration.yaml
data/rest/role.yaml
data/rest/user.yaml
lib/app.dart
lib/src/model/column_model.dart
lib/src/model/db_reference_model.dart
lib/src/model/field_model.dart
lib/src/model/model_base.dart
lib/src/model/module_model.dart
lib/src/model/standard/configuration_model.dart
lib/src/model/standard/user_model.dart
lib/src/page/configuration/configuration_change_page.dart
lib/src/widget/filter_set.dart
lib/src/widget/view.dart

index dd4958d325e4efb8bd68a1ae9f42a36cce5727d0..25b196ac258f60357951b7b26f5098bb5ebc0638 100644 (file)
@@ -1,7 +1,7 @@
 DROP TABLE IF EXISTS configuration;
 CREATE TABLE configuration (
   configuration_id INT(10) UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
-  configuration_scope VARCHAR(64) UNIQUE NOT NULL,
+  configuration_scope VARCHAR(64) NOT NULL,
   configuration_property VARCHAR(64),
   configuration_order INT(10),
   configuration_type VARCHAR(16),
index 33b419abf74a0e55696fd5dfa7382154ba827b45..98f5ae0bc1c0bd0c508de01afc21ad383a362114 100644 (file)
@@ -1,6 +1,6 @@
 ---
 # configuration of the bones backend for configuration:
-created: 2020.10.20 23:16:54
+created: 2020.10.29 22:35:03
 author: flutter_bones.module_model.exportSqlBackend()
 version: 1.0.0
 modules:
@@ -21,10 +21,7 @@ modules:
       - name: record
         type: record
         sql: "SELECT * from configuration WHERE configuration_id=:configuration_id;"
-      - name: by_configuration_scope
-        type: record
-        sql: "SELECT * from configuration WHERE configuration_scope=:configuration_scope&&configuration_id!=:excluded;"
       - name: list
         type: list
-        sql: "SELECT * from configuration
-          WHERE configuration_property like :configuration_property AND configuration_scope like :configuration_scope;"
+        sql: "SELECT t0.* from configuration t0
+          WHERE configuration_scope like :configuration_scope AND configuration_property like :configuration_property;"
index 25b32157c4952b2f9c9f48e2f320bfb9c071d2d8..c621943b8c629d36a7da8977fdf0f8356b2c5128 100644 (file)
@@ -1,6 +1,6 @@
 ---
 # configuration of the bones backend for role:
-created: 2020.10.20 23:16:54
+created: 2020.10.29 22:35:03
 author: flutter_bones.module_model.exportSqlBackend()
 version: 1.0.0
 modules:
@@ -26,5 +26,5 @@ modules:
         sql: "SELECT * from role WHERE role_name=:role_name&&role_id!=:excluded;"
       - name: list
         type: list
-        sql: "SELECT * from role
+        sql: "SELECT t0.* from role t0
           WHERE role_name like :role_name;"
index ab0ff4aeb61f225fb9e4a697513476b46b3e78b8..c85fad982d413eef30f83273413864f230f016e9 100644 (file)
@@ -1,6 +1,6 @@
 ---
 # configuration of the bones backend for user:
-created: 2020.10.20 23:16:54
+created: 2020.10.29 22:35:03
 author: flutter_bones.module_model.exportSqlBackend()
 version: 1.0.0
 modules:
@@ -32,5 +32,6 @@ modules:
         sql: "SELECT * from user WHERE user_email=:user_email&&user_id!=:excluded;"
       - name: list
         type: list
-        sql: "SELECT * from user
-          WHERE user_name like :user_name AND (:user_role is null or user_role=:user_role);"
+        sql: "SELECT t0.*,t1.role_name as user_role from user t0
+          left join role t1 on t1.role_id=t0.user_role
+          WHERE user_name like :user_name AND (:user_role IS NULL OR t0.user_role=:user_role);"
index 1fe35e1b742dc45bb9a655f68300d959c08d5f98..ba7415315e6208ff0ffba6b5f7f9fd363802397d 100644 (file)
@@ -8,6 +8,8 @@ import 'src/page/role/role_create_page.dart';
 import 'src/page/role/role_list_page.dart';
 import 'src/page/user/user_create_page.dart';
 import 'src/page/user/user_list_page.dart';
+import 'src/page/configuration/configuration_create_page.dart';
+import 'src/page/configuration/configuration_list_page.dart';
 import 'src/private/bsettings.dart';
 
 class BoneApp extends StatefulWidget {
@@ -60,14 +62,12 @@ Route<dynamic> _getRoute(RouteSettings settings) {
     case '/user/create':
       page = UserCreatePage(BSettings.lastInstance.pageData);
       break;
-  /*
     case '/configuration/list':
       page = ConfigurationListPage(BSettings.lastInstance.pageData);
       break;
     case '/configuration/create':
       page = ConfigurationCreatePage(BSettings.lastInstance.pageData);
       break;
-      */
     default:
       page = LoginPage(BSettings.lastInstance.pageData);
       break;
index 0a119fb6d5da52fb4884c19348c25f4b77a17e13..7ab3ba84accc30fc02c17167a145645628fa07fc 100644 (file)
@@ -13,14 +13,14 @@ class ColumnModel extends ComboBaseModel {
       r'^(undef|readonly|disabled|doStore|hidden|null|notnull|password|primary|required|unique)$');
   static final regExprListDbOption =
       RegExp(r'^\w+\.\w+;\w+ \w+(?:;(:? ?:\w+=[^ ]*?)+)?$');
+  static final regExprForeignKey = RegExp(r'^\w+\.\w+ \w+$');
   int size;
   int rows;
   final TableModel table;
-  final Map<String, dynamic> map;
   String foreignKey;
 
   /// A constructor used in the parser.
-  ColumnModel(this.table, this.map, BaseLogger logger)
+  ColumnModel(this.table, Map map, BaseLogger logger)
       : super(null, null, map, WidgetModelType.column, logger);
 
   /// A constructor for columns created by the program.
@@ -30,19 +30,28 @@ class ColumnModel extends ComboBaseModel {
       @required String label,
       @required DataType dataType,
       @required List<String> options,
-        String toolTip,
-        String listOption,
-        ComboboxListType listType,
+      String toolTip,
+      String listOption,
+      ComboboxListType listType,
       this.size,
-      this.map,
-        List<String> texts,
-        List<dynamic> values,
+      List<String> texts,
+      List<dynamic> values,
       BaseLogger logger})
-      : super.direct(section: null, page: null,
-      map: null,
-      name: name, label: label, toolTip: toolTip, texts: texts, values: values,
-      listOption: listOption, listType: listType, options: options,
-      widgetType: WidgetModelType.column, logger: logger);
+      : super.direct(
+            section: null,
+            page: null,
+            map: null,
+            name: name,
+            label: label,
+            toolTip: toolTip,
+            texts: texts,
+            dataType: dataType,
+            values: values,
+            listOption: listOption,
+            listType: listType,
+            options: options,
+            widgetType: WidgetModelType.column,
+            logger: logger);
 
   /// Dumps the instance into a [StringBuffer]
   StringBuffer dump(StringBuffer stringBuffer) {
@@ -73,7 +82,12 @@ class ColumnModel extends ComboBaseModel {
         parseEnum<DataType>('dataType', map, DataType.values, required: true);
     size = parseInt('size', map, required: dataType == DataType.string);
     rows = parseInt('rows', map);
-
+    foreignKey = parseString('foreignKey', map);
+    if (foreignKey != null &&
+        regExprForeignKey.firstMatch(foreignKey) == null) {
+      logger.error(
+          'invalid foreign key: $foreignKey expected: "<table>.<primary> <colName>" e.g. "role.role_id role_name"');
+    }
     checkOptionsByRegExpr(options, regExprOptions);
     if (options.contains('primary')) {
       if (!options.contains('notnull')) {
index bfa3a36304531551c6c9a3b5d5540140be5a8856..d138346d2193625c2b0e2cc02d6a8ee566d22e5e 100644 (file)
@@ -24,20 +24,20 @@ class DbReferenceModel extends ComboBaseModel {
   DbReferenceModel.fromColumn(SectionModel section, PageModel page,
       ColumnModel column, BaseLogger logger)
       : super.direct(
-      section: section,
-      page: page,
-      map: null,
-      widgetType: WidgetModelType.dbReference,
-      name: column.name,
-      label: column.label,
-      toolTip: column.toolTip,
-      dataType: column.dataType,
-      options: column.options = <String>[],
-      texts: column.texts,
-      values: column.values,
-      listOption: column.listOption,
-      listType: column.listType,
-      logger: logger) {
+            section: section,
+            page: page,
+            map: null,
+            widgetType: WidgetModelType.dbReference,
+            name: column.name,
+            label: column.label,
+            toolTip: column.toolTip,
+            dataType: column.dataType,
+            options: column.options ?? <String>[],
+            texts: column.texts,
+            values: column.values,
+            listOption: column.listOption,
+            listType: column.listType,
+            logger: logger) {
     this.column = column;
     maxSize = column.size;
     rows = column.rows;
index 36ff059d94ce9a3cab0bc924690d2af250121a35..66a7bb2415b9d17084d61592960526523a0c7ec2 100644 (file)
@@ -61,7 +61,7 @@ abstract class FieldModel extends WidgetModel {
 
   /// Tests whether a given [option] is part of [options].
   bool hasOption(String option) {
-    if (options == null){
+    if (options == null) {
       return false;
     }
     bool rc = options.contains(option);
@@ -70,7 +70,9 @@ abstract class FieldModel extends WidgetModel {
 
   /// Parses the map and stores the data in the instance.
   void parse() {
-    name = parseString(widgetModelType == WidgetModelType.column ? 'column' : 'name', map, required: true);
+    name = parseString(
+        widgetModelType == WidgetModelType.column ? 'column' : 'name', map,
+        required: true);
     label = parseString('label', map, required: false);
     toolTip = parseString('toolTip', map, required: false);
     filterType = parseEnum<FilterType>('filterType', map, FilterType.values);
index d70cc28b485d5d81e24ec3bc75d82fb43e93b46a..7756b6047ae0e5fbad756f250ab43a02abd8383c 100644 (file)
@@ -1,6 +1,6 @@
 import 'package:dart_bones/dart_bones.dart';
 import 'package:meta/meta.dart';
-
+import '../helper/string_helper.dart';
 import 'model_types.dart';
 
 /// Base class of all models.
@@ -172,6 +172,16 @@ abstract class ModelBase {
                 case DataType.reference:
                   rc2 = StringUtils.asInt(item);
                   break;
+                case DataType.bool:
+                case DataType.currency:
+                case DataType.date:
+                case DataType.dateTime:
+                case DataType.float:
+                  rc2 = StringHelper.fromString(item, dataType);
+                  break;
+                case DataType.string:
+                  rc2 = item;
+                  break;
                 default:
                   logger.error('unknown dataType in parseValueList()');
                   rc2 = item;
index b8dde9cda435e37ab6b73b13640da57330668b73..3bfd13e64d71703a635848271cc71241520607c5 100644 (file)
@@ -96,9 +96,25 @@ class ModuleModel extends ModelBase {
         (element) => element.pageModelType == PageModelType.list,
         orElse: () => null);
     if (page != null) {
+      final buffer2 = StringBuffer();
+      var select = 't0.*';
+      var no = 0;
+      table.columns.forEach((column) {
+        if (column.foreignKey != null && column.foreignKey.isNotEmpty) {
+          no++;
+          final foreignName = column.foreignKey.split(' ');
+          final colName = foreignName[1];
+          final tableColumn = foreignName[0].split('.');
+          final table2 = tableColumn[0];
+          final col2 = tableColumn[1];
+          select += ',t$no.$colName as ${column.name}';
+          buffer2.write(
+              '          left join $table2 t$no on t$no.$col2=t0.${column.name}\n');
+        }
+      });
       buffer.write('''      - name: list
         type: list
-        sql: "SELECT * from ${table.name}\n''');
+        sql: "SELECT $select from ${table.name} t0\n$buffer2''');
       // @ToDo: joins
       final fields = page.fields
           .where((item) => item is FieldModel && item.filterType != null);
@@ -121,7 +137,8 @@ class ModuleModel extends ModelBase {
               buffer.write('${field.name}<=:${field.name}');
               break;
             case FilterType.equals:
-              buffer.write('${field.name} like :${field.name}');
+              buffer.write(
+                  '(:${field.name} IS NULL OR ${field.name}=:${field.name})');
               break;
             case FilterType.pattern:
               buffer.write('${field.name} like :${field.name}');
index 16abd36c20b29510784e801898223f29efc0293c..4958f09eaa97f78ef55038f9ef78dc93d4729d85 100644 (file)
@@ -24,7 +24,7 @@ class ConfigurationModel extends ModuleModel {
             'dataType': 'string',
             'label': 'Bereich',
             'size': 64,
-            'options': 'unique notnull',
+            'options': 'notnull',
           },
           {
             'column': 'configuration_property',
index 4809366c1b8e5928618574e51f24f41682f3f484..097e2a0623d0cf67bcf98bd99bfa4779dc57a069 100644 (file)
@@ -47,7 +47,7 @@ class UserModel extends ModuleModel {
             'column': 'user_role',
             'dataType': 'reference',
             'label': 'Role',
-            'foreignKey': 'role.role_id',
+            'foreignKey': 'role.role_id role_name',
             'listType': 'explicite',
             'texts': ';-;Administrator;Benutzer;Gast;Verwalter',
             'values': ';;1;2;3;4',
index 2b35b87bb46979df305df40ad8a00354ac132a5f..a711d8cab2d9e94370496ef87493d69b34be45b5 100644 (file)
@@ -32,21 +32,21 @@ class ConfigurationChangePageState extends State<ConfigurationChangePage> {
   final int primaryId;
   final Map initialRow;
   final GlobalKey<FormState> _formKey =
-  GlobalKey<FormState>(debugLabel: 'configuration_change');
+      GlobalKey<FormState>(debugLabel: 'configuration_change');
 
   ConfigurationController controller;
 
-  ConfigurationChangePageState(this.primaryId, this.applicationData,
-      this.initialRow);
+  ConfigurationChangePageState(
+      this.primaryId, this.applicationData, this.initialRow);
 
   @override
   Widget build(BuildContext context) {
     if (controller == null) {
       controller = ConfigurationController(
           _formKey, this, 'change', context, applicationData, redrawCallback:
-          (RedrawReason reason,
-          {String customString,
-            RedrawCallbackFunctionSimple callback}) {
+              (RedrawReason reason,
+                  {String customString,
+                  RedrawCallbackFunctionSimple callback}) {
         switch (reason) {
           case RedrawReason.callback:
             callback(RedrawReason.custom, customString);
index 34a70f957a0371e578841f1472056c2ea5b8dc2e..55851f4aa622a92f963695fc40c3e9a6636a9674 100644 (file)
@@ -1,6 +1,8 @@
 import 'package:dart_bones/dart_bones.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_bones/flutter_bones.dart';
+import 'package:flutter_bones/src/model/combo_base_model.dart';
+import 'package:flutter_bones/src/widget/dropdown_button_form_bone.dart';
 import 'package:flutter_bones/src/widget/page_controller_bones.dart';
 
 import 'text_form_field_bone.dart';
@@ -79,15 +81,21 @@ class FilterSet {
   /// Returns a list of widgets for the filter fields.
   List<Widget> getWidgets() {
     final rc = filters.map((filter) {
-      Widget rc = TextFormFieldBone(
-        filter.name,
-        pageController,
-        decoration: InputDecoration(labelText: filter.label),
-      );
-      if (filter.toolTip != null) {
-        rc = Tooltip(message: filter.toolTip, child: rc);
+      final model = pageController.page.fieldByName(filter.name);
+      if (model is ComboBaseModel) {
+        Widget rc3 = View().combobox(model, pageController, null);
+        return rc3;
+      } else {
+        Widget rc2 = TextFormFieldBone(
+          filter.name,
+          pageController,
+          decoration: InputDecoration(labelText: filter.label),
+        );
+        if (filter.toolTip != null) {
+          rc2 = Tooltip(message: filter.toolTip, child: rc2);
+        }
+        return rc2;
       }
-      return rc;
     }).toList();
     return rc;
   }
index 688fe5e73cd22b0dd3a03e7bc4b74deb1d03d765..aad66b23d31789e8f6838ca4278a01a5899617ad 100644 (file)
@@ -99,7 +99,8 @@ class View {
       dynamic initialValue) {
     var rc;
     if (model.dataType == DataType.bool) {
-      rc = checkbox(model, controller, StringHelper.fromString(initialValue, DataType.bool));
+      rc = checkbox(model, controller,
+          StringHelper.fromString(initialValue, DataType.bool));
     } else if (model.listType != null) {
       rc = combobox(model, controller, initialValue);
     } else {