loadDataAndReferences method

Future<List> loadDataAndReferences(
  1. Map response,
  2. List<String> loadReference,
  3. String tag, {
  4. NsgDataRequestParams? filter,
})

Загружает данные из response, представляющего из себя Map. основные объекты лежат в results, кэшируемые по названию полей основного объекта

Implementation

Future<List> loadDataAndReferences(Map response, List<String> loadReference, String tag, {NsgDataRequestParams? filter}) async {
  var maps = response as Map<String, dynamic>;
  //Новые основные элементы
  var newItems = <NsgDataItem>[];
  //Все новые элементы, включая дочитанные объекты для поиска строк табличных частей
  var allItems = <NsgDataItem>[];
  var useCache = (filter == null || filter.fieldsToRead == null || filter.fieldsToRead!.isEmpty);
  maps.forEach((name, data) {
    if (name == '_results_' || name == 'results') {
      newItems = _fromJsonList(data);
      allItems.addAll(newItems);
      if (newItems.isNotEmpty && filter != null && filter.fieldsToRead != null && filter.fieldsToRead!.isNotEmpty) {
        //Проставить полям из списка признак того, что она пустые - не прочитаны с БД
        for (var fieldName in newItems.first.fieldList.fields.keys) {
          if (filter.fieldsToRead!.contains(fieldName)) continue;
          for (var item in newItems) {
            item.setFieldEmpty(fieldName);
          }
        }
      }
      //А если там уже есть такой же элемент с ранее дочитанными полями?
      if (useCache) {
        NsgDataClient.client.addItemsToCache(items: newItems, tag: tag);
      }
    } else if (name == 'resultsCount') {
      totalCount = int.tryParse(data);
    } else {
      // var foundField = NsgDataClient.client.getReferentFieldByFullPath(dataItemType, name);
      // if (foundField != null) {
      //   var refItems = <NsgDataItem>[];
      //   data.forEach((m) {
      //     if (foundField is NsgDataUntypedReferenceField) {
      //       // var elem = NsgDataClient.client.getNewObject(foundField.referentElementType!);
      //       // elem.fromJson(m as Map<String, dynamic>);
      //       // refItems.add(elem);
      //     } else {
      //       var elem = NsgDataClient.client.getNewObject(foundField.referentElementType);
      //       elem.fromJson(m as Map<String, dynamic>);
      //       refItems.add(elem);
      //     }
      //   });
      //   allItems.addAll(refItems);
      //   if (foundField is NsgDataReferenceListField) {
      //     for (var tabItem in refItems) {
      //       var ownerItem = allItems.firstWhere((e) => tabItem.ownerId == e.id);
      //       foundField.addRow(ownerItem, tabItem);
      //     }
      //   } else {
      //     if (useCache) {
      //       NsgDataClient.client.addItemsToCache(items: refItems, tag: tag);
      //     }
      //   }
      // } else
      {
        if (name.isNotEmpty) {
          name = name.replaceRange(0, 1, name.substring(0, 1).toUpperCase());
        }
        if (NsgDataClient.client.isRegisteredByServerName(name)) {
          var refItems = <NsgDataItem>[];
          data.forEach((m) {
            var elem = NsgDataClient.client.getNewObject(NsgDataClient.client.getTypeByServerName(name));
            elem.fromJson(m as Map<String, dynamic>);
            elem.state = NsgDataItemState.fill;
            refItems.add(elem);
          });
          if (useCache) {
            NsgDataClient.client.addItemsToCache(items: refItems, tag: tag);
          }
        } else {
          debugPrint('ERROR: $dataItemType.$name not found');
        }
      }
    }
  });
  await loadAllReferents(newItems, loadReference, tag: tag);
  return newItems;
}