mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-11-08 18:24:31 +00:00
[GITEA] Add OpenStreetMap URL to Location field in profile
Not too important, but I think that it'd be a pretty neat touch. (cherry picked from commit64de4e02f9) Add placeholder text (cherry picked from commit1396e2716b) Add test for OSM feature (doesn't work yet) (cherry picked from commit2c94e6d56f) Lint tests (sorry, I'm a bit tired) (cherry picked from commit5731fbb4a4) It finally works, will add more tests later. (cherry picked from commit4437292622) Improve testing (cherry picked from commit56a028ec96) Introduce new button for OpenStreetMap URL (cherry picked from commit852317b467) 16, "gt-mr-2" in *all* icons (cherry picked from commitc2c60a01eb) Wait, I forgot about *that* icon (cherry picked from commit9930f9b8f2) Alright, we just made all the icons in that submenu a bit bolder and more consistent. (cherry picked from commitd5c0009ad0) Remove | Safe attribute, it does exactly the opposite of what I intended it to. (cherry picked from commit1254f2aa9d) Make OSM button configurable (cherry picked from commitba3d76f5ba) Fix tests (tested) (cherry picked from commit22983c65f8) Add more tests (cherry picked from commit4bbcbd37e1) Add tooltip (cherry picked from commitb906008ff1) Revert "16, "gt-mr-2" in *all* icons" This reverts commitc2c60a01eb. (cherry picked from commit02bb52617d) Revert "Wait, I forgot about *that* icon" This reverts commit9930f9b8f2. (cherry picked from commita36d657509) Revert "Alright, we just made all the icons in that submenu a bit bolder and more consistent." This reverts commitd5c0009ad0. (cherry picked from commit27d8d1c5fc)
This commit is contained in:
parent
c758aa56a2
commit
67e66ab40e
7 changed files with 60 additions and 2 deletions
|
|
@ -832,6 +832,9 @@ LEVEL = Info
|
||||||
;; Dependencies can be added from any repository where the user is granted access or only from the current repository depending on this setting.
|
;; Dependencies can be added from any repository where the user is granted access or only from the current repository depending on this setting.
|
||||||
;ALLOW_CROSS_REPOSITORY_DEPENDENCIES = true
|
;ALLOW_CROSS_REPOSITORY_DEPENDENCIES = true
|
||||||
;;
|
;;
|
||||||
|
;; Enable OpenStreetMap button in Location field on user profiles
|
||||||
|
;ENABLE_OSM_BUTTON = true
|
||||||
|
;;
|
||||||
;; Enable heatmap on users profiles.
|
;; Enable heatmap on users profiles.
|
||||||
;ENABLE_USER_HEATMAP = true
|
;ENABLE_USER_HEATMAP = true
|
||||||
;;
|
;;
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,7 @@ var Service = struct {
|
||||||
AllowCrossRepositoryDependencies bool
|
AllowCrossRepositoryDependencies bool
|
||||||
DefaultAllowOnlyContributorsToTrackTime bool
|
DefaultAllowOnlyContributorsToTrackTime bool
|
||||||
NoReplyAddress string
|
NoReplyAddress string
|
||||||
|
EnableOSMButton bool
|
||||||
EnableUserHeatmap bool
|
EnableUserHeatmap bool
|
||||||
AutoWatchNewRepos bool
|
AutoWatchNewRepos bool
|
||||||
AutoWatchOnChanges bool
|
AutoWatchOnChanges bool
|
||||||
|
|
@ -187,6 +188,7 @@ func loadServiceFrom(rootCfg ConfigProvider) {
|
||||||
Service.AllowCrossRepositoryDependencies = sec.Key("ALLOW_CROSS_REPOSITORY_DEPENDENCIES").MustBool(true)
|
Service.AllowCrossRepositoryDependencies = sec.Key("ALLOW_CROSS_REPOSITORY_DEPENDENCIES").MustBool(true)
|
||||||
Service.DefaultAllowOnlyContributorsToTrackTime = sec.Key("DEFAULT_ALLOW_ONLY_CONTRIBUTORS_TO_TRACK_TIME").MustBool(true)
|
Service.DefaultAllowOnlyContributorsToTrackTime = sec.Key("DEFAULT_ALLOW_ONLY_CONTRIBUTORS_TO_TRACK_TIME").MustBool(true)
|
||||||
Service.NoReplyAddress = sec.Key("NO_REPLY_ADDRESS").MustString("noreply." + Domain)
|
Service.NoReplyAddress = sec.Key("NO_REPLY_ADDRESS").MustString("noreply." + Domain)
|
||||||
|
Service.EnableOSMButton = sec.Key("ENABLE_OSM_BUTTON").MustBool(true)
|
||||||
Service.EnableUserHeatmap = sec.Key("ENABLE_USER_HEATMAP").MustBool(true)
|
Service.EnableUserHeatmap = sec.Key("ENABLE_USER_HEATMAP").MustBool(true)
|
||||||
Service.AutoWatchNewRepos = sec.Key("AUTO_WATCH_NEW_REPOS").MustBool(true)
|
Service.AutoWatchNewRepos = sec.Key("AUTO_WATCH_NEW_REPOS").MustBool(true)
|
||||||
Service.AutoWatchOnChanges = sec.Key("AUTO_WATCH_ON_CHANGES").MustBool(false)
|
Service.AutoWatchOnChanges = sec.Key("AUTO_WATCH_ON_CHANGES").MustBool(false)
|
||||||
|
|
|
||||||
|
|
@ -603,6 +603,7 @@ user_bio = Biography
|
||||||
disabled_public_activity = This user has disabled the public visibility of the activity.
|
disabled_public_activity = This user has disabled the public visibility of the activity.
|
||||||
email_visibility.limited = Your email address is visible to all authenticated users
|
email_visibility.limited = Your email address is visible to all authenticated users
|
||||||
email_visibility.private = Your email address is only visible to you and administrators
|
email_visibility.private = Your email address is only visible to you and administrators
|
||||||
|
redirect_to_osm = View on OpenStreetMap
|
||||||
|
|
||||||
form.name_reserved = The username "%s" is reserved.
|
form.name_reserved = The username "%s" is reserved.
|
||||||
form.name_pattern_not_allowed = The pattern "%s" is not allowed in a username.
|
form.name_pattern_not_allowed = The pattern "%s" is not allowed in a username.
|
||||||
|
|
@ -629,6 +630,7 @@ webauthn = Security Keys
|
||||||
|
|
||||||
public_profile = Public Profile
|
public_profile = Public Profile
|
||||||
biography_placeholder = Tell us a little bit about yourself
|
biography_placeholder = Tell us a little bit about yourself
|
||||||
|
location_placeholder = Share your approximate location with others
|
||||||
profile_desc = Your email address will be used for notifications and other operations.
|
profile_desc = Your email address will be used for notifications and other operations.
|
||||||
password_username_disabled = Non-local users are not allowed to change their username. Please contact your site administrator for more details.
|
password_username_disabled = Non-local users are not allowed to change their username. Please contact your site administrator for more details.
|
||||||
full_name = Full Name
|
full_name = Full Name
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ func userProfile(ctx *context.Context) {
|
||||||
|
|
||||||
ctx.Data["Title"] = ctx.ContextUser.DisplayName()
|
ctx.Data["Title"] = ctx.ContextUser.DisplayName()
|
||||||
ctx.Data["PageIsUserProfile"] = true
|
ctx.Data["PageIsUserProfile"] = true
|
||||||
|
ctx.Data["EnableOSMButton"] = setting.Service.EnableOSMButton
|
||||||
|
|
||||||
// prepare heatmap data
|
// prepare heatmap data
|
||||||
if setting.Service.EnableUserHeatmap {
|
if setting.Service.EnableUserHeatmap {
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,17 @@
|
||||||
<div class="extra content gt-word-break">
|
<div class="extra content gt-word-break">
|
||||||
<ul>
|
<ul>
|
||||||
{{if .ContextUser.Location}}
|
{{if .ContextUser.Location}}
|
||||||
<li>{{svg "octicon-location"}} {{.ContextUser.Location}}</li>
|
<li>
|
||||||
|
{{svg "octicon-location"}}
|
||||||
|
{{.ContextUser.Location}}
|
||||||
|
{{if .EnableOSMButton}}
|
||||||
|
<a href="https://www.openstreetmap.org/search?query={{.ContextUser.Location}}" rel="nofollow noreferrer">
|
||||||
|
<i class="ui right" data-tooltip-content="{{.locale.Tr "user.redirect_to_osm"}}">
|
||||||
|
{{svg "octicon-link-external"}}
|
||||||
|
</i>
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
</li>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if (eq .SignedUserID .ContextUser.ID)}}
|
{{if (eq .SignedUserID .ContextUser.ID)}}
|
||||||
<li>
|
<li>
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label for="location">{{.locale.Tr "settings.location"}}</label>
|
<label for="location">{{.locale.Tr "settings.location"}}</label>
|
||||||
<input id="location" name="location" value="{{.SignedUser.Location}}" maxlength="50">
|
<input id="location" name="location" placeholder="{{.locale.Tr "settings.location_placeholder"}}" value="{{.SignedUser.Location}}" maxlength="50">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
package integration
|
package integration
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
|
@ -12,6 +13,7 @@ import (
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
"code.gitea.io/gitea/models/unittest"
|
"code.gitea.io/gitea/models/unittest"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
|
"code.gitea.io/gitea/modules/setting"
|
||||||
api "code.gitea.io/gitea/modules/structs"
|
api "code.gitea.io/gitea/modules/structs"
|
||||||
"code.gitea.io/gitea/modules/test"
|
"code.gitea.io/gitea/modules/test"
|
||||||
"code.gitea.io/gitea/modules/translation"
|
"code.gitea.io/gitea/modules/translation"
|
||||||
|
|
@ -276,3 +278,41 @@ func TestListStopWatches(t *testing.T) {
|
||||||
assert.Greater(t, apiWatches[0].Seconds, int64(0))
|
assert.Greater(t, apiWatches[0].Seconds, int64(0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetOpenStreetMapLink(t *testing.T) {
|
||||||
|
setting.Service.EnableOSMButton = true
|
||||||
|
defer tests.PrepareTestEnv(t)()
|
||||||
|
|
||||||
|
testLocations := map[string]string{
|
||||||
|
"Αθήνα": "%ce%91%ce%b8%ce%ae%ce%bd%ce%b1",
|
||||||
|
" Αθήνα": "%20%20%ce%91%ce%b8%ce%ae%ce%bd%ce%b1",
|
||||||
|
"Barbarossabrunnen, Düsseldorf": "Barbarossabrunnen%2c%20D%c3%bcsseldorf",
|
||||||
|
"39.91025,116.40753": "39.91025%2c116.40753",
|
||||||
|
"པེ་ཅིང་གྲོང་ཁྱེར།": "%e0%bd%94%e0%bd%ba%e0%bc%8b%e0%bd%85%e0%bd%b2%e0%bd%84%e0%bc%8b%e0%bd%82%e0%be%b2%e0%bd%bc%e0%bd%84%e0%bc%8b%e0%bd%81%e0%be%b1%e0%bd%ba%e0%bd%a2%e0%bc%8d",
|
||||||
|
"Internet Archive": "Internet%20Archive",
|
||||||
|
"Schönhauser Allee 2, Berlin, Deutschland": "Sch%c3%b6nhauser%20Allee%202%2c%20Berlin%2c%20Deutschland",
|
||||||
|
"Miestna knižnica Podunajské Biskupice": "Miestna%20kni%c5%benica%20Podunajsk%c3%a9%20Biskupice",
|
||||||
|
"東京タワー": "%e6%9d%b1%e4%ba%ac%e3%82%bf%e3%83%af%e3%83%bc",
|
||||||
|
"Carnarvon Space & Technology Centre": "Carnarvon%20Space%20%26%20Technology%20Centre",
|
||||||
|
}
|
||||||
|
|
||||||
|
session := loginUser(t, "user2")
|
||||||
|
for location, encodedLocation := range testLocations {
|
||||||
|
t.Run(location, func(t *testing.T) {
|
||||||
|
req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{
|
||||||
|
"_csrf": GetCSRF(t, session, "/user/settings"),
|
||||||
|
"name": "user2",
|
||||||
|
"email": "user@example.com",
|
||||||
|
"language": "en-US",
|
||||||
|
"location": location,
|
||||||
|
})
|
||||||
|
session.MakeRequest(t, req, http.StatusSeeOther)
|
||||||
|
|
||||||
|
req = NewRequest(t, "GET", "/user2/")
|
||||||
|
resp := session.MakeRequest(t, req, http.StatusOK)
|
||||||
|
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||||
|
|
||||||
|
htmlDoc.AssertElement(t, fmt.Sprintf("a[href='https://www.openstreetmap.org/search?query=%s']", encodedLocation), true)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue