]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/2667'
authorTom Hughes <tom@compton.nu>
Wed, 5 Aug 2020 20:50:08 +0000 (21:50 +0100)
committerTom Hughes <tom@compton.nu>
Wed, 5 Aug 2020 20:50:08 +0000 (21:50 +0100)
36 files changed:
Gemfile
Gemfile.lock
app/assets/javascripts/application.js
app/assets/javascripts/bs-custom-file-input-init.js [new file with mode: 0644]
app/assets/javascripts/leaflet.layers.js
app/assets/stylesheets/common.scss
app/assets/stylesheets/parameters.scss
app/views/browse/changeset.html.erb
app/views/browse/new_note.html.erb
app/views/browse/note.html.erb
app/views/diary_entries/show.html.erb
app/views/friendships/make_friend.html.erb
app/views/friendships/remove_friend.html.erb
app/views/issues/_comments.html.erb
app/views/issues/index.html.erb
app/views/layouts/_search.html.erb
app/views/messages/_message_summary.html.erb
app/views/oauth_clients/edit.html.erb
app/views/oauth_clients/index.html.erb
app/views/oauth_clients/show.html.erb
app/views/redactions/edit.html.erb
app/views/redactions/new.html.erb
app/views/site/export.html.erb
app/views/traces/edit.html.erb
app/views/traces/new.html.erb
app/views/traces/show.html.erb
app/views/user_blocks/edit.html.erb
app/views/user_blocks/new.html.erb
app/views/user_blocks/revoke.html.erb
app/views/users/confirm.html.erb
app/views/users/confirm_email.html.erb
app/views/users/logout.html.erb
config/locales/en.yml
package.json
test/controllers/traces_controller_test.rb
yarn.lock

diff --git a/Gemfile b/Gemfile
index 540f616343d91a6eced60d9dc5e7d00dcae80571..cfe734b946caf620778c4ced24519b69922e37e8 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -44,6 +44,7 @@ gem "actionpack-page_caching", ">= 1.2.0"
 gem "active_record_union"
 gem "activerecord-import"
 gem "bootstrap", "~> 4.5.0"
+gem "bootstrap_form", "~> 4.0"
 gem "cancancan"
 gem "composite_primary_keys", "~> 12.0.0"
 gem "config"
index 379bab30716313d8ab1e81162f18ea5e63135b16..3b3ffaf060bc9b19e20a7cc569e543b9159b8482 100644 (file)
@@ -110,6 +110,9 @@ GEM
       autoprefixer-rails (>= 9.1.0)
       popper_js (>= 1.14.3, < 2)
       sassc-rails (>= 2.0.0)
+    bootstrap_form (4.5.0)
+      actionpack (>= 5.2)
+      activemodel (>= 5.2)
     brakeman (4.9.0)
     browser (4.2.0)
     builder (3.2.4)
@@ -484,6 +487,7 @@ DEPENDENCIES
   binding_of_caller
   bootsnap (>= 1.4.2)
   bootstrap (~> 4.5.0)
+  bootstrap_form (~> 4.0)
   brakeman
   browser
   bzip2-ffi
index 36b560fde68c4f0132e49a213a3264f76232f5b4..205ad8161ebe263299dbad26336ac9461af07947 100644 (file)
@@ -16,6 +16,8 @@
 //= require piwik
 //= require richtext
 //= require querystring
+//= require bs-custom-file-input
+//= require bs-custom-file-input-init
 
 /*
  * Called as the user scrolls/zooms around to manipulate hrefs of the
diff --git a/app/assets/javascripts/bs-custom-file-input-init.js b/app/assets/javascripts/bs-custom-file-input-init.js
new file mode 100644 (file)
index 0000000..3afdac2
--- /dev/null
@@ -0,0 +1,5 @@
+/* global bsCustomFileInput */
+
+$(document).ready(function () {
+  bsCustomFileInput.init();
+});
index ddcce195daba2d5f7724d2b81ab876d51d6efeeb..f375dc08ffc031adb4721477d00aa4606ecac327 100644 (file)
@@ -119,7 +119,7 @@ L.OSM.layers = function (options) {
         .attr("class", "text-muted")
         .appendTo(overlaySection);
 
-      var overlays = $("<ul class='list-unstyled'>")
+      var overlays = $("<ul class='list-unstyled standard-form'>")
         .appendTo(overlaySection);
 
       var addOverlay = function (layer, name, maxArea) {
index 50bcf9be7b13124c05e9519154e974abf52db565..95e0c292ac4cc9c7abe91791fa55dc4fe0c2931e 100644 (file)
@@ -1,5 +1,6 @@
 @import "parameters";
 @import "bootstrap";
+@import "rails_bootstrap_forms";
 
 /* Styles common to large and small screens */
 
@@ -717,6 +718,14 @@ body.compact-nav {
   }
 }
 
+/* Temporary label size override until we remove site-wide font customisation */
+
+form {
+  label {
+    font-size: 16px;
+  }
+}
+
 /* Rules for the search and direction forms */
 
 header .search_forms,
@@ -724,118 +733,6 @@ header .search_forms,
   display: none;
 }
 
-.search_form,
-.directions_form {
-  position: relative;
-  padding: $lineheight/2;
-  background-color: $lightgrey;
-
-  .query_wrapper {
-    position: relative;
-    overflow: hidden;
-    border-radius: 2px 0 0 2px;
-  }
-
-  input[type=text] {
-    width: 100%;
-    height: 30px;
-    transition: 300ms linear;
-  }
-
-  input[type=text].overflow {
-    border-right: none;
-    border-radius: 3px 0px 0px 3px;
-  }
-
-  input:focus {
-    outline: none;
-    box-shadow: 0px 0px 7px $vibrant-green;
-  }
-
-  input[type=submit].float {
-    float: right;
-    width: auto;
-    min-width: 0;
-    border-radius: 0 2px 2px 0;
-  }
-
-  input.error {
-    background-color: rgba($red, 0.4);
-  }
-
-  select {
-    /* this next line is to polyfill the vertical alignment of text within a select element,
-     * which is different between firefox and chrome. */
-    padding: 0.3em 0;
-  }
-
-  .query_options {
-    text-align: right;
-    font-size: 10px;
-    color: $blue;
-  }
-
-  .describe_location {
-    position: absolute;
-    top: 6px;
-    right: 6px;
-    font-size: 10px;
-    color: $blue;
-  }
-
-  .switch_link {
-    float: right;
-    width: auto;
-    min-width: 0;
-    margin-left: 6px;
-  }
-
-  img.button {
-    display: block;
-    width: 20px;
-    height: 20px;
-  }
-
-  span.force_width {
-    width: 100%;
-    padding-right: 25px;
-    display: block;
-  }
-
-  select.routing_engines {
-    min-height: 30px;
-    margin: 0px 0px 5px 25px;
-  }
-
-  input.routing_go {
-    min-width: 100px;
-    float: right;
-  }
-
-  div.header {
-    width: 100%;
-    height: 30px;
-  }
-
-  div.line {
-    width: 100%;
-    margin: 0px 0px 5px 0px;
-  }
-
-  div.loader_copy {
-    display: none;
-
-    img {
-      vertical-align: middle;
-    }
-  }
-
-  a.reverse_directions {
-    cursor: pointer;
-    margin: 0px 0px 5px 25px;
-  }
-}
-
 /* Rules for the map key which appears in the popout sidebar */
 
 #mapkey {
@@ -1257,30 +1154,6 @@ tr.turn:hover {
   }
 }
 
-/* Rules for the new trace form */
-
-#new_trace {
-  input[type=text] {
-    width: 50%;
-    width: calc(100% - 150px);
-    max-width: 500px;
-  }
-}
-
-/* Rules for the edit trace form */
-
-.edit_trace {
-  .standard-form-row p {
-    margin-bottom: 0px;
-  }
-
-  input[type=text] {
-    width: 50%;
-    width: calc(100% - 150px);
-    max-width: 500px;
-  }
-}
-
 /* Rules for the user profile page */
 
 #userinformation {
@@ -1712,44 +1585,205 @@ tr.turn:hover {
     float: left;
     margin-top: 5px;
   }
-}
 
-#remember_me_openid {
-  display: block;
-}
+  #remember_me_openid {
+    display: block;
+  }
 
-select {
-  padding: 2px;
-}
+  select {
+    padding: 2px;
+  }
 
-input[type="checkbox"],
-input[type="radio"] {
-    margin-right: 5px;
-}
+  input[type="checkbox"],
+  input[type="radio"] {
+      margin-right: 5px;
+  }
 
-input[type="text"],
-input[type="email"],
-input[type="url"],
-input[type="password"],
-textarea {
-  color: #222;
-  background-color: #fff;
-  border: 1px solid $grey;
-  border-radius: 3px;
-  padding: 2px 5px;
-  margin: 0;
-  width: 200px;
+  input[type="text"],
+  input[type="email"],
+  input[type="url"],
+  input[type="password"],
+  textarea {
+    color: #222;
+    background-color: #fff;
+    border: 1px solid $grey;
+    border-radius: 3px;
+    padding: 2px 5px;
+    margin: 0;
+    width: 200px;
 
-  &.field_with_errors {
-    border: 2px solid #ff7070;
+    &.field_with_errors {
+      border: 2px solid #ff7070;
+    }
   }
-}
 
-textarea {
-  padding: 5px;
-  width: 100%;
-  min-height: 50px;
-  resize: vertical;
+  textarea {
+    padding: 5px;
+    width: 100%;
+    min-height: 50px;
+    resize: vertical;
+  }
+
+
+  /* Utility for general button styles */
+
+  input[type="button"],
+  input[type="submit"],
+  input[type="reset"],
+  a.button {
+    cursor: pointer;
+    border: 0;
+    display: inline-block;
+    padding: $lineheight/4 $lineheight/2;
+    min-height: 20px + $lineheight/2;
+    min-width: 120px;
+    margin: 0 0 $lineheight/2 0;
+    color: white;
+    background: $blue;
+    text-align: center;
+    border-radius: 2px;
+    &:hover {
+      background: darken($blue, $hovercolor);
+      text-decoration: none;
+    }
+    &.deemphasize {
+      background: $lightblue;
+      &:hover {
+        background: darken($lightblue, $hovercolor);
+      }
+    }
+    &:disabled {
+      background: $lightgrey;
+      &:hover {
+        background: $lightgrey;
+      }
+    }
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+
+  input[type="button"],
+  input[type="submit"],
+  input[type="reset"] {
+    line-height: normal;
+  }
+
+  a.button {
+    line-height: 20px;
+  }
+
+  .search_form,
+  .directions_form {
+    position: relative;
+    padding: $lineheight/2;
+    background-color: $lightgrey;
+
+    .query_wrapper {
+      position: relative;
+      overflow: hidden;
+      border-radius: 2px 0 0 2px;
+    }
+
+    input[type=text] {
+      width: 100%;
+      height: 30px;
+      transition: 300ms linear;
+    }
+
+    input[type=text].overflow {
+      border-right: none;
+      border-radius: 3px 0px 0px 3px;
+    }
+
+    input:focus {
+      outline: none;
+      box-shadow: 0px 0px 7px $vibrant-green;
+    }
+
+    input[type=submit].float {
+      float: right;
+      width: auto;
+      min-width: 0;
+      border-radius: 0 2px 2px 0;
+    }
+
+    input.error {
+      background-color: rgba($red, 0.4);
+    }
+
+    select {
+      /* this next line is to polyfill the vertical alignment of text within a select element,
+       * which is different between firefox and chrome. */
+      padding: 0.3em 0;
+    }
+
+    .query_options {
+      text-align: right;
+      font-size: 10px;
+      color: $blue;
+    }
+
+    .describe_location {
+      position: absolute;
+      top: 6px;
+      right: 6px;
+      font-size: 10px;
+      color: $blue;
+    }
+
+    .switch_link {
+      float: right;
+      width: auto;
+      min-width: 0;
+      margin-left: 6px;
+    }
+
+    img.button {
+      display: block;
+      width: 20px;
+      height: 20px;
+    }
+
+    span.force_width {
+      width: 100%;
+      padding-right: 25px;
+      display: block;
+    }
+
+    select.routing_engines {
+      min-height: 30px;
+      margin: 0px 0px 5px 25px;
+    }
+
+    input.routing_go {
+      min-width: 100px;
+      float: right;
+    }
+
+    div.header {
+      width: 100%;
+      height: 30px;
+    }
+
+    div.line {
+      width: 100%;
+      margin: 0px 0px 5px 0px;
+    }
+
+    div.loader_copy {
+      display: none;
+
+      img {
+        vertical-align: middle;
+      }
+    }
+
+    a.reverse_directions {
+      cursor: pointer;
+      margin: 0px 0px 5px 25px;
+    }
+  }
 }
 
 /* Rules for user images */
@@ -1829,54 +1863,6 @@ div.secondary-actions {
 
 .inner02 { padding: 0 $lineheight;}
 
-/* Utility for general button styles */
-
-input[type="button"],
-input[type="submit"],
-input[type="reset"],
-a.button {
-  cursor: pointer;
-  border: 0;
-  display: inline-block;
-  padding: $lineheight/4 $lineheight/2;
-  min-height: 20px + $lineheight/2;
-  min-width: 120px;
-  margin: 0 0 $lineheight/2 0;
-  color: white;
-  background: $blue;
-  text-align: center;
-  border-radius: 2px;
-  &:hover {
-    background: darken($blue, $hovercolor);
-    text-decoration: none;
-  }
-  &.deemphasize {
-    background: $lightblue;
-    &:hover {
-      background: darken($lightblue, $hovercolor);
-    }
-  }
-  &:disabled {
-    background: $lightgrey;
-    &:hover {
-      background: $lightgrey;
-    }
-  }
-  &:last-child {
-    margin-bottom: 0;
-  }
-}
-
-input[type="button"],
-input[type="submit"],
-input[type="reset"] {
-  line-height: normal;
-}
-
-a.button {
-  line-height: 20px;
-}
-
 .buttons {
   min-width: 200px;
   input[type="submit"],
index 90fbd74b7d035c65530e1f66dd15427d5f751bc4..5d02604103684a8b830c53fe7a9157ef713e470a 100644 (file)
@@ -8,7 +8,6 @@ $lightblue: #B8C5F0;
 $green: #7ebc6f;
 $vibrant-green: #76c551;
 $grey: #CCC;
-$red: red;
 $lightgrey: #EEE;
 $darkgrey: #888;
 $hovercolor: 20%;
index 5a50aa91f5a789d4c6581e6ebd4d32381b86d445..c15e1f8c61b932735f51a3288016e4af6e8ba334 100644 (file)
@@ -15,7 +15,7 @@
 
   <% if current_user %>
     <div class="buttons clearfix subscribe-buttons">
-      <form action="#">
+      <form action="#" class="standard-form">
         <% if @changeset.subscribers.exists?(current_user.id) %>
           <input class="action-button" type="submit" name="unsubscribe" value="<%= t("javascripts.changesets.show.unsubscribe") %>" data-method="POST" data-url="<%= changeset_unsubscribe_url(@changeset) %>" />
         <% else %>
@@ -29,7 +29,7 @@
 
   <% if @comments.length > 0 %>
     <div class='changeset-comments'>
-      <form action="#">
+      <form action="#" class="standard-form">
         <ul class="list-unstyled">
           <% @comments.each do |comment| %>
             <% if comment.visible %>
@@ -71,7 +71,7 @@
 
   <% if current_user %>
     <% unless @changeset.is_open? %>
-      <form action="#">
+      <form action="#" class="standard-form">
         <textarea class="comment" name="text" cols="40" rows="5"></textarea>
         <div class="buttons clearfix">
           <input type="submit" name="comment" value="<%= t("javascripts.changesets.show.comment") %>" data-changeset-id="<%= @changeset.id %>" data-method="POST" data-url="<%= changeset_comment_url(@changeset) %>" disabled="1" />
index 51633ffca5b6a24e183d6ea7b65fb83f1396d11a..4e4f571cc2b8ea3441d0cc5ab5c1171884d36904 100644 (file)
@@ -7,7 +7,7 @@
 
 <div class="note browse-section">
   <p class="alert alert-info"><%= t("javascripts.notes.new.intro") %></p>
-  <form action="#">
+  <form action="#" class="standard-form">
     <input type="hidden" name="lon">
     <input type="hidden" name="lat">
     <textarea class="comment" name="text" cols="40" rows="10" maxlength="2000" placeholder="<%= t("javascripts.notes.new.advice") %>"></textarea>
index eefd62b0ae7cb43615771182678259f3a73e74dd..1be7d904170cc1f09edb124345892ff520cc9c7d 100644 (file)
@@ -47,7 +47,7 @@
 
   <% if @note.status == "open" %>
     <% if current_user -%>
-      <form action="#">
+      <form action="#" class="standard-form">
         <textarea class="comment" name="text" cols="40" rows="5" maxlength="2000"></textarea>
         <div class="buttons clearfix">
           <% if current_user.moderator? -%>
@@ -59,7 +59,7 @@
       </form>
     <% end -%>
   <% else %>
-    <form action="#">
+    <form action="#" class="standard-form">
       <input type="hidden" name="text" value="">
       <div class="buttons clearfix">
         <% if current_user and current_user.moderator? -%>
index d3a0f70b267a5cfbc409e896aed35ddb14448ad5..4468fc53e6464e879b418d39065dcda1f71f18cd 100644 (file)
@@ -13,7 +13,7 @@
 <%= render :partial => "diary_comment", :collection => @comments %>
 </div>
 
-<div>
+<div class="standard-form">
   <% if current_user %>
     <h3 id="newcomment"><%= t ".leave_a_comment" %></h3>
 
index c02de91f0a1d0a0806aff9a5680bda9cf736281a..e781f7b25fe89022f13b8f4b0bcfe324d3d93617 100644 (file)
@@ -2,7 +2,7 @@
   <h1><%= t ".heading", :user => @new_friend.display_name %></h1>
 <% end %>
 
-<%= form_tag do %>
+<%= form_tag(nil, :class => "standard-form") do %>
   <% if params[:referer] -%>
   <%= hidden_field_tag("referer", params[:referer]) %>
   <% end -%>
index f87c782237a0c4cde790b1da51f6201c3a5aaa53..caaec120be895d67d8491af97c592e4724ef3f60 100644 (file)
@@ -2,7 +2,7 @@
   <h1><%= t ".heading", :user => @friend.display_name %></h1>
 <% end %>
 
-<%= form_tag do %>
+<%= form_tag(nil, :class => "standard-form") do %>
   <% if params[:referer] -%>
   <%= hidden_field_tag("referer", params[:referer]) %>
   <% end -%>
index 54932cc56b4f8f1e3b3905d4cd7760d7993ae470..a0402230421ad894ee674fd4758bb4baf18b68ce 100644 (file)
@@ -14,7 +14,7 @@
   <% end %>
 </div>
 <br />
-<div class="comment">
+<div class="comment standard-form">
   <%= form_for @new_comment, :url => issue_comments_path(@issue) do |f| %>
   <%= richtext_area :issue_comment, :body, :cols => 10, :rows => 8, :required => true %>
   <%= label_tag :reassign, t(".reassign_param") %> <%= check_box_tag :reassign, true %>
index 1f3ca3118f54b824278ab1dc09b979b6c8899a40..1500a3647cc48ce693f4723766cab7e336834cc1 100644 (file)
@@ -2,7 +2,7 @@
   <h1><%= t ".title" %></h1>
 <% end %>
 
-<%= form_tag(issues_path, :method => :get) do %>
+<%= form_tag(issues_path, :method => :get, :class => "standard-form") do %>
 <p><%= t ".search_guidance" %></p>
 <%= select_tag :status, options_for_select(Issue.aasm.states.map(&:name).map { |state| [t(".states.#{state}"), state] }, params[:status]), :include_blank => t(".select_status"), :data => { :behavior => "category_dropdown" } %>
 <%= select_tag :issue_type, options_for_select(@issue_types, params[:issue_type]), :include_blank => t(".select_type"), :data => { :behavior => "category_dropdown" } %>
index bb9aa05b9cfaeae1930001036d21082416a19e14..0ffa4ef504440c5024f4f27c0b62497df0cf6e92 100644 (file)
@@ -1,4 +1,4 @@
-<div class="search_forms">
+<div class="search_forms standard-form">
   <form method="GET" action="<%= search_path %>" class="search_form">
     <%= link_to image_tag("directions.png", :class => "button"), directions_path, :class => "button switch_link", :title => t("site.search.get_directions_title") %>
     <%= submit_tag t("site.search.submit_text"), :class => "float", :data => { :disable_with => false } %>
index 3b732f7befd415552bf9fabbeac2ef44b4861646..1d9630f7152fa992285d4ed7c6b71f80669a164d 100644 (file)
@@ -1,4 +1,4 @@
-<tr id="inbox-<%= message_summary.id %>" class="inbox-row<%= "-unread" unless message_summary.message_read? %>">
+<tr id="inbox-<%= message_summary.id %>" class="standard-form inbox-row<%= "-unread" unless message_summary.message_read? %>">
   <td class="inbox-sender"><%= link_to message_summary.sender.display_name, user_path(message_summary.sender) %></td>
   <td class="inbox-subject"><%= link_to message_summary.title, message_path(message_summary) %></td>
   <td class="inbox-sent"><%= l message_summary.sent_on, :format => :friendly %></td>
index d696baae3e336b07c21e31020a661319fb953078..551bb68fcbd696750d904ccad2cd203482005d4b 100644 (file)
@@ -2,7 +2,7 @@
   <h1><%= t ".title" %></h1>
 <% end %>
 
-<%= form_for @client_application, :url => oauth_client_path(@client_application.user.display_name, @client_application), :html => { :method => :put } do |f| %>
+<%= form_for @client_application, :url => oauth_client_path(@client_application.user.display_name, @client_application), :html => { :method => :put, :class => "standard-form" } do |f| %>
   <%= render :partial => "form", :locals => { :f => f } %>
   <%= f.submit %>
 <% end %>
index 113374e3fb2f3d33db4feac58e7f2d980cfbdaa7..f35537953a9eecac67c8c704ec2d4c6cd4c7e199 100644 (file)
@@ -18,7 +18,7 @@
       <td><%= link_to token.client_application.name, token.client_application.url %></td>
       <td><%= token.authorized_at %></td>
       <td>
-        <%= form_tag :controller => "oauth", :action => "revoke" do %>
+        <%= form_tag({ :controller => "oauth", :action => "revoke" }, { :class => "standard-form" }) do %>
           <%= hidden_field_tag "token", token.token %>
           <%= submit_tag t(".revoke") %>
         <% end %>
index 623b30e1601a5b5b3a3b5e8664d2254d4ff45940..19c1d9f6e7574907d7388160777aca8f563de4e8 100644 (file)
@@ -27,7 +27,7 @@
 
   <p><%= t ".support_notice" %></p>
 </div>
-<div class="buttons">
+<div class="buttons standard-form">
   <%= button_to t(".edit"), edit_oauth_client_path(@client_application.user.display_name, @client_application), :method => :get, :class => "oauth-edit" %>
   <%= button_to t(".delete"), oauth_client_path(@client_application.user.display_name, @client_application), :method => :delete, :data => { :confirm => t(".confirm") }, :class => "oauth-delete deemphasize" %>
 </div>
index cef6188596d756f9c8709238725b7b6954edb640..aff2af919936fd119ebbf14f7f4e01f3075349bf 100644 (file)
@@ -4,7 +4,7 @@
   <h1><%= t ".heading" %></h1>
 <% end %>
 
-<%= form_for(@redaction) do |f| %>
+<%= form_for(@redaction, :html => { :class => "standard-form" }) do |f| %>
   <%= f.error_messages %>
 
   <p>
index a76d8ec48d12e6f82650742c6d34a2fe5fe00dc1..02e729b3570d5f3a7118e6c933fb41c5b78addb5 100644 (file)
@@ -3,7 +3,7 @@
   <h1><%= t ".heading" %></h1>
 <% end %>
 
-<%= form_for(@redaction) do |f| %>
+<%= form_for(@redaction, :html => { :class => "standard-form" }) do |f| %>
   <%= f.error_messages %>
 
   <p>
index 2eb23f755102ed463c7517f2c4081841c8c37a64..b6d91ca3194bc12a609ad4002d9c4b758372f67d 100644 (file)
@@ -5,7 +5,7 @@
   <%= t ".title" %>
 </h2>
 
-<%= form_tag({ :controller => "export", :action => "finish" }, { :class => "export_form" }) do %>
+<%= form_tag({ :controller => "export", :action => "finish" }, { :class => "export_form standard-form" }) do %>
   <%= hidden_field_tag "format", "osm" %>
 
   <div class='export_area_inputs'>
index e3771bac0b225d3390860c3ae5593cb6960d778c..13829727c9378b6443daf46af126ae82fc578cf3 100644 (file)
@@ -4,52 +4,16 @@
 
 <img src="<%= url_for :controller => "traces", :action => "picture", :id => @trace.id, :display_name => @trace.user.display_name %>">
 
-<%= form_for @trace do |f| %>
-
-<div id='edit-trace-form' class='standard-form'>
-  <fieldset>
-    <div class='standard-form-row'>
-      <label class='standard-label'><%= t ".filename" %></label>
-      <p class='deemphasize'><%= @trace.name %> (<%= link_to t(".download"), trace_data_path(@trace) %>)</p>
-    </div>
-    <div class='standard-form-row'>
-      <label class='standard-label'><%= t ".uploaded_at" %></label>
-      <p class='deemphasize'><%= l @trace.timestamp, :format => :friendly %></p>
-    </div>
-  <% if @trace.inserted? %>
-    <div class='standard-form-row'>
-      <label class='standard-label'><%= t ".points" %></label>
-      <p class='deemphasize'><%= @trace.size.to_s.gsub(/(\d)(?=(\d{3})+$)/, '\1,') %></p>
-    </div>
-    <div class='standard-form-row'>
-      <label class='standard-label'><%= t ".start_coord" %></label>
-    </div>
-    <div class="geo">
-      <span class="latitude"><%= @trace.latitude %></span>;
-      <span class="longitude"><%= @trace.longitude %></span>
-    </div>
-    (<%= link_to t(".map"), :controller => "site", :action => "index", :anchor => "map=14/#{@trace.latitude}/#{@trace.longitude}" %> / <%= link_to t(".edit"), :controller => "site", :action => "edit", :gpx => @trace.id, :anchor => "map=14/#{@trace.latitude}/#{@trace.longitude}" %>)
-  <% end %>
-    <div class='standard-form-row'>
-      <label class='standard-label'><%= t ".owner" %></label>
-      <p class='deemphasize'><%= link_to @trace.user.display_name, user_path(@trace.user) %></p>
-    </div>
-    <div class='standard-form-row'>
-      <label class='standard-label'><%= t ".description" %></label>
-      <%= f.text_field :description %>
-    </div>
-    <div class='standard-form-row'>
-      <label class='standard-label'><%= t ".tags" %></label>
-      <%= f.text_field :tagstring %> (<%= t ".tags_help" %>)
-    </div>
-    <div class='standard-form-row'>
-      <label class='standard-label'><%= t ".visibility" %></label>
-      <%= f.select :visibility, [[t("traces.visibility.private"), "private"], [t("traces.visibility.public"), "public"], [t("traces.visibility.trackable"), "trackable"], [t("traces.visibility.identifiable"), "identifiable"]] %> (<a href="<%= t ".visibility_help_url" %>"><%= t ".visibility_help" %></a>)
-    </div>
-  </fieldset>
-
-</div>
-
-<%= f.submit %>
-
+<%= bootstrap_form_for @trace do |f| %>
+  <%= f.text_field :name, :disabled => true %>
+  <%= f.text_field :description %>
+  <%= f.text_field :tagstring %>
+  <%= f.select :visibility,
+               [[t("traces.visibility.private"), "private"],
+                [t("traces.visibility.public"), "public"],
+                [t("traces.visibility.trackable"), "trackable"],
+                [t("traces.visibility.identifiable"), "identifiable"]],
+               :help => link_to(t(".visibility_help"), t(".visibility_help_url")) %>
+  <%= f.primary %>
+  <%= link_to t(".cancel"), show_trace_path(@trace.user, @trace), :class => "btn btn-link" %>
 <% end %>
index d2ccebb4cd4621922ab1bd7bbc69c411eba6de63..b7951cb32eb8f167f46b11e0cef5500441ec4323 100644 (file)
@@ -2,32 +2,16 @@
   <h1><%= t ".upload_trace" %></h1>
 <% end %>
 
-<%= error_messages_for "trace" %>
-
-<%= form_for @trace, :url => { :action => "create" }, :html => { :multipart => true } do |f| %>
-  <div class="standard-form">
-    <fieldset>
-      <div class='standard-form-row'>
-        <label for="trace_gpx_file" class="standard-label"><%= t ".upload_gpx" %></label>
-        <%= f.file_field :gpx_file %>
-      </div>
-      <div class='standard-form-row'>
-        <label class="standard-label"><%= t ".description" %></label>
-        <%= f.text_field :description %>
-      </div>
-      <div class='standard-form-row'>
-        <label class="standard-label"><%= t ".tags" %></label>
-        <%= f.text_field :tagstring %>
-        <span class="form-help deemphasize">(<%= t ".tags_help" %>)</span>
-      </div>
-      <div class='standard-form-row'>
-        <label class="standard-label"><%= t ".visibility" %></label>
-        <%= f.select :visibility, [[t("traces.visibility.private"), "private"], [t("traces.visibility.public"), "public"], [t("traces.visibility.trackable"), "trackable"], [t("traces.visibility.identifiable"), "identifiable"]] %>
-        <span class="form-help deemphasize">(<a href="<%= t ".visibility_help_url" %>"><%= t ".visibility_help" %></a>)</span>
-      </div>
-    </fieldset>
-
-    <%= f.submit %>
-    <span class="form-help deemphasize"><a href="<%= t ".help_url" %>"><%= t ".help" %></a></span>
-  </div>
+<%= bootstrap_form_for @trace, :url => { :action => "create" }, :html => { :multipart => true } do |f| %>
+  <%= f.file_field :gpx_file, :placeholder => t("helpers.file.prompt") %>
+  <%= f.text_field :description %>
+  <%= f.text_field :tagstring %>
+  <%= f.select :visibility,
+               [[t("traces.visibility.private"), "private"],
+                [t("traces.visibility.public"), "public"],
+                [t("traces.visibility.trackable"), "trackable"],
+                [t("traces.visibility.identifiable"), "identifiable"]],
+               :help => link_to(t(".visibility_help"), t(".visibility_help_url")) %>
+  <%= f.primary %>
+  <%= link_to t(".help"), t(".help_url"), :class => "btn btn-link" %>
 <% end %>
index f7517c8021b22ddc167ec849a50ac4c333e19282..d82c51881b6d645f8760ceac521a289477c27a8b 100644 (file)
 <br /><br />
 
 <% if current_user && (current_user==@trace.user || current_user.administrator? || current_user.moderator?) %>
-  <div class="buttons">
+  <div>
     <% if current_user == @trace.user %>
-      <%= link_to t(".edit_trace"), edit_trace_path(@trace), :class => "button" %>
+      <%= link_to t(".edit_trace"), edit_trace_path(@trace), :class => "btn btn-outline-primary" %>
     <% end %>
-    <%= button_to t(".delete_trace"), { :controller => "traces", :action => "destroy", :id => @trace.id }, { :method => :delete, :data => { :confirm => t(".confirm_delete") } } %>
+    <%= link_to t(".delete_trace"), { :controller => "traces", :action => "destroy", :id => @trace.id }, { :method => :delete, :class => "btn btn-outline-danger", :data => { :confirm => t(".confirm_delete") } } %>
   </div>
 <% end %>
index 7b2471eab4b189011069072e5e5a8f2026339fac..6d06eeb87a9e07dddbc833eede201fff47f9f24f 100644 (file)
@@ -9,7 +9,7 @@
   </ul>
 <% end %>
 
-<%= form_for(@user_block) do |f| %>
+<%= form_for(@user_block, :html => { :class => "standard-form" }) do |f| %>
   <%= f.error_messages %>
 
   <p>
index c2832e348a5792a2f53c5f8beb97142ab0f8151a..1ebba0f042ef79feb8b83a6d995d89811439f73d 100644 (file)
@@ -4,7 +4,7 @@
             :name => link_to(@user.display_name,
                              user_path(@user))) %></h1>
 <% end %>
-<%= form_for(@user_block) do |f| %>
+<%= form_for(@user_block, :html => { :class => "standard-form" }) do |f| %>
   <%= f.error_messages %>
 
   <p>
index ce14bf0d2df08b67d8dacf94c4c08640a3d4677b..0b6e2178877edae1e14b3de4b1c7e2a2a7b8f800 100644 (file)
@@ -15,7 +15,7 @@
   <%= t(".time_future", :time => distance_of_time_in_words_to_now(@user_block.ends_at)) %>
 </b></p>
 
-<%= form_for :revoke, :url => { :action => "revoke" } do |f| %>
+<%= form_for :revoke, :url => { :action => "revoke" }, :html => { :class => "standard-form" } do |f| %>
   <%= f.error_messages %>
 <p>
   <%= check_box_tag "confirm", "yes" %>
index a3902c0a920a0b07ae746b7da70c0c305501228f..4ea5ac5c58d67c9d12340bdf2e21f13c9ca769dc 100644 (file)
@@ -12,7 +12,7 @@
 
   <p><%= t ".press confirm button" %></p>
 
-  <%= form_tag({}, { :id => "confirm" }) do %>
+  <%= form_tag({}, { :id => "confirm", :class => "standard-form" }) do %>
     <input type="display_name" name="confirm_string" value="<%= params[:display_name] %>">
     <input type="hidden" name="confirm_string" value="<%= params[:confirm_string] %>">
     <input type="submit" name="confirm_action" value="<%= t ".button" %>">
index 65dca50aa4c1d683042f93154ab6a6352a0002ff..ba2726d425526bbdffaf922484b3dd15ac356849 100644 (file)
@@ -10,7 +10,7 @@
 
 <p><%= t ".press confirm button" %></p>
 
-<%= form_tag({}, { :id => "confirm" }) do %>
+<%= form_tag({}, { :id => "confirm", :class => "standard-form" }) do %>
   <input type="hidden" name="confirm_string" value="<%= params[:confirm_string] %>">
   <input type="submit" name="confirm_action" value="<%= t ".button" %>">
 <% end %>
index 5d8e2de492420246e5c5b086937897a846db86c5..41493e82479cde5c784e27d9852d80261dc7e226 100644 (file)
@@ -2,7 +2,7 @@
   <h1><%= t ".heading" %></h1>
 <% end %>
 
-<%= form_tag :action => "logout" do %>
+<%= form_tag({ :action => "logout" }, { :class => "standard-form" }) do %>
   <%= hidden_field_tag("referer", h(params[:referer])) %>
   <%= submit_tag t(".logout_button") %>
 <% end %>
index 30e8f6e98fc1cc8cfb7283ae129bf1e5f5b57d65..185129e83f58fb4a977df653e3033f216b44e423 100644 (file)
@@ -6,6 +6,8 @@ en:
       friendly: "%e %B %Y at %H:%M"
       blog: "%e %B %Y"
   helpers:
+    file:
+      prompt: Choose file
     submit:
       diary_comment:
         create: Save
@@ -93,6 +95,10 @@ en:
         longitude: "Longitude"
         public: "Public"
         description: "Description"
+        name: Filename
+        gpx_file: Upload GPX File
+        visibility: Visibility
+        tagstring: Tags
       message:
         sender: "Sender"
         title: "Subject"
@@ -105,6 +111,9 @@ en:
         description: "Description"
         languages: "Languages"
         pass_crypt: "Password"
+    help:
+      trace:
+        tagstring: comma delimited
   datetime:
     distance_in_words_ago:
       about_x_hours:
@@ -1823,11 +1832,6 @@ en:
       identifiable: "Identifiable (shown in trace list and as identifiable, ordered points with timestamps)"
     new:
       upload_trace: "Upload GPS Trace"
-      upload_gpx: "Upload GPX File:"
-      description: "Description:"
-      tags: "Tags:"
-      tags_help: "comma delimited"
-      visibility: "Visibility:"
       visibility_help: "what does this mean?"
       visibility_help_url: "https://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces"
       help: "Help"
@@ -1840,20 +1844,9 @@ en:
         one: "You have %{count} trace waiting for upload. Please consider waiting for these to finish before uploading any more, so as not to block the queue for other users."
         other: "You have %{count} traces waiting for upload. Please consider waiting for these to finish before uploading any more, so as not to block the queue for other users."
     edit:
+      cancel: Cancel
       title: "Editing trace %{name}"
       heading: "Editing trace %{name}"
-      filename: "Filename:"
-      download: "download"
-      uploaded_at: "Uploaded:"
-      points: "Points:"
-      start_coord: "Start coordinate:"
-      map: "map"
-      edit: "edit"
-      owner: "Owner:"
-      description: "Description:"
-      tags: "Tags:"
-      tags_help: "comma delimited"
-      visibility: "Visibility:"
       visibility_help: "what does this mean?"
       visibility_help_url: "https://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces"
     update:
index 82bc5ead5d176bad74adc27f6708b06e1f9dd803..b1bf411d9926ccf229830c11a2c7082d0ac8a4cb 100644 (file)
@@ -1,7 +1,9 @@
 {
   "name": "openstreetmap",
   "private": true,
-  "dependencies": {},
+  "dependencies": {
+    "bs-custom-file-input": "^1.3.4"
+  },
   "devDependencies": {
     "eslint": "^7.3.1"
   }
index fd91fa6175df7875686553d6c6ca84f096c63c0c..364142dd9a669b4aaf52352d16dc57c46419c7ea 100644 (file)
@@ -616,7 +616,7 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     session_for(user)
     post traces_path, :params => { :trace => { :gpx_file => file, :description => "", :tagstring => "new,trace", :visibility => "trackable" } }
     assert_template :new
-    assert_match "Description is too short (minimum is 1 character)", response.body
+    assert_match "is too short (minimum is 1 character)", response.body
   end
 
   # Test fetching the edit page for a trace using GET
index 86db5ca5b9892b815e196eee8b4b5cacb73c7c0d..337eef0ec5c67704c845adcff1facd516699bf9f 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
@@ -98,6 +98,11 @@ brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
+bs-custom-file-input@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/bs-custom-file-input/-/bs-custom-file-input-1.3.4.tgz#c275cb8d4f1c02ba026324292509fa9a747dbda8"
+  integrity sha512-NBsQzTnef3OW1MvdKBbMHAYHssCd613MSeJV7z2McXznWtVMnJCy7Ckyc+PwxV6Pk16cu6YBcYWh/ZE0XWNKCA==
+
 callsites@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"