diff --git a/app/assets/javascripts/projects/show.js b/app/assets/javascripts/projects/show.js index 7d9798768..170d99fc5 100644 --- a/app/assets/javascripts/projects/show.js +++ b/app/assets/javascripts/projects/show.js @@ -1,67 +1,24 @@ -(function(){ - var count = 0; - - function init(){ - $("[data-id]").each(function(){ - var that = $(this); - initProjectExperiment(that); - }); - } - - function initProjectExperiment(element){ - var container = element.find(".workflowimg-container"); - var url = container.data("check-img"); - var timestamp = container.data("timestamp"); - var img_url = container.data('updated-img'); - - animateSpinner(container, true, { color: '#555', top: '60%', zIndex: '100' }); - checkUpdatedImg(img_url, url, timestamp, container); - } - - // checks if the experiment image is updated - function checkUpdatedImg(img_url, url, timestamp, container){ - if (count < 30 && timestamp){ - $.ajax({ - url: url, - type: "GET", - data: { "timestamp": timestamp }, - dataType: "json", - success: function (data) { - getNewWorkforwImg(container, img_url); - container.show(); - animateSpinner(container, false); - }, - error: function (ev) { - if (ev.status == 404) { - setTimeout(function () { - checkUpdatedImg(img_url, url, timestamp, container) - }, 5000); - } else { - animateSpinner(container, false); +(function() { + function init() { + $('.workflowimg-container').each(function() { + let container = $(this); + if (container.data('workflowimg-present') === false) { + let imgUrl = container.data('workflowimg-url'); + container.find('.workflowimg-spinner').removeClass('hidden'); + $.ajax({ + url: imgUrl, + type: 'GET', + dataType: 'json', + success: function(data) { + container.html(data.workflowimg); + }, + error: function() { + container.find('.workflowimg-spinner').addClass('hidden'); } - count++; - } - }); - } else { - animateSpinner(container, false); - } - } - - // fetch the new experiment image - function getNewWorkforwImg(el, url){ - $.ajax({ - url: url, - type: "GET", - dataType: "json", - success: function (data) { - el.children('img').remove(); - el.append(data.workflowimg); - }, - error: function (ev) { - // TODO + }); } }); } init(); -})(); +}()); diff --git a/app/assets/stylesheets/projects.scss b/app/assets/stylesheets/projects.scss index 99324fa85..b4457a30b 100644 --- a/app/assets/stylesheets/projects.scss +++ b/app/assets/stylesheets/projects.scss @@ -1,6 +1,6 @@ // scss-lint:disable SelectorDepth // scss-lint:disable NestingDepth -@import 'constants'; +@import "constants"; @import "mixins"; // Some color definitions @@ -559,9 +559,16 @@ li.module-hover { .no-workflowimg { color: $color-alto; display: block; - font-size: 22px; + text-align: center; + text-decoration: none; + } + + .no-tasks { + color: $color-alto; + display: block; + font-size: 1.5em; font-weight: bold; - margin: 15px 0; + margin: 1em 0; max-height: 200px; padding-bottom: 70px; padding-top: 50px; @@ -575,6 +582,11 @@ li.module-hover { height: 100%; justify-content: center; + .workflowimg-spinner { + color: $color-alto; + top: 50%; + } + img { max-height: 190px; max-width: 100%; diff --git a/app/controllers/canvas_controller.rb b/app/controllers/canvas_controller.rb index d5d95e540..267334fcf 100644 --- a/app/controllers/canvas_controller.rb +++ b/app/controllers/canvas_controller.rb @@ -171,9 +171,6 @@ class CanvasController < ApplicationController next if my_module.blank? end - # Create workflow image - @experiment.generate_workflow_img - flash[:success] = t('experiments.canvas.update.success_flash') redirect_to canvas_experiment_path(@experiment) end diff --git a/app/controllers/experiments_controller.rb b/app/controllers/experiments_controller.rb index d14696d64..c0e1ed0c8 100644 --- a/app/controllers/experiments_controller.rb +++ b/app/controllers/experiments_controller.rb @@ -213,28 +213,19 @@ class ExperimentsController < ApplicationController def module_archive end - def updated_img - if @experiment.workflowimg.attached? && !@experiment.workflowimg_exists? - @experiment.workflowimg.purge - @experiment.generate_workflow_img - end - respond_to do |format| - format.json do - if @experiment.workflowimg.attached? - render json: {}, status: 200 - else - render json: {}, status: 404 - end + def fetch_workflow_img + unless @experiment.workflowimg_exists? + Experiment.no_touching do + Experiments::GenerateWorkflowImageService.call(experiment: @experiment) end end - end - def fetch_workflow_img respond_to do |format| format.json do render json: { workflowimg: render_to_string( - partial: 'projects/show/workflow_img.html.erb' + partial: 'projects/show/workflow_img.html.erb', + locals: { experiment: @experiment } ) } end diff --git a/app/models/experiment.rb b/app/models/experiment.rb index 058f28bd2..9299386e9 100644 --- a/app/models/experiment.rb +++ b/app/models/experiment.rb @@ -212,13 +212,8 @@ class Experiment < ApplicationRecord true end - def generate_workflow_img - workflowimg.purge if workflowimg.attached? - Experiments::GenerateWorkflowImageService.delay.call(experiment_id: id) - end - def workflowimg_exists? - workflowimg.service.exist?(workflowimg.blob.key) + workflowimg.attached? && workflowimg.service.exist?(workflowimg.blob.key) end # Get projects where user is either owner or user in the same team @@ -345,9 +340,6 @@ class Experiment < ApplicationRecord experiment_new: experiment.id }) end - - # Generate workflow image for the experiment in which we moved the task - generate_workflow_img_for_moved_modules(to_move) end # Move module groups; this method accepts a map where keys @@ -406,17 +398,6 @@ class Experiment < ApplicationRecord group.save! end end - - # Generate workflow image for the experiment in which we moved the workflow - generate_workflow_img_for_moved_modules(to_move) - end - - # Generates workflow img when the workflow or module is moved - # to other experiment - def generate_workflow_img_for_moved_modules(to_move) - Experiment.where(id: to_move.values.uniq).each do |exp| - exp.generate_workflow_img - end end # Update connections for all modules in this project. @@ -485,7 +466,7 @@ class Experiment < ApplicationRecord def update_module_positions(positions) modules = my_modules.where(id: positions.keys) modules.each do |m| - m.update_columns(x: positions[m.id.to_s][:x], y: positions[m.id.to_s][:y]) + m.update(x: positions[m.id.to_s][:x], y: positions[m.id.to_s][:y]) end my_modules.reload end @@ -498,7 +479,7 @@ class Experiment < ApplicationRecord y_diff = my_modules.pluck(:y).min my_modules.each do |m| - m.update_columns(x: m.x - x_diff, y: m.y - y_diff) + m.update(x: m.x - x_diff, y: m.y - y_diff) end end diff --git a/app/models/my_module.rb b/app/models/my_module.rb index 6beac9652..c4f960e8e 100644 --- a/app/models/my_module.rb +++ b/app/models/my_module.rb @@ -10,8 +10,9 @@ class MyModule < ApplicationRecord before_create :create_blank_protocol before_create :assign_default_status_flow - around_save :exec_status_consequences, if: :my_module_status_id_changed? + after_save -> { experiment.workflowimg.purge }, + if: -> { (saved_changes.keys & %w(x y experiment_id my_module_group_id input_id output_id archived)).any? } auto_strip_attributes :name, :description, nullify: false, if: proc { |mm| mm.name_changed? || mm.description_changed? } validates :name, @@ -168,7 +169,6 @@ class MyModule < ApplicationRecord raise ActiveRecord::Rollback end end - experiment.generate_workflow_img restored end diff --git a/app/services/create_my_module_service.rb b/app/services/create_my_module_service.rb index ac4324045..e4e202f33 100644 --- a/app/services/create_my_module_service.rb +++ b/app/services/create_my_module_service.rb @@ -37,7 +37,6 @@ class CreateMyModuleService @my_module.assign_user(@user) - @params[:experiment].generate_workflow_img new_my_module = @my_module end new_my_module diff --git a/app/services/experiments/copy_experiment_as_template_service.rb b/app/services/experiments/copy_experiment_as_template_service.rb index 5a708ce7b..7b830a73a 100644 --- a/app/services/experiments/copy_experiment_as_template_service.rb +++ b/app/services/experiments/copy_experiment_as_template_service.rb @@ -43,7 +43,6 @@ module Experiments @errors.merge!(@c_exp.errors.to_hash) unless @c_exp.valid? @c_exp = nil unless succeed? - @c_exp.generate_workflow_img if succeed? track_activity if succeed? self diff --git a/app/services/experiments/generate_workflow_image_service.rb b/app/services/experiments/generate_workflow_image_service.rb index 071607f7e..6de19e71f 100644 --- a/app/services/experiments/generate_workflow_image_service.rb +++ b/app/services/experiments/generate_workflow_image_service.rb @@ -7,8 +7,8 @@ module Experiments attr_reader :errors - def initialize(experiment_id:) - @exp = Experiment.find experiment_id + def initialize(experiment:) + @exp = experiment @graph = GraphViz.new(:G, type: :digraph, use: :neato) @graph[:size] = '4,4' @@ -75,10 +75,14 @@ module Experiments def save_file file = Tempfile.open(%w(wimg .png), Rails.root.join('tmp')) - @graph.output(png: file.path) - @exp.workflowimg.attach(io: file, filename: File.basename(file.path)) - file.close - file.unlink + begin + @graph.output(png: file.path) + file.rewind + @exp.workflowimg.attach(io: file, filename: File.basename(file.path)) + ensure + file.close + file.unlink + end end end end diff --git a/app/services/team_importer.rb b/app/services/team_importer.rb index 1c0ef435e..0a65b889a 100644 --- a/app/services/team_importer.rb +++ b/app/services/team_importer.rb @@ -616,7 +616,6 @@ class TeamImporter my_module_group.save! @my_module_group_mappings[orig_module_group_id] = my_module_group.id end - experiment.generate_workflow_img create_my_modules(experiment_json['my_modules'], experiment, user_id) experiment end diff --git a/app/utilities/first_time_data_generator.rb b/app/utilities/first_time_data_generator.rb index 57a0ab696..1febcf927 100644 --- a/app/utilities/first_time_data_generator.rb +++ b/app/utilities/first_time_data_generator.rb @@ -1297,9 +1297,6 @@ module FirstTimeDataGenerator created_at: generate_random_time(my_modules[7].created_at, 3.days), file_name: 'result-ddCq.JPG' ) - - # create thumbnail - experiment.generate_workflow_img end # Used for delayed jobs diff --git a/app/views/projects/show/_experiment.html.erb b/app/views/projects/show/_experiment.html.erb index a43f6d7fe..de8ec6929 100644 --- a/app/views/projects/show/_experiment.html.erb +++ b/app/views/projects/show/_experiment.html.erb @@ -55,18 +55,24 @@
<% if experiment.active_modules.length > 0 %> - <%= link_to canvas_experiment_path(experiment) do %> -
-
+ <%= link_to canvas_experiment_path(experiment), class: 'no-workflowimg' do %> + <% if experiment.workflowimg.attached? %> +
+ <%= render partial: 'projects/show/workflow_img.html.erb', locals: { experiment: experiment } %> +
+ <% else %> +
+ +
+ <% end %> <% end %> <% else %> <% if can_manage_experiment?(experiment) %> <%= link_to( t('experiments.edit.add_task'), canvas_experiment_path(experiment, editMode: true), - class: 'no-workflowimg') %> + class: 'no-tasks') %> <% else %>

<%= t('experiments.edit.no_workflowimg') %>

diff --git a/app/views/projects/show/_workflow_img.html.erb b/app/views/projects/show/_workflow_img.html.erb index 55152afa6..3bc73301e 100644 --- a/app/views/projects/show/_workflow_img.html.erb +++ b/app/views/projects/show/_workflow_img.html.erb @@ -1 +1 @@ -<%= image_tag url_for(@experiment.workflowimg), class: 'img-responsive center-block' %> +<%= image_tag url_for(experiment.workflowimg), class: 'img-responsive center-block' %> diff --git a/config/routes.rb b/config/routes.rb index 4aab8c8ae..88c4c50bb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -315,7 +315,6 @@ Rails.application.routes.draw do post 'clone' # clone experiment get 'move_modal' # return modal with move options post 'move' # move experiment - get 'updated_img' # Checks if the workflow image is updated get 'fetch_workflow_img' # Get udated workflow img end end diff --git a/spec/services/experiments/generate_workflow_image_service_spec.rb b/spec/services/experiments/generate_workflow_image_service_spec.rb index 51abca4ce..aa1a4f82b 100644 --- a/spec/services/experiments/generate_workflow_image_service_spec.rb +++ b/spec/services/experiments/generate_workflow_image_service_spec.rb @@ -4,7 +4,7 @@ require 'rails_helper' describe Experiments::GenerateWorkflowImageService do let(:experiment) { create :experiment, :with_tasks } - let(:params) { { experiment_id: experiment.id } } + let(:params) { { experiment: experiment } } context 'when succeed' do it 'succeed? returns true' do diff --git a/spec/services/model_importers/team_importer_spec.rb b/spec/services/model_importers/team_importer_spec.rb index e4f64cdd1..49991f277 100644 --- a/spec/services/model_importers/team_importer_spec.rb +++ b/spec/services/model_importers/team_importer_spec.rb @@ -33,7 +33,7 @@ describe TeamImporter do @exp = @team_importer.import_experiment_template_from_dir(TEMPLATE_DIR, PROJECT_ID, USER_ID) - Experiments::GenerateWorkflowImageService.call(experiment_id: @exp.id) + Experiments::GenerateWorkflowImageService.call(experiment: @exp) @exp.reload end