render method

  1. @override
ValueProvider render(
  1. JSONRender render,
  2. DivElement output,
  3. dynamic node,
  4. dynamic nodeOriginal,
  5. NodeKey nodeKey,
)
override

Implementation

@override
ValueProvider render(JSONRender render, DivElement output, dynamic node,
    dynamic nodeOriginal, NodeKey nodeKey) {
  var list = (node as List).cast<Map>().toList();

  var valueSet = JSONValueSet(true);

  var columns = getCollectionColumns(render, nodeKey, list);

  var contentClipboard = createDivInline()
    ..style.width = '0px'
    ..style.height = '0px'
    ..style.display = 'none';

  output.style.maxWidth = '98vw';
  output.style.overflow = 'auto';

  var table = TableElement();

  {
    var tHeader = table.createTHead();

    var headerRow = tHeader.addRow();

    this.applyCSS(render, headerRow);

    headerRow.onClick.listen((e) {
      var jsonStr = render.buildJSONAsString();

      print('-------------------------------------------------');
      print(jsonStr);

      contentClipboard.style.display = null;

      contentClipboard.innerHtml = '<pre>$jsonStr</pre>';
      copyElementToClipboard(contentClipboard);
      contentClipboard.text = '';

      contentClipboard.style.display = 'none';
    });

    for (var columnEntry in columns.entries) {
      var columnKey = columnEntry.key;
      var columnWithValue = columnEntry.value;

      if ((ignoreNullColumns && !columnWithValue) ||
          isIgnoredColumn(columnKey)) continue;

      var cell = headerRow.addCell();
      cell.text = columnKey;
      cell.style.fontWeight = 'bold';
    }
  }

  {
    var tbody = table.createTBody();

    for (var i = 0; i < list.length; ++i) {
      var entry = list[i];
      var entryNodeKey = nodeKey.append('$i');

      bool valid = render.validateNode(entry, node, entryNodeKey);
      if (!valid) {
        valueSet.put(entryNodeKey, null);
        continue;
      }

      var valueSetEntry = JSONValueSet();

      valueSet.put(entryNodeKey, valueSetEntry.asValueProvider());

      var row = tbody.addRow();

      var rowCSS = i % 2 == 0 ? 'table-row1-render' : 'table-row2-render';

      this.applyCSS(render, row, cssClass: rowCSS);

      for (var columnEntry in columns.entries) {
        var columnKey = columnEntry.key;
        var columnWithValue = columnEntry.value;

        if (ignoreNullColumns && !columnWithValue) {
          if (entry.containsKey(columnKey)) {
            assert(entry[columnKey] == null, 'Not null: ${entry[columnKey]}');
            var elemNodeKey = entryNodeKey.append(columnKey);
            valueSetEntry.put(elemNodeKey, valueProviderNull);
          }
          continue;
        } else if (isIgnoredColumn(columnKey)) {
          if (entry.containsKey(columnKey)) {
            var val = entry[columnKey];
            var elemNodeKey = entryNodeKey.append(columnKey);
            valueSetEntry.put(elemNodeKey, (parent) => val);
          }
          continue;
        }

        var cell = row.addCell();

        if (entry.containsKey(columnKey)) {
          var val = entry[columnKey];

          var elemNodeKey = entryNodeKey.append(columnKey);

          if (render.isHiddenNode(elemNodeKey)) {
            valueSet.put(elemNodeKey, (p) => nodeOriginal);
            continue;
          }

          var elemContent = createDivInline();
          var elemValueProvider =
              render.renderNode(elemContent, val, entry, elemNodeKey);

          valueSetEntry.put(elemNodeKey, elemValueProvider);

          if (elemValueProvider == null) continue;

          elemContent.style.verticalAlign = 'top';

          cell.children.add(elemContent);
        }
      }
    }
  }

  output.children.add(contentClipboard);
  output.children.add(table);

  this.applyCSS(render, output, extraElements: [table]);

  return valueSet.asValueProvider();
}