class Weaver::DynamicTable

Tables that dynamically load data

Public Class Methods

new(page, anchors, url, options = {}, &block) click to toggle source
# File lib/weaver/element_types/dynamic_table.rb, line 7
def initialize(page, anchors, url, options = {}, &block)
  @page = page
  @anchors = anchors
  @url = url
  @options = options
  @columns = nil
  @query_object = nil

  instance_eval(&block) if block

  @options[:id] ||= @page.create_anchor 'dyn_table'
  @table_name = @options[:id]
  @head_name = "#{@table_name}_head"
  @body_name = "#{@table_name}_body"
end

Public Instance Methods

column(name, options = {}, &block) click to toggle source
# File lib/weaver/element_types/dynamic_table.rb, line 23
    def column(name, options = {}, &block)
      @columns = [] if @columns.nil?

      title = options[:title] || name
      format = nil
      transform = nil

      if options[:icon]
        elem = Elements.new(@page, @anchors)
        elem.instance_eval do
          icon options[:icon]
          text " #{title}"
        end
        title = elem.generate
      end

      if block
        elem = DynamicTableCell.new(@page, @anchors)
        elem.instance_eval(&block)
        format = elem.generate
        if elem.transform_script
          func_name = @page.create_anchor 'transform'
          @page.write_script_once <<~SCRIPT
            document.transform_#{func_name} = function (input)
            {
            #{elem.transform_script}
            }
          SCRIPT

          transform = func_name
         end
      end

      @columns << { name: name, title: title, format: format, transform: transform }
    end
generate_script() click to toggle source
# File lib/weaver/element_types/dynamic_table.rb, line 92
    def generate_script
      query_object_declaration = '{}'
      query_string = ''

      if @query_object
        query_object_declaration = @query_object.generate
        query_string = '+ "?" + $.param(query_object)'
      end

      member_expr = ''
      member_expr = ".#{@options[:member]}" if @options[:member]

      <<-DATATABLE_SCRIPT

        function refresh_table_#{@table_name}()
        {
                var query_object = #{query_object_declaration};

                $.get( "#{@url}" #{query_string}, function( returned_data )
                {
                        var data = returned_data#{member_expr};
                        var data_object = {};
                        if (data !== null && typeof data === 'object')
                        {
                                data_object = data;
                        }
                        else
                        {
                                data_object = JSON.parse(data);
                        }

                        var head = $("##{@head_name}")
                        var body = $("##{@body_name}")

                        if($.isPlainObject(data_object))
                        {
                                for (var key in data_object)
                                {
                                        var row = $('<tr>');
                                        row.append($('<td>').text(key));
                                        row.append($('<td>').text(data_object[key]));
                                        body.append(row);
                                }
                        }

                        if ($.isArray(data_object))
                        {

                                var columnData = JSON.parse(#{@columns.to_json.inspect});
                                var columns = {};
                                var columnTitles = [];
                                head.empty();
                                if (#{@columns.nil?})
                                {
                                        // Set up columns
                                        for (var index in data_object)
                                        {
                                                for (var key in data_object[index])
                                                {
                                                        columns[key] = Object.keys(columns).length;
                                                }
                                        }
                                        for (var key in columns)
                                        {
                                                columnTitles.push(key);
                                        }
                                }
                                else
                                {
                                        for (var key in columnData)
                                        {
                                                columns[columnData[key]["name"]] = Object.keys(columns).length;
                                                columnTitles.push(columnData[key]["title"]);
                                        }
                                }

                                var row = $('<tr>');
                                for (var key in columnTitles)
                                {
                                        var columnTitle = $('<th>').html(columnTitles[key]);
                                        row.append(columnTitle);
                                }
                                head.append(row);

                                for (var index in data_object)
                                {
                                        var row = $('<tr>');
                                        for (var columnIndex = 0; columnIndex < Object.keys(columns).length; columnIndex++) {
                                                var cell_data = data_object[index][ Object.keys(columns)[columnIndex] ];

                                                if (columnData && columnData[columnIndex]["format"])
                                                {
                                                        var format = columnData[columnIndex]["format"];
                                                        var matches = format.match(/###.+?###/g)

                                                        var result = format;
                                                        for (var matchIndex in matches)
                                                        {
                                                                var member_name = matches[matchIndex].match(/[^#]+/)[0];
                                                                result = result.replaceAll(matches[matchIndex], data_object[index][member_name]);
                                                        }

                                                        if (columnData && columnData[columnIndex]["transform"])
                                                        {
                                                                result = document["transform_" + columnData[columnIndex]["transform"]](result);
                                                        }
                                                        row.append($('<td>').html( result ).data("object", data_object[index]) );
                                                }
                                                else
                                                {
                                                        if (columnData && columnData[columnIndex]["transform"])
                                                        {
                                                                cell_data = document["transform_" + columnData[columnIndex]["transform"]](cell_data);
                                                        }
                                                        row.append($('<td>').text( cell_data ).data("object", data_object[index]) );
                                                }
                                        }
                                        body.append(row);
                                }
                        }

                });
        }

        refresh_table_#{@table_name}();

      DATATABLE_SCRIPT
    end
generate_table() click to toggle source
# File lib/weaver/element_types/dynamic_table.rb, line 59
def generate_table
  table_name = @table_name
  head_name = @head_name
  body_name = @body_name
  options = @options

  columns = @columns || [{ title: 'Key' }, { title: 'Value' }]

  elem = Elements.new(@page, @anchors)
  elem.instance_eval do
    table options do
      thead id: head_name do
        columns.each do |column, _|
          if column.is_a? Hash
            th column[:title].to_s
          else
            th column.to_s
          end
        end
      end

      tbody id: body_name do
      end
    end
  end

  elem.generate
end
query(&block) click to toggle source
# File lib/weaver/element_types/dynamic_table.rb, line 88
def query(&block)
  @query_object = JavaScriptObject.new(&block)
end