Project

General

Profile

Patch #37559 ยป 0001-Use-meta-element-instead-of-javascript-object.patch

Takashi Kato, 2022-08-07 04:14

View differences:

app/helpers/application_helper.rb
1826 1826
    end
1827 1827
  end
1828 1828

  
1829
  def heads_for_auto_complete(project)
1830
    data_sources = autocomplete_data_sources(project)
1831
    javascript_tag(
1832
      "rm = window.rm || {};" \
1833
      "rm.AutoComplete = rm.AutoComplete || {};" \
1834
      "rm.AutoComplete.dataSources = JSON.parse('#{data_sources.to_json}');"
1835
    )
1836
  end
1837

  
1838
  def update_data_sources_for_auto_complete(data_sources)
1839
    javascript_tag(
1840
      "rm.AutoComplete.dataSources = Object.assign(rm.AutoComplete.dataSources, JSON.parse('#{data_sources.to_json}'));"
1841
    )
1842
  end
1843

  
1844 1829
  def copy_object_url_link(url)
1845 1830
    link_to_function(
1846 1831
      l(:button_copy_link), 'copyTextToClipboard(this);',
......
1875 1860

  
1876 1861
  def autocomplete_data_sources(project)
1877 1862
    {
1878
      issues: auto_complete_issues_path(project_id: project, q: ''),
1879
      wiki_pages: auto_complete_wiki_pages_path(project_id: project, q: ''),
1863
      autocomplete_issues:     auto_complete_issues_path(project_id: project, q: ''),
1864
      autocomplete_wiki_pages: auto_complete_wiki_pages_path(project_id: project, q: ''),
1880 1865
    }
1881 1866
  end
1882 1867
end
app/views/issues/_form.html.erb
53 53
<% end %>
54 54

  
55 55
<% heads_for_wiki_formatter %>
56
<%= heads_for_auto_complete(@issue.project) %>
56

  
57
<% autocomplete_data_sources(@issue.project).each do |name, content| %>
58
<% content_for name, content %>
59
<% end %>
57 60

  
58 61
<% if User.current.allowed_to?(:add_issue_watchers, @issue.project)%>
59
  <%= update_data_sources_for_auto_complete({users: watchers_autocomplete_for_mention_path(project_id: @issue.project, q: '', object_type: 'issue',
60
   object_id: @issue.id)}) %>
62
  <% content = watchers_autocomplete_for_mention_path(project_id: @issue.project, q: '', object_type: 'issue', object_id: @issue.id) %>
63
  <%= tag.meta name: :autocomplete_users, content: content %>
61 64
<% end %>
62 65

  
63 66
<%= javascript_tag do %>
app/views/layouts/base.html.erb
13 13
<%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
14 14
<%= javascript_heads %>
15 15
<%= heads_for_theme %>
16
<%= heads_for_auto_complete(@project) %>
17 16
<%= call_hook :view_layouts_base_html_head %>
18 17
<!-- page specific tags -->
19 18
<%= yield :header_tags -%>
20 19
</head>
21 20
<body class="<%= body_css_classes %>">
22 21
<%= call_hook :view_layouts_base_body_top %>
22

  
23
<% autocomplete_data_sources(@project).each do |name, content| %>
24
  <%= tag.meta name: name, content: (content_for?(name) ? yield(name) : content) %>
25
<% end %>
26

  
23 27
<div id="wrapper">
24 28

  
25 29
<div class="flyout-menu js-flyout-menu">
app/views/wiki/edit.html.erb
66 66
<%= wikitoolbar_for 'content_text', preview_project_wiki_page_path(:project_id => @project, :id => @page.title) %>
67 67

  
68 68
<% if User.current.allowed_to?(:add_wiki_page_watchers, @project)%>
69
  <%= update_data_sources_for_auto_complete({users: watchers_autocomplete_for_mention_path(project_id: @project, q: '', object_type: 'wiki_page', object_id: @page.id)}) %>
69
  <% content = watchers_autocomplete_for_mention_path(project_id: @project, q: '', object_type: 'wiki_page', object_id: @page.id) %>
70
  <%= tag.meta name: :autocomplete_users, content: content %>
70 71
  <% end %>
71 72
<% end %>
72 73

  
public/javascripts/application.js
1127 1127
    if (element.dataset.tribute === 'true') {return};
1128 1128

  
1129 1129
    const getDataSource = function(entity) {
1130
      const dataSources = rm.AutoComplete.dataSources;
1131

  
1132
      if (dataSources[entity]) {
1133
        return dataSources[entity];
1134
      } else {
1135
        return false;
1136
      }
1130
      const element = document.body.querySelector(`meta[name="${entity}"]`)
1131
      return element && element.content
1137 1132
    }
1138 1133

  
1139 1134
    const remoteSearch = function(url, cb) {
......
1161 1156
            if (event.target.type === 'text' && $(element).attr('autocomplete') != 'off') {
1162 1157
              $(element).attr('autocomplete', 'off');
1163 1158
            }
1164
            remoteSearch(getDataSource('issues') + text, function (issues) {
1159
            remoteSearch(getDataSource('autocomplete_issues') + text, function (issues) {
1165 1160
              return cb(issues);
1166 1161
            });
1167 1162
          },
......
1178 1173
        {
1179 1174
          trigger: '[[',
1180 1175
          values: function (text, cb) {
1181
            remoteSearch(getDataSource('wiki_pages') + text, function (wikiPages) {
1176
            remoteSearch(getDataSource('autocomplete_wiki_pages') + text, function (wikiPages) {
1182 1177
              return cb(wikiPages);
1183 1178
            });
1184 1179
          },
......
1198 1193
            return user.name + user.firstname + user.lastname + user.login;
1199 1194
          },
1200 1195
          values: function (text, cb) {
1201
            const url = getDataSource('users');
1196
            const url = getDataSource('autocomplete_users');
1202 1197
            if (url) {
1203 1198
              remoteSearch(url + text, function (users) {
1204 1199
                return cb(users);
    (1-1/1)