mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Merge template functions "dict/Dict/mergeinto" (#23932)
One of the steps in #23328 Before there were 3 different but similar functions: dict/Dict/mergeinto The code was just copied & pasted, no test. This PR defines a new stable `dict` function, it covers all the 3 old functions behaviors, only +160 -171 Future developers do not need to think about or guess the different dict functions, just use one: `dict` Why use `dict` but not `Dict`? Because there are far more `dict` than `Dict` in code already ......
This commit is contained in:
		@@ -8,7 +8,6 @@ import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"html"
 | 
			
		||||
	"html/template"
 | 
			
		||||
@@ -219,20 +218,6 @@ func NewFuncMap() []template.FuncMap {
 | 
			
		||||
		"DisableImportLocal": func() bool {
 | 
			
		||||
			return !setting.ImportLocalPaths
 | 
			
		||||
		},
 | 
			
		||||
		"Dict": func(values ...interface{}) (map[string]interface{}, error) {
 | 
			
		||||
			if len(values)%2 != 0 {
 | 
			
		||||
				return nil, errors.New("invalid dict call")
 | 
			
		||||
			}
 | 
			
		||||
			dict := make(map[string]interface{}, len(values)/2)
 | 
			
		||||
			for i := 0; i < len(values); i += 2 {
 | 
			
		||||
				key, ok := values[i].(string)
 | 
			
		||||
				if !ok {
 | 
			
		||||
					return nil, errors.New("dict keys must be strings")
 | 
			
		||||
				}
 | 
			
		||||
				dict[key] = values[i+1]
 | 
			
		||||
			}
 | 
			
		||||
			return dict, nil
 | 
			
		||||
		},
 | 
			
		||||
		"Printf":   fmt.Sprintf,
 | 
			
		||||
		"Escape":   Escape,
 | 
			
		||||
		"Sec2Time": util.SecToTime,
 | 
			
		||||
@@ -242,35 +227,7 @@ func NewFuncMap() []template.FuncMap {
 | 
			
		||||
		"DefaultTheme": func() string {
 | 
			
		||||
			return setting.UI.DefaultTheme
 | 
			
		||||
		},
 | 
			
		||||
		// pass key-value pairs to a partial template which receives them as a dict
 | 
			
		||||
		"dict": func(values ...interface{}) (map[string]interface{}, error) {
 | 
			
		||||
			if len(values) == 0 {
 | 
			
		||||
				return nil, errors.New("invalid dict call")
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			dict := make(map[string]interface{})
 | 
			
		||||
			return util.MergeInto(dict, values...)
 | 
			
		||||
		},
 | 
			
		||||
		/* like dict but merge key-value pairs into the first dict and return it */
 | 
			
		||||
		"mergeinto": func(root map[string]interface{}, values ...interface{}) (map[string]interface{}, error) {
 | 
			
		||||
			if len(values) == 0 {
 | 
			
		||||
				return nil, errors.New("invalid mergeinto call")
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			dict := make(map[string]interface{})
 | 
			
		||||
			for key, value := range root {
 | 
			
		||||
				dict[key] = value
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return util.MergeInto(dict, values...)
 | 
			
		||||
		},
 | 
			
		||||
		"percentage": func(n int, values ...int) float32 {
 | 
			
		||||
			sum := 0
 | 
			
		||||
			for i := 0; i < len(values); i++ {
 | 
			
		||||
				sum += values[i]
 | 
			
		||||
			}
 | 
			
		||||
			return float32(n) * 100 / float32(sum)
 | 
			
		||||
		},
 | 
			
		||||
		"dict":                dict,
 | 
			
		||||
		"CommentMustAsDiff":   gitdiff.CommentMustAsDiff,
 | 
			
		||||
		"MirrorRemoteAddress": mirrorRemoteAddress,
 | 
			
		||||
		"NotificationSettings": func() map[string]interface{} {
 | 
			
		||||
@@ -413,52 +370,13 @@ func NewTextFuncMap() []texttmpl.FuncMap {
 | 
			
		||||
		},
 | 
			
		||||
		"EllipsisString": base.EllipsisString,
 | 
			
		||||
		"URLJoin":        util.URLJoin,
 | 
			
		||||
		"Dict": func(values ...interface{}) (map[string]interface{}, error) {
 | 
			
		||||
			if len(values)%2 != 0 {
 | 
			
		||||
				return nil, errors.New("invalid dict call")
 | 
			
		||||
			}
 | 
			
		||||
			dict := make(map[string]interface{}, len(values)/2)
 | 
			
		||||
			for i := 0; i < len(values); i += 2 {
 | 
			
		||||
				key, ok := values[i].(string)
 | 
			
		||||
				if !ok {
 | 
			
		||||
					return nil, errors.New("dict keys must be strings")
 | 
			
		||||
				}
 | 
			
		||||
				dict[key] = values[i+1]
 | 
			
		||||
			}
 | 
			
		||||
			return dict, nil
 | 
			
		||||
		},
 | 
			
		||||
		"Printf":   fmt.Sprintf,
 | 
			
		||||
		"Escape":   Escape,
 | 
			
		||||
		"Sec2Time": util.SecToTime,
 | 
			
		||||
		"Printf":         fmt.Sprintf,
 | 
			
		||||
		"Escape":         Escape,
 | 
			
		||||
		"Sec2Time":       util.SecToTime,
 | 
			
		||||
		"ParseDeadline": func(deadline string) []string {
 | 
			
		||||
			return strings.Split(deadline, "|")
 | 
			
		||||
		},
 | 
			
		||||
		"dict": func(values ...interface{}) (map[string]interface{}, error) {
 | 
			
		||||
			if len(values) == 0 {
 | 
			
		||||
				return nil, errors.New("invalid dict call")
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			dict := make(map[string]interface{})
 | 
			
		||||
 | 
			
		||||
			for i := 0; i < len(values); i++ {
 | 
			
		||||
				switch key := values[i].(type) {
 | 
			
		||||
				case string:
 | 
			
		||||
					i++
 | 
			
		||||
					if i == len(values) {
 | 
			
		||||
						return nil, errors.New("specify the key for non array values")
 | 
			
		||||
					}
 | 
			
		||||
					dict[key] = values[i]
 | 
			
		||||
				case map[string]interface{}:
 | 
			
		||||
					m := values[i].(map[string]interface{})
 | 
			
		||||
					for i, v := range m {
 | 
			
		||||
						dict[i] = v
 | 
			
		||||
					}
 | 
			
		||||
				default:
 | 
			
		||||
					return nil, errors.New("dict values must be maps")
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return dict, nil
 | 
			
		||||
		},
 | 
			
		||||
		"dict":        dict,
 | 
			
		||||
		"QueryEscape": url.QueryEscape,
 | 
			
		||||
		"Eval":        Eval,
 | 
			
		||||
	}}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										47
									
								
								modules/templates/util.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								modules/templates/util.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
// Copyright 2023 The Gitea Authors. All rights reserved.
 | 
			
		||||
// SPDX-License-Identifier: MIT
 | 
			
		||||
 | 
			
		||||
package templates
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func dictMerge(base map[string]any, arg any) bool {
 | 
			
		||||
	if arg == nil {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	rv := reflect.ValueOf(arg)
 | 
			
		||||
	if rv.Kind() == reflect.Map {
 | 
			
		||||
		for _, k := range rv.MapKeys() {
 | 
			
		||||
			base[k.String()] = rv.MapIndex(k).Interface()
 | 
			
		||||
		}
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dict is a helper function for creating a map[string]any from a list of key-value pairs.
 | 
			
		||||
// If the key is dot ".", the value is merged into the base map, just like Golang template's dot syntax: dot means current
 | 
			
		||||
// The dot syntax is highly discouraged because it might cause unclear key conflicts. It's always good to use explicit keys.
 | 
			
		||||
func dict(args ...any) (map[string]any, error) {
 | 
			
		||||
	if len(args)%2 != 0 {
 | 
			
		||||
		return nil, fmt.Errorf("invalid dict constructor syntax: must have key-value pairs")
 | 
			
		||||
	}
 | 
			
		||||
	m := make(map[string]any, len(args)/2)
 | 
			
		||||
	for i := 0; i < len(args); i += 2 {
 | 
			
		||||
		key, ok := args[i].(string)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return nil, fmt.Errorf("invalid dict constructor syntax: unable to merge args[%d]", i)
 | 
			
		||||
		}
 | 
			
		||||
		if key == "." {
 | 
			
		||||
			if ok = dictMerge(m, args[i+1]); !ok {
 | 
			
		||||
				return nil, fmt.Errorf("invalid dict constructor syntax: dot arg[%d] must be followed by a dict", i)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			m[key] = args[i+1]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return m, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								modules/templates/util_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								modules/templates/util_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
// Copyright 2023 The Gitea Authors. All rights reserved.
 | 
			
		||||
// SPDX-License-Identifier: MIT
 | 
			
		||||
 | 
			
		||||
package templates
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestDict(t *testing.T) {
 | 
			
		||||
	type M map[string]any
 | 
			
		||||
	cases := []struct {
 | 
			
		||||
		args []any
 | 
			
		||||
		want map[string]any
 | 
			
		||||
	}{
 | 
			
		||||
		{[]any{"a", 1, "b", 2}, M{"a": 1, "b": 2}},
 | 
			
		||||
		{[]any{".", M{"base": 1}, "b", 2}, M{"base": 1, "b": 2}},
 | 
			
		||||
		{[]any{"a", 1, ".", M{"extra": 2}}, M{"a": 1, "extra": 2}},
 | 
			
		||||
		{[]any{"a", 1, ".", map[string]int{"int": 2}}, M{"a": 1, "int": 2}},
 | 
			
		||||
		{[]any{".", nil, "b", 2}, M{"b": 2}},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, c := range cases {
 | 
			
		||||
		got, err := dict(c.args...)
 | 
			
		||||
		if assert.NoError(t, err) {
 | 
			
		||||
			assert.EqualValues(t, c.want, got)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bads := []struct {
 | 
			
		||||
		args []any
 | 
			
		||||
	}{
 | 
			
		||||
		{[]any{"a", 1, "b"}},
 | 
			
		||||
		{[]any{1}},
 | 
			
		||||
		{[]any{struct{}{}}},
 | 
			
		||||
	}
 | 
			
		||||
	for _, c := range bads {
 | 
			
		||||
		_, err := dict(c.args...)
 | 
			
		||||
		assert.Error(t, err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -6,7 +6,6 @@ package util
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math/big"
 | 
			
		||||
	"strconv"
 | 
			
		||||
@@ -117,29 +116,6 @@ func NormalizeEOL(input []byte) []byte {
 | 
			
		||||
	return tmp[:pos]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MergeInto merges pairs of values into a "dict"
 | 
			
		||||
func MergeInto(dict map[string]interface{}, values ...interface{}) (map[string]interface{}, error) {
 | 
			
		||||
	for i := 0; i < len(values); i++ {
 | 
			
		||||
		switch key := values[i].(type) {
 | 
			
		||||
		case string:
 | 
			
		||||
			i++
 | 
			
		||||
			if i == len(values) {
 | 
			
		||||
				return nil, errors.New("specify the key for non array values")
 | 
			
		||||
			}
 | 
			
		||||
			dict[key] = values[i]
 | 
			
		||||
		case map[string]interface{}:
 | 
			
		||||
			m := values[i].(map[string]interface{})
 | 
			
		||||
			for i, v := range m {
 | 
			
		||||
				dict[i] = v
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
			return nil, errors.New("dict values must be maps")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return dict, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CryptoRandomInt returns a crypto random integer between 0 and limit, inclusive
 | 
			
		||||
func CryptoRandomInt(limit int64) (int64, error) {
 | 
			
		||||
	rInt, err := rand.Int(rand.Reader, big.NewInt(limit))
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@
 | 
			
		||||
					</div>
 | 
			
		||||
					<div class="ui attached segment members">
 | 
			
		||||
						{{range .Members}}
 | 
			
		||||
							{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .}}
 | 
			
		||||
							{{template "shared/user/avatarlink" dict "Context" $.Context "user" .}}
 | 
			
		||||
						{{end}}
 | 
			
		||||
					</div>
 | 
			
		||||
					<div class="ui bottom attached header">
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
	{{if .OriginalAuthor}}
 | 
			
		||||
		<span class="avatar"><img src="{{AppSubUrl}}/assets/img/avatar_default.png"></span>
 | 
			
		||||
	{{else}}
 | 
			
		||||
		{{template "shared/user/avatarlink" Dict "Context" $.root.Context "user" .Poster}}
 | 
			
		||||
		{{template "shared/user/avatarlink" dict "Context" $.root.Context "user" .Poster}}
 | 
			
		||||
	{{end}}
 | 
			
		||||
	<div class="content comment-container">
 | 
			
		||||
		<div class="ui top attached header comment-header gt-df gt-ac gt-sb">
 | 
			
		||||
@@ -42,8 +42,8 @@
 | 
			
		||||
						</div>
 | 
			
		||||
					{{end}}
 | 
			
		||||
				{{end}}
 | 
			
		||||
				{{template "repo/issue/view_content/add_reaction" Dict "ctxData" $.root "ActionURL" (Printf "%s/comments/%d/reactions" $.root.RepoLink .ID)}}
 | 
			
		||||
				{{template "repo/issue/view_content/context_menu" Dict "ctxData" $.root "item" . "delete" true "issue" false "diff" true "IsCommentPoster" (and $.root.IsSigned (eq $.root.SignedUserID .PosterID))}}
 | 
			
		||||
				{{template "repo/issue/view_content/add_reaction" dict "ctxData" $.root "ActionURL" (Printf "%s/comments/%d/reactions" $.root.RepoLink .ID)}}
 | 
			
		||||
				{{template "repo/issue/view_content/context_menu" dict "ctxData" $.root "item" . "delete" true "issue" false "diff" true "IsCommentPoster" (and $.root.IsSigned (eq $.root.SignedUserID .PosterID))}}
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="ui attached segment comment-body">
 | 
			
		||||
@@ -60,7 +60,7 @@
 | 
			
		||||
		{{$reactions := .Reactions.GroupByType}}
 | 
			
		||||
		{{if $reactions}}
 | 
			
		||||
			<div class="ui attached segment reactions">
 | 
			
		||||
			{{template "repo/issue/view_content/reactions" Dict "ctxData" $.root "ActionURL" (Printf "%s/comments/%d/reactions" $.root.RepoLink .ID) "Reactions" $reactions}}
 | 
			
		||||
			{{template "repo/issue/view_content/reactions" dict "ctxData" $.root "ActionURL" (Printf "%s/comments/%d/reactions" $.root.RepoLink .ID) "Reactions" $reactions}}
 | 
			
		||||
			</div>
 | 
			
		||||
		{{end}}
 | 
			
		||||
	</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -111,22 +111,22 @@
 | 
			
		||||
						<td class="add-comment-left" colspan="4">
 | 
			
		||||
							{{if gt (len $line.Comments) 0}}
 | 
			
		||||
								{{if eq $line.GetCommentSide "previous"}}
 | 
			
		||||
									{{template "repo/diff/conversation" mergeinto $.root "comments" $line.Comments}}
 | 
			
		||||
									{{template "repo/diff/conversation" dict "." $.root "comments" $line.Comments}}
 | 
			
		||||
								{{end}}
 | 
			
		||||
							{{end}}
 | 
			
		||||
							{{if gt (len $match.Comments) 0}}
 | 
			
		||||
								{{if eq $match.GetCommentSide "previous"}}
 | 
			
		||||
									{{template "repo/diff/conversation" mergeinto $.root "comments" $match.Comments}}
 | 
			
		||||
									{{template "repo/diff/conversation" dict "." $.root "comments" $match.Comments}}
 | 
			
		||||
								{{end}}
 | 
			
		||||
							{{end}}
 | 
			
		||||
						</td>
 | 
			
		||||
						<td class="add-comment-right" colspan="4">
 | 
			
		||||
							{{if eq $line.GetCommentSide "proposed"}}
 | 
			
		||||
								{{template "repo/diff/conversation" mergeinto $.root "comments" $line.Comments}}
 | 
			
		||||
								{{template "repo/diff/conversation" dict "." $.root "comments" $line.Comments}}
 | 
			
		||||
							{{end}}
 | 
			
		||||
							{{if gt (len $match.Comments) 0}}
 | 
			
		||||
								{{if eq $match.GetCommentSide "proposed"}}
 | 
			
		||||
									{{template "repo/diff/conversation" mergeinto $.root "comments" $match.Comments}}
 | 
			
		||||
									{{template "repo/diff/conversation" dict "." $.root "comments" $match.Comments}}
 | 
			
		||||
								{{end}}
 | 
			
		||||
							{{end}}
 | 
			
		||||
						</td>
 | 
			
		||||
@@ -137,13 +137,13 @@
 | 
			
		||||
					<td class="add-comment-left" colspan="4">
 | 
			
		||||
						{{if gt (len $line.Comments) 0}}
 | 
			
		||||
							{{if eq $line.GetCommentSide "previous"}}
 | 
			
		||||
								{{template "repo/diff/conversation" mergeinto $.root "comments" $line.Comments}}
 | 
			
		||||
								{{template "repo/diff/conversation" dict "." $.root "comments" $line.Comments}}
 | 
			
		||||
							{{end}}
 | 
			
		||||
						{{end}}
 | 
			
		||||
					</td>
 | 
			
		||||
					<td class="add-comment-right" colspan="4">
 | 
			
		||||
						{{if eq $line.GetCommentSide "proposed"}}
 | 
			
		||||
							{{template "repo/diff/conversation" mergeinto $.root "comments" $line.Comments}}
 | 
			
		||||
							{{template "repo/diff/conversation" dict "." $.root "comments" $line.Comments}}
 | 
			
		||||
						{{end}}
 | 
			
		||||
					</td>
 | 
			
		||||
				</tr>
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@
 | 
			
		||||
		{{if gt (len $line.Comments) 0}}
 | 
			
		||||
			<tr class="add-comment" data-line-type="{{DiffLineTypeToStr .GetType}}">
 | 
			
		||||
				<td class="add-comment-left add-comment-right" colspan="5">
 | 
			
		||||
					{{template "repo/diff/conversation" mergeinto $.root "comments" $line.Comments}}
 | 
			
		||||
					{{template "repo/diff/conversation" dict "." $.root "comments" $line.Comments}}
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
		{{end}}
 | 
			
		||||
 
 | 
			
		||||
@@ -307,7 +307,7 @@
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
		{{template "shared/issuelist" mergeinto . "listType" "repo"}}
 | 
			
		||||
		{{template "shared/issuelist" dict "." . "listType" "repo"}}
 | 
			
		||||
	</div>
 | 
			
		||||
</div>
 | 
			
		||||
{{template "base/footer" .}}
 | 
			
		||||
 
 | 
			
		||||
@@ -198,7 +198,7 @@
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
		{{template "shared/issuelist" mergeinto . "listType" "milestone"}}
 | 
			
		||||
		{{template "shared/issuelist" dict "." . "listType" "milestone"}}
 | 
			
		||||
	</div>
 | 
			
		||||
</div>
 | 
			
		||||
{{template "base/footer" .}}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
	<div class="twelve wide column">
 | 
			
		||||
		<div class="ui comments">
 | 
			
		||||
			<div class="comment">
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .SignedUser}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .SignedUser}}
 | 
			
		||||
				<div class="ui segment content">
 | 
			
		||||
					<div class="field">
 | 
			
		||||
						<input name="title" id="issue_title" placeholder="{{.locale.Tr "repo.milestones.title"}}" value="{{if .TitleQuery}}{{.TitleQuery}}{{else if .IssueTemplateTitle}}{{.IssueTemplateTitle}}{{else}}{{.title}}{{end}}" tabindex="3" autofocus required maxlength="255" autocomplete="off">
 | 
			
		||||
@@ -20,15 +20,15 @@
 | 
			
		||||
						<input type="hidden" name="template-file" value="{{.TemplateFile}}">
 | 
			
		||||
						{{range .Fields}}
 | 
			
		||||
							{{if eq .Type "input"}}
 | 
			
		||||
								{{template "repo/issue/fields/input" Dict "Context" $.Context "item" .}}
 | 
			
		||||
								{{template "repo/issue/fields/input" dict "Context" $.Context "item" .}}
 | 
			
		||||
							{{else if eq .Type "markdown"}}
 | 
			
		||||
								{{template "repo/issue/fields/markdown" Dict "Context" $.Context "item" .}}
 | 
			
		||||
								{{template "repo/issue/fields/markdown" dict "Context" $.Context "item" .}}
 | 
			
		||||
							{{else if eq .Type "textarea"}}
 | 
			
		||||
								{{template "repo/issue/fields/textarea" Dict "Context" $.Context "item" .}}
 | 
			
		||||
								{{template "repo/issue/fields/textarea" dict "Context" $.Context "item" .}}
 | 
			
		||||
							{{else if eq .Type "dropdown"}}
 | 
			
		||||
								{{template "repo/issue/fields/dropdown" Dict "Context" $.Context "item" .}}
 | 
			
		||||
								{{template "repo/issue/fields/dropdown" dict "Context" $.Context "item" .}}
 | 
			
		||||
							{{else if eq .Type "checkboxes"}}
 | 
			
		||||
								{{template "repo/issue/fields/checkboxes" Dict "Context" $.Context "item" .}}
 | 
			
		||||
								{{template "repo/issue/fields/checkboxes" dict "Context" $.Context "item" .}}
 | 
			
		||||
							{{end}}
 | 
			
		||||
						{{end}}
 | 
			
		||||
						{{if .IsAttachmentEnabled}}
 | 
			
		||||
 
 | 
			
		||||
@@ -64,8 +64,8 @@
 | 
			
		||||
								{{end}}
 | 
			
		||||
							{{end}}
 | 
			
		||||
							{{if not $.Repository.IsArchived}}
 | 
			
		||||
								{{template "repo/issue/view_content/add_reaction" Dict "ctxData" $ "ActionURL" (Printf "%s/issues/%d/reactions" $.RepoLink .Issue.Index)}}
 | 
			
		||||
								{{template "repo/issue/view_content/context_menu" Dict "ctxData" $ "item" .Issue "delete" false "issue" true "diff" false "IsCommentPoster" $.IsIssuePoster}}
 | 
			
		||||
								{{template "repo/issue/view_content/add_reaction" dict "ctxData" $ "ActionURL" (Printf "%s/issues/%d/reactions" $.RepoLink .Issue.Index)}}
 | 
			
		||||
								{{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" .Issue "delete" false "issue" true "diff" false "IsCommentPoster" $.IsIssuePoster}}
 | 
			
		||||
							{{end}}
 | 
			
		||||
						</div>
 | 
			
		||||
					</div>
 | 
			
		||||
@@ -80,13 +80,13 @@
 | 
			
		||||
						<div id="issue-{{.Issue.ID}}-raw" class="raw-content gt-hidden">{{.Issue.Content}}</div>
 | 
			
		||||
						<div class="edit-content-zone gt-hidden" data-write="issue-{{.Issue.ID}}-write" data-preview="issue-{{.Issue.ID}}-preview" data-update-url="{{$.RepoLink}}/issues/{{.Issue.Index}}/content" data-context="{{.RepoLink}}" data-attachment-url="{{$.RepoLink}}/issues/{{.Issue.Index}}/attachments" data-view-attachment-url="{{$.RepoLink}}/issues/{{.Issue.Index}}/view-attachments"></div>
 | 
			
		||||
						{{if .Issue.Attachments}}
 | 
			
		||||
							{{template "repo/issue/view_content/attachments" Dict "ctxData" $ "Attachments" .Issue.Attachments "Content" .Issue.RenderedContent}}
 | 
			
		||||
							{{template "repo/issue/view_content/attachments" dict "ctxData" $ "Attachments" .Issue.Attachments "Content" .Issue.RenderedContent}}
 | 
			
		||||
						{{end}}
 | 
			
		||||
					</div>
 | 
			
		||||
					{{$reactions := .Issue.Reactions.GroupByType}}
 | 
			
		||||
					{{if $reactions}}
 | 
			
		||||
						<div class="ui attached segment reactions" role="note">
 | 
			
		||||
							{{template "repo/issue/view_content/reactions" Dict "ctxData" $ "ActionURL" (Printf "%s/issues/%d/reactions" $.RepoLink .Issue.Index) "Reactions" $reactions}}
 | 
			
		||||
							{{template "repo/issue/view_content/reactions" dict "ctxData" $ "ActionURL" (Printf "%s/issues/%d/reactions" $.RepoLink .Issue.Index) "Reactions" $reactions}}
 | 
			
		||||
						</div>
 | 
			
		||||
					{{end}}
 | 
			
		||||
				</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -64,8 +64,8 @@
 | 
			
		||||
								</div>
 | 
			
		||||
							{{end}}
 | 
			
		||||
							{{if not $.Repository.IsArchived}}
 | 
			
		||||
								{{template "repo/issue/view_content/add_reaction" Dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
 | 
			
		||||
								{{template "repo/issue/view_content/context_menu" Dict "ctxData" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
 | 
			
		||||
								{{template "repo/issue/view_content/add_reaction" dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
 | 
			
		||||
								{{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
 | 
			
		||||
							{{end}}
 | 
			
		||||
						</div>
 | 
			
		||||
					</div>
 | 
			
		||||
@@ -80,13 +80,13 @@
 | 
			
		||||
						<div id="issuecomment-{{.ID}}-raw" class="raw-content gt-hidden">{{.Content}}</div>
 | 
			
		||||
						<div class="edit-content-zone gt-hidden" data-write="issuecomment-{{.ID}}-write" data-preview="issuecomment-{{.ID}}-preview" data-update-url="{{$.RepoLink}}/comments/{{.ID}}" data-context="{{$.RepoLink}}" data-attachment-url="{{$.RepoLink}}/comments/{{.ID}}/attachments"></div>
 | 
			
		||||
						{{if .Attachments}}
 | 
			
		||||
							{{template "repo/issue/view_content/attachments" Dict "ctxData" $ "Attachments" .Attachments "Content" .RenderedContent}}
 | 
			
		||||
							{{template "repo/issue/view_content/attachments" dict "ctxData" $ "Attachments" .Attachments "Content" .RenderedContent}}
 | 
			
		||||
						{{end}}
 | 
			
		||||
					</div>
 | 
			
		||||
					{{$reactions := .Reactions.GroupByType}}
 | 
			
		||||
					{{if $reactions}}
 | 
			
		||||
						<div class="ui attached segment reactions" role="note">
 | 
			
		||||
							{{template "repo/issue/view_content/reactions" Dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}}
 | 
			
		||||
							{{template "repo/issue/view_content/reactions" dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}}
 | 
			
		||||
						</div>
 | 
			
		||||
					{{end}}
 | 
			
		||||
				</div>
 | 
			
		||||
@@ -94,7 +94,7 @@
 | 
			
		||||
		{{else if eq .Type 1}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge gt-bg-green gt-text-white">{{svg "octicon-dot-fill"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{if .Issue.IsPull}}
 | 
			
		||||
@@ -107,7 +107,7 @@
 | 
			
		||||
		{{else if eq .Type 2}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge gt-bg-red gt-text-white">{{svg "octicon-circle-slash"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{if .Issue.IsPull}}
 | 
			
		||||
@@ -120,7 +120,7 @@
 | 
			
		||||
		{{else if eq .Type 28}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge gt-bg-purple gt-text-white">{{svg "octicon-git-merge"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$link := printf "%s/commit/%s" $.Repository.Link ($.Issue.PullRequest.MergedCommitID|PathEscape)}}
 | 
			
		||||
@@ -147,7 +147,7 @@
 | 
			
		||||
			{{$createdStr:= TimeSinceUnix .CreatedUnix $.locale}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-bookmark"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{if eq .RefAction 3}}<del>{{end}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
@@ -162,7 +162,7 @@
 | 
			
		||||
		{{else if eq .Type 4}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-bookmark"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.commit_ref_at" .EventTag $createdStr | Safe}}
 | 
			
		||||
@@ -176,7 +176,7 @@
 | 
			
		||||
			{{if or .AddedLabels .RemovedLabels}}
 | 
			
		||||
				<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
					<span class="badge">{{svg "octicon-tag"}}</span>
 | 
			
		||||
					{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
					{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
					<span class="text grey muted-links">
 | 
			
		||||
						{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
						{{if and .AddedLabels (not .RemovedLabels)}}
 | 
			
		||||
@@ -192,7 +192,7 @@
 | 
			
		||||
		{{else if eq .Type 8}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-milestone"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{if gt .OldMilestoneID 0}}{{if gt .MilestoneID 0}}{{$.locale.Tr "repo.issues.change_milestone_at" (.OldMilestone.Name|Escape) (.Milestone.Name|Escape) $createdStr | Safe}}{{else}}{{$.locale.Tr "repo.issues.remove_milestone_at" (.OldMilestone.Name|Escape) $createdStr | Safe}}{{end}}{{else if gt .MilestoneID 0}}{{$.locale.Tr "repo.issues.add_milestone_at" (.Milestone.Name|Escape) $createdStr | Safe}}{{end}}
 | 
			
		||||
@@ -203,7 +203,7 @@
 | 
			
		||||
				<span class="badge">{{svg "octicon-person"}}</span>
 | 
			
		||||
				{{if gt .AssigneeID 0}}
 | 
			
		||||
					{{if .RemovedAssignee}}
 | 
			
		||||
						{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Assignee}}
 | 
			
		||||
						{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Assignee}}
 | 
			
		||||
						<span class="text grey muted-links">
 | 
			
		||||
							{{template "shared/user/authorlink" .Assignee}}
 | 
			
		||||
							{{if eq .Poster.ID .Assignee.ID}}
 | 
			
		||||
@@ -213,7 +213,7 @@
 | 
			
		||||
							{{end}}
 | 
			
		||||
						</span>
 | 
			
		||||
					{{else}}
 | 
			
		||||
						{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Assignee}}
 | 
			
		||||
						{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Assignee}}
 | 
			
		||||
						<span class="text grey muted-links">
 | 
			
		||||
							{{template "shared/user/authorlink" .Assignee}}
 | 
			
		||||
							{{if eq .Poster.ID .AssigneeID}}
 | 
			
		||||
@@ -228,7 +228,7 @@
 | 
			
		||||
		{{else if eq .Type 10}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-pencil"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji $.Context) (.NewTitle|RenderEmoji $.Context) $createdStr | Safe}}
 | 
			
		||||
@@ -237,7 +237,7 @@
 | 
			
		||||
		{{else if eq .Type 11}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-git-branch"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.delete_branch_at" (.OldRef|Escape) $createdStr | Safe}}
 | 
			
		||||
@@ -246,7 +246,7 @@
 | 
			
		||||
		{{else if eq .Type 12}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-clock"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.start_tracking_history"  $createdStr | Safe}}
 | 
			
		||||
@@ -255,12 +255,12 @@
 | 
			
		||||
		{{else if eq .Type 13}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-clock"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.stop_tracking_history"  $createdStr | Safe}}
 | 
			
		||||
				</span>
 | 
			
		||||
				{{template "repo/issue/view_content/comments_delete_time" Dict "ctxData" $ "comment" .}}
 | 
			
		||||
				{{template "repo/issue/view_content/comments_delete_time" dict "ctxData" $ "comment" .}}
 | 
			
		||||
				<div class="detail">
 | 
			
		||||
					{{svg "octicon-clock"}}
 | 
			
		||||
					<span class="text grey muted-links">{{.Content}}</span>
 | 
			
		||||
@@ -269,12 +269,12 @@
 | 
			
		||||
		{{else if eq .Type 14}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-clock"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.add_time_history"  $createdStr | Safe}}
 | 
			
		||||
				</span>
 | 
			
		||||
				{{template "repo/issue/view_content/comments_delete_time" Dict "ctxData" $ "comment" .}}
 | 
			
		||||
				{{template "repo/issue/view_content/comments_delete_time" dict "ctxData" $ "comment" .}}
 | 
			
		||||
				<div class="detail">
 | 
			
		||||
					{{svg "octicon-clock"}}
 | 
			
		||||
					<span class="text grey muted-links">{{.Content}}</span>
 | 
			
		||||
@@ -283,7 +283,7 @@
 | 
			
		||||
		{{else if eq .Type 15}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-clock"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.cancel_tracking_history"  $createdStr | Safe}}
 | 
			
		||||
@@ -292,7 +292,7 @@
 | 
			
		||||
		{{else if eq .Type 16}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-clock"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.due_date_added" .Content $createdStr | Safe}}
 | 
			
		||||
@@ -301,7 +301,7 @@
 | 
			
		||||
		{{else if eq .Type 17}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-clock"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$parsedDeadline := .Content | ParseDeadline}}
 | 
			
		||||
@@ -311,7 +311,7 @@
 | 
			
		||||
		{{else if eq .Type 18}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-clock"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.due_date_remove" .Content $createdStr | Safe}}
 | 
			
		||||
@@ -320,7 +320,7 @@
 | 
			
		||||
		{{else if eq .Type 19}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-package-dependents"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.dependency.added_dependency" $createdStr | Safe}}
 | 
			
		||||
@@ -343,7 +343,7 @@
 | 
			
		||||
		{{else if eq .Type 20}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-package-dependents"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.dependency.removed_dependency" $createdStr | Safe}}
 | 
			
		||||
@@ -436,8 +436,8 @@
 | 
			
		||||
										</div>
 | 
			
		||||
									{{end}}
 | 
			
		||||
									{{if not $.Repository.IsArchived}}
 | 
			
		||||
											{{template "repo/issue/view_content/add_reaction" Dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
 | 
			
		||||
											{{template "repo/issue/view_content/context_menu" Dict "ctxData" $ "item" . "delete" false "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
 | 
			
		||||
											{{template "repo/issue/view_content/add_reaction" dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
 | 
			
		||||
											{{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" . "delete" false "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
 | 
			
		||||
									{{end}}
 | 
			
		||||
							</div>
 | 
			
		||||
						</div>
 | 
			
		||||
@@ -452,13 +452,13 @@
 | 
			
		||||
							<div id="issuecomment-{{.ID}}-raw" class="raw-content gt-hidden">{{.Content}}</div>
 | 
			
		||||
							<div class="edit-content-zone gt-hidden" data-write="issuecomment-{{.ID}}-write" data-preview="issuecomment-{{.ID}}-preview" data-update-url="{{$.RepoLink}}/comments/{{.ID}}" data-context="{{$.RepoLink}}" data-attachment-url="{{$.RepoLink}}/comments/{{.ID}}/attachments"></div>
 | 
			
		||||
							{{if .Attachments}}
 | 
			
		||||
								{{template "repo/issue/view_content/attachments" Dict "ctxData" $ "Attachments" .Attachments "Content" .RenderedContent}}
 | 
			
		||||
								{{template "repo/issue/view_content/attachments" dict "ctxData" $ "Attachments" .Attachments "Content" .RenderedContent}}
 | 
			
		||||
							{{end}}
 | 
			
		||||
						</div>
 | 
			
		||||
						{{$reactions := .Reactions.GroupByType}}
 | 
			
		||||
						{{if $reactions}}
 | 
			
		||||
							<div class="ui attached segment reactions">
 | 
			
		||||
									{{template "repo/issue/view_content/reactions" Dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}}
 | 
			
		||||
									{{template "repo/issue/view_content/reactions" dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}}
 | 
			
		||||
							</div>
 | 
			
		||||
						{{end}}
 | 
			
		||||
					</div>
 | 
			
		||||
@@ -563,8 +563,8 @@
 | 
			
		||||
																	</div>
 | 
			
		||||
																{{end}}
 | 
			
		||||
																{{if not $.Repository.IsArchived}}
 | 
			
		||||
																	{{template "repo/issue/view_content/add_reaction" Dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
 | 
			
		||||
																	{{template "repo/issue/view_content/context_menu" Dict "ctxData" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
 | 
			
		||||
																	{{template "repo/issue/view_content/add_reaction" dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
 | 
			
		||||
																	{{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
 | 
			
		||||
																{{end}}
 | 
			
		||||
															</div>
 | 
			
		||||
														</div>
 | 
			
		||||
@@ -582,7 +582,7 @@
 | 
			
		||||
														{{$reactions := .Reactions.GroupByType}}
 | 
			
		||||
														{{if $reactions}}
 | 
			
		||||
															<div class="ui attached segment reactions">
 | 
			
		||||
																{{template "repo/issue/view_content/reactions" Dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}}
 | 
			
		||||
																{{template "repo/issue/view_content/reactions" dict "ctxData" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}}
 | 
			
		||||
															</div>
 | 
			
		||||
														{{end}}
 | 
			
		||||
													</div>
 | 
			
		||||
@@ -626,7 +626,7 @@
 | 
			
		||||
		{{else if eq .Type 23}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-lock"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{if .Content}}
 | 
			
		||||
					<span class="text grey muted-links">
 | 
			
		||||
						{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
@@ -642,7 +642,7 @@
 | 
			
		||||
		{{else if eq .Type 24}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-key"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{$.locale.Tr "repo.issues.unlock_comment" $createdStr | Safe}}
 | 
			
		||||
@@ -651,7 +651,7 @@
 | 
			
		||||
		{{else if eq .Type 25}}
 | 
			
		||||
			<div class="timeline-item event">
 | 
			
		||||
				<span class="badge">{{svg "octicon-git-branch"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					<a{{if gt .Poster.ID 0}} href="{{.Poster.HomeLink}}"{{end}}>{{.Poster.Name}}</a>
 | 
			
		||||
					{{$.locale.Tr "repo.pulls.change_target_branch_at" (.OldRef|Escape) (.NewRef|Escape) $createdStr | Safe}}
 | 
			
		||||
@@ -660,7 +660,7 @@
 | 
			
		||||
		{{else if eq .Type 26}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-clock"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
 | 
			
		||||
@@ -674,7 +674,7 @@
 | 
			
		||||
		{{else if eq .Type 27}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-eye"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{if (gt .AssigneeID 0)}}
 | 
			
		||||
@@ -724,7 +724,7 @@
 | 
			
		||||
			{{if not $.UnitProjectsGlobalDisabled}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-project"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{if gt .OldProjectID 0}}
 | 
			
		||||
@@ -781,7 +781,7 @@
 | 
			
		||||
		{{else if eq .Type 33}}
 | 
			
		||||
			<div class="timeline-item event" id="{{.HashTag}}">
 | 
			
		||||
				<span class="badge">{{svg "octicon-git-branch"}}</span>
 | 
			
		||||
				{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				{{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}}
 | 
			
		||||
				<span class="text grey muted-links">
 | 
			
		||||
					{{template "shared/user/authorlink" .Poster}}
 | 
			
		||||
					{{if and .OldRef .NewRef}}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,5 +5,5 @@
 | 
			
		||||
	</a>
 | 
			
		||||
{{end}}
 | 
			
		||||
{{if AllowedReactions}}
 | 
			
		||||
	{{template "repo/issue/view_content/add_reaction" Dict "ctxData" $.ctxData "ActionURL" .ActionURL}}
 | 
			
		||||
	{{template "repo/issue/view_content/add_reaction" dict "ctxData" $.ctxData "ActionURL" .ActionURL}}
 | 
			
		||||
{{end}}
 | 
			
		||||
 
 | 
			
		||||
@@ -112,7 +112,7 @@
 | 
			
		||||
						{{end}}
 | 
			
		||||
					</div>
 | 
			
		||||
				</div>
 | 
			
		||||
				{{template "shared/issuelist" mergeinto . "listType" "dashboard"}}
 | 
			
		||||
				{{template "shared/issuelist" dict "." . "listType" "dashboard"}}
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -66,7 +66,7 @@
 | 
			
		||||
					<div class="ui divider"></div>
 | 
			
		||||
					{{.locale.Tr "notification.no_subscriptions"}}
 | 
			
		||||
				{{else}}
 | 
			
		||||
					{{template "shared/issuelist" mergeinto . "listType" "dashboard"}}
 | 
			
		||||
					{{template "shared/issuelist" dict "." . "listType" "dashboard"}}
 | 
			
		||||
				{{end}}
 | 
			
		||||
			{{else}}
 | 
			
		||||
				{{template "explore/repo_search" .}}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user