mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-09-10 17:01:26 +02: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
|
@ -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…
Reference in a new issue