X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/e49882e535f1464673d547ba37c636ec1eb8d0ab..9429158c8ecf253a700c7eb4f87ad142a8e1522c:/apps/workbench/app/helpers/application_helper.rb diff --git a/apps/workbench/app/helpers/application_helper.rb b/apps/workbench/app/helpers/application_helper.rb index 58ad619203..786716eb33 100644 --- a/apps/workbench/app/helpers/application_helper.rb +++ b/apps/workbench/app/helpers/application_helper.rb @@ -1,3 +1,7 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 + module ApplicationHelper def current_user controller.current_user @@ -8,15 +12,24 @@ module ApplicationHelper end def current_api_host - Rails.configuration.arvados_v1_base.gsub /https?:\/\/|\/arvados\/v1/,'' + if Rails.configuration.Services.Controller.ExternalURL.port == 443 + "#{Rails.configuration.Services.Controller.ExternalURL.hostname}" + else + "#{Rails.configuration.Services.Controller.ExternalURL.hostname}:#{Rails.configuration.Services.Controller.ExternalURL.port}" + end + end + + def current_uuid_prefix + Rails.configuration.ClusterID end def render_markup(markup) - raw RedCloth.new(markup.to_s).to_html(:refs_arvados, :textile) if markup + allowed_tags = Rails::Html::Sanitizer.white_list_sanitizer.allowed_tags + %w(table tbody th tr td col colgroup caption thead tfoot) + sanitize(raw(RedCloth.new(markup.to_s).to_html(:refs_arvados, :textile)), tags: allowed_tags) if markup end def human_readable_bytes_html(n) - return h(n) unless n.is_a? Fixnum + return h(n) unless n.is_a? Integer return "0 bytes" if (n == 0) orders = { @@ -39,13 +52,6 @@ module ApplicationHelper end return h(n) - #raw = n.to_s - #cooked = '' - #while raw.length > 3 - # cooked = ',' + raw[-3..-1] + cooked - # raw = raw[0..-4] - #end - #cooked = raw + cooked end def resource_class_for_uuid(attrvalue, opts={}) @@ -241,11 +247,15 @@ module ApplicationHelper end input_type = 'text' + opt_selection = nil attrtype = object.class.attribute_info[attr.to_sym].andand[:type] if attrtype == 'text' or attr == 'description' input_type = 'textarea' elsif attrtype == 'datetime' input_type = 'date' + elsif attrtype == 'boolean' + input_type = 'select' + opt_selection = ([{value: "true", text: "true"}, {value: "false", text: "false"}]).to_json else input_type = 'text' end @@ -273,6 +283,7 @@ module ApplicationHelper "data-emptytext" => '(none)', "data-placement" => "bottom", "data-type" => input_type, + "data-source" => opt_selection, "data-title" => "Edit #{attr.to_s.gsub '_', ' '}", "data-name" => htmloptions['selection_name'] || attr, "data-object-uuid" => object.uuid, @@ -357,8 +368,8 @@ module ApplicationHelper display_value = link.name elsif value_info[:link_name] display_value = value_info[:link_name] - elsif value_info[:selection_name] - display_value = value_info[:selection_name] + elsif (sn = value_info[:selection_name]) && sn != "" + display_value = sn end end if (attr == :components) and (subattr.size > 2) @@ -422,18 +433,23 @@ module ApplicationHelper lt end - def get_cwl_inputs(workflow) - if workflow[:inputs] - return workflow[:inputs] + def get_cwl_main(workflow) + if workflow[:"$graph"].nil? + return workflow else workflow[:"$graph"].each do |tool| if tool[:id] == "#main" - return tool[:inputs] + return tool end end end end + def get_cwl_inputs(workflow) + get_cwl_main(workflow)[:inputs] + end + + def cwl_shortname(id) if id[0] == "#" id = id[1..-1] @@ -467,8 +483,8 @@ module ApplicationHelper def cwl_inputs_required(object, inputs_schema, set_attr_path) r = 0 inputs_schema.each do |input| - required, primary_type, param_id = cwl_input_info(input) - dn, attrvalue = cwl_input_value(object, input, set_attr_path + [param_id]) + required, _, param_id = cwl_input_info(input) + _, attrvalue = cwl_input_value(object, input, set_attr_path + [param_id]) r += 1 if required and attrvalue.nil? end r @@ -488,11 +504,12 @@ module ApplicationHelper chooser_title = "Choose a #{primary_type == 'Directory' ? 'dataset' : 'file'}:" selection_param = object.class.to_s.underscore + dn if attrvalue.is_a? Hash - display_value = attrvalue[:"arv:collection"] || attrvalue[:location] + display_value = attrvalue[:"http://arvados.org/cwl#collectionUUID"] || attrvalue[:"arv:collection"] || attrvalue[:location] re = CollectionsHelper.match_uuid_with_optional_filepath(display_value) + locationre = CollectionsHelper.match(attrvalue[:location][5..-1]) if re - if re[4] - display_value = "#{Collection.find(re[1]).name} / #{re[4][1..-1]}" + if locationre and locationre[4] + display_value = "#{Collection.find(re[1]).name} / #{locationre[4][1..-1]}" else display_value = Collection.find(re[1]).name end @@ -670,19 +687,15 @@ module ApplicationHelper render_runtime duration, use_words, round_to_min end - # Keep locators in input mounts are of the form \"keep:\" - MOUNT_INPUT_KEEP_LOCATOR_REGEXP = /(.*)(([0-9a-f]{32}\+\d+)(.*)\"(.*))/ - def mount_input_keep_locator str - MOUNT_INPUT_KEEP_LOCATOR_REGEXP.match str - end - - KEEP_LOCATOR_REGEXP = /(.*)([0-9a-f]{32}\+\d+)(.*)/ - def keep_locator str - KEEP_LOCATOR_REGEXP.match str + # Keep locators are expected to be of the form \"...\" or \"...\" + JSON_KEEP_LOCATOR_REGEXP = /([0-9a-f]{32}\+\d+[^'"]*|[a-z0-9]{5}-4zz18-[a-z0-9]{15}[^'"]*)(?=['"]|\z|$)/ + def keep_locator_in_json str + # Return a list of all matches + str.scan(JSON_KEEP_LOCATOR_REGEXP).flatten end private def is_textile?( object, attr ) - is_textile = object.textile_attributes.andand.include?(attr) + object.textile_attributes.andand.include?(attr) end end