diff --git a/CHANGELOG b/CHANGELOG index 05f600faa..8dd35280a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ - Docker: - Update default attachments & templates locations to storage/ - Include assets for all integrations regardless of enabled/disabled status + - Liquid: evaluate Liquid content before rendering all issues/evidence tables - Nodes: - Add more types and icons - Rename addon upload/parent nodes and add icons diff --git a/app/assets/javascripts/hera/modules/liquid_async.js b/app/assets/javascripts/hera/modules/liquid_async.js index bf6e8fff6..ac31d99f0 100644 --- a/app/assets/javascripts/hera/modules/liquid_async.js +++ b/app/assets/javascripts/hera/modules/liquid_async.js @@ -1,9 +1,17 @@ -document.addEventListener('turbo:load', function () { +// Helper for updating table sorting values +function updateLiquidSortValue(element, html) { + const liquidText = $('
').html(html).text().trim(); + $(element).attr('data-sort', liquidText); +} + +function liquidAsync() { $('[data-behavior~=liquid-async]').each(function () { const that = this, data = { text: $(that).attr('data-content') }, $spinner = $(that).prev().find('[data-behavior~=liquid-spinner'); + const requiresSortUpdate = $(that).is('[data-sort]') + fetch($(that).attr('data-path'), { method: 'POST', headers: { @@ -16,8 +24,18 @@ document.addEventListener('turbo:load', function () { .then((response) => response.text()) .then(function (html) { $(that).html(html); + + if (requiresSortUpdate) { + updateLiquidSortValue(that, html); + } + $(that).trigger('dradis:liquid-rendered'); $spinner.addClass('d-none'); }); }); +}; + +document.addEventListener('turbo:load', liquidAsync); +$(document).on('dradis:fetch', function(event) { + liquidAsync(); }); diff --git a/app/controllers/issues/evidence_controller.rb b/app/controllers/issues/evidence_controller.rb index 23dc7b5e5..c258f71a0 100644 --- a/app/controllers/issues/evidence_controller.rb +++ b/app/controllers/issues/evidence_controller.rb @@ -2,13 +2,15 @@ class Issues::EvidenceController < AuthenticatedController include ActivityTracking include ContentFromTemplate include DynamicFieldNamesCacher + include LiquidEnabledResource include MultipleDestroy include ProjectScoped - before_action :set_issues, only: [:create_multiple, :index, :new] + before_action :set_issues, only: [:create_multiple, :index, :new, :preview] before_action :set_affected_nodes, only: :index before_action :set_auto_save_key, only: :new before_action :set_columns, only: :index + before_action :set_evidence, only: :preview def index render layout: false @@ -78,6 +80,10 @@ def evidence_params params.require(:evidence).permit(:author, :content, :issue_id, :node_id) end + def liquid_resource_assigns + { 'evidence' => EvidenceDrop.new(@evidence) } + end + def node_params_empty? params[:evidence][:node_list].blank? && (params[:evidence][:node_ids].reject(&:empty?).empty?) @@ -114,6 +120,10 @@ def set_auto_save_key end end + def set_evidence + @evidence = @issue.evidence.find_by(id: params[:id]) + end + def set_issues @issues = current_project.issues.order(:text) @issue = @issues.find(params[:issue_id]) if params[:issue_id] diff --git a/app/views/issues/_table.html.erb b/app/views/issues/_table.html.erb index e34611c9d..a390b52fc 100644 --- a/app/views/issues/_table.html.erb +++ b/app/views/issues/_table.html.erb @@ -26,6 +26,7 @@ <% @all_columns.each do |column| %> + <% data_attrs = { behavior: class_names(tag: column == 'Tags') } %> <% sort, display = case column when 'Title' @@ -50,16 +51,18 @@ when 'Updated' [issue.updated_at.to_i, local_time_ago(issue.updated_at)] else - [issue.fields.fetch(column, ''), markup(issue.fields.fetch(column, ''))] + field_content = issue.fields.fetch(column, '') + data_attrs[:behavior] = "#{data_attrs[:behavior]} liquid-async".strip + data_attrs[:path] = preview_project_issue_path(current_project, issue) + data_attrs[:content] = field_content + + [field_content, field_content] end %> <%= content_tag :td, - display, - class: class_names('text-break-spaces': column == 'Affected'), - data: { - behavior: class_names(tag: column == 'Tags'), - sort: sort - } + display, + class: class_names('text-break-spaces': column == 'Affected'), + data: data_attrs.merge({ sort: sort }) %> <% end %> diff --git a/app/views/issues/evidence/_table.html.erb b/app/views/issues/evidence/_table.html.erb index b77aa8c82..a965cdb69 100644 --- a/app/views/issues/evidence/_table.html.erb +++ b/app/views/issues/evidence/_table.html.erb @@ -19,6 +19,7 @@ <% @all_columns.each do |column| %> + <% data_attrs = {} %> <% sort, display = case column @@ -31,10 +32,18 @@ when 'Updated' [evidence.updated_at.to_i, local_time_ago(evidence.updated_at)] else - [evidence.fields.fetch(column, ''), markup(evidence.fields.fetch(column, ''))] + field_content = evidence.fields.fetch(column, '') + data_attrs[:behavior] = "#{data_attrs[:behavior]} liquid-async".strip + data_attrs[:path] = preview_project_issue_evidence_path(current_project, @issue, evidence) + data_attrs[:content] = field_content + + [field_content, field_content] end %> - <%= display %> + <%= content_tag :td, + display, + data: data_attrs.merge({ sort: sort }) + %> <% end %> <%= link_to edit_project_node_evidence_path(current_project, node, evidence, return_to: :issue) do %> diff --git a/app/views/nodes/items_table/_table.html.erb b/app/views/nodes/items_table/_table.html.erb index 926c6a29e..3c3d60b61 100644 --- a/app/views/nodes/items_table/_table.html.erb +++ b/app/views/nodes/items_table/_table.html.erb @@ -23,6 +23,7 @@ <% columns.each do |column| %> + <% data_attrs = {} %> <% sort, display = case column @@ -47,10 +48,18 @@ when 'Updated' [item.updated_at.to_i, local_time_ago(item.updated_at)] else - [item.fields.fetch(column, ''), markup(item.fields.fetch(column, ''))] + field_content = item.fields.fetch(column, '') + data_attrs[:behavior] = "#{data_attrs[:behavior]} liquid-async".strip + data_attrs[:path] = preview_project_node_evidence_path(current_project, @node, item) + data_attrs[:content] = field_content + + [field_content, field_content] end %> - <%= display %> + <%= content_tag :td, + display, + data: data_attrs.merge({ sort: sort }) + %> <% end %> <%= link_to [:edit, @node.project, @node, item] do %> diff --git a/config/routes.rb b/config/routes.rb index 08cc31728..558d42d9d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -59,7 +59,7 @@ resources :merge, only: [:new, :create], controller: 'issues/merge' end - resources :evidence, concerns: :multiple_destroy, controller: 'issues/evidence', only: [:index, :new] + resources :evidence, concerns: [:multiple_destroy, :previewable], controller: 'issues/evidence', only: [:index, :new] resources :nodes, only: [:show], controller: 'issues/nodes' resources :revisions, only: [:index, :show] end