mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-11-25 03:06:10 +01:00
8d5f58d834
* Show total tracked time in issue and milestone list Show total tracked time at issue page Signed-off-by: Jonas Franz <info@jonasfranz.software> * Optimizing TotalTimes by using SumInt Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fixing wrong total times for milestones caused by a missing JOIN Adding unit tests for total times Signed-off-by: Jonas Franz <info@jonasfranz.software> * Logging error instead of ignoring it Signed-off-by: Jonas Franz <info@jonasfranz.software> * Correcting spelling mistakes Signed-off-by: Jonas Franz <info@jonasfranz.software> * Change error message to a short version Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add error handling to TotalTimes Add variable for totalTimes Signed-off-by: Jonas Franz <info@jonasfranz.de> * Introduce TotalTrackedTimes as variable of issue Load TotalTrackedTimes by loading attributes of IssueList Load TotalTrackedTimes by loading attributes of single issue Add Sec2Time as helper to use it in templates Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fixed test + gofmt Signed-off-by: Jonas Franz <info@jonasfranz.software> * Load TotalTrackedTimes via MilestoneList instead of single requests Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add documentation for MilestoneList Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add documentation for MilestoneList Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix test Signed-off-by: Jonas Franz <info@jonasfranz.software> * Change comment from SQL query to description Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix unit test by using int64 instead of int Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix unit test by using int64 instead of int Signed-off-by: Jonas Franz <info@jonasfranz.software> * Check if timetracker is enabled Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix test by enabling timetracking Signed-off-by: Jonas Franz <info@jonasfranz.de>
196 lines
8.5 KiB
Cheetah
196 lines
8.5 KiB
Cheetah
<div class="four wide column">
|
|
<div class="ui segment metas">
|
|
{{template "repo/issue/branch_selector_field" .}}
|
|
|
|
<div class="ui {{if not .IsRepositoryWriter}}disabled{{end}} floating jump select-label dropdown">
|
|
<span class="text">
|
|
<strong>{{.i18n.Tr "repo.issues.new.labels"}}</strong>
|
|
<span class="octicon octicon-gear"></span>
|
|
</span>
|
|
<div class="filter menu" data-action="update" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/labels">
|
|
<div class="no-select item">{{.i18n.Tr "repo.issues.new.clear_labels"}}</div>
|
|
{{range .Labels}}
|
|
<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" data-id-selector="#label_{{.ID}}"><span class="octicon {{if .IsChecked}}octicon-check{{end}}"></span><span class="label color" style="background-color: {{.Color}}"></span> {{.Name}}
|
|
{{if .Description }}<br><small class="desc">{{.Description}}</small>{{end}}</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
<div class="ui labels list">
|
|
<span class="no-select item {{if .HasSelectedLabel}}hide{{end}}">{{.i18n.Tr "repo.issues.new.no_label"}}</span>
|
|
{{range .Labels}}
|
|
<div class="item">
|
|
<a class="ui label {{if not .IsChecked}}hide{{end}}" id="label_{{.ID}}" href="{{$.RepoLink}}/issues?labels={{.ID}}" style="color: {{.ForegroundColor}}; background-color: {{.Color}}" title="{{.Description}}">{{.Name}}</a>
|
|
</div>
|
|
|
|
{{end}}
|
|
</div>
|
|
|
|
<div class="ui divider"></div>
|
|
|
|
<div class="ui {{if not .IsRepositoryWriter}}disabled{{end}} floating jump select-milestone dropdown">
|
|
<span class="text">
|
|
<strong>{{.i18n.Tr "repo.issues.new.milestone"}}</strong>
|
|
<span class="octicon octicon-gear"></span>
|
|
</span>
|
|
<div class="menu" data-action="update" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/milestone">
|
|
<div class="no-select item">{{.i18n.Tr "repo.issues.new.clear_milestone"}}</div>
|
|
{{if .OpenMilestones}}
|
|
<div class="divider"></div>
|
|
<div class="header">
|
|
<i class="octicon octicon-milestone"></i>
|
|
{{.i18n.Tr "repo.issues.new.open_milestone"}}
|
|
</div>
|
|
{{range .OpenMilestones}}
|
|
<div class="item" data-id="{{.ID}}" data-href="{{$.RepoLink}}/issues?milestone={{.ID}}"> {{.Name}}</div>
|
|
{{end}}
|
|
{{end}}
|
|
{{if .ClosedMilestones}}
|
|
<div class="divider"></div>
|
|
<div class="header">
|
|
<i class="octicon octicon-milestone"></i>
|
|
{{.i18n.Tr "repo.issues.new.closed_milestone"}}
|
|
</div>
|
|
{{range .ClosedMilestones}}
|
|
<a class="item" data-id="{{.ID}}" data-href="{{$.RepoLink}}/issues?milestone={{.ID}}"> {{.Name}}</a>
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
<div class="ui select-milestone list">
|
|
<span class="no-select item {{if .Issue.Milestone}}hide{{end}}">{{.i18n.Tr "repo.issues.new.no_milestone"}}</span>
|
|
<div class="selected">
|
|
{{if .Issue.Milestone}}
|
|
<a class="item" href="{{.RepoLink}}/issues?milestone={{.Issue.Milestone.ID}}"> {{.Issue.Milestone.Name}}</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ui divider"></div>
|
|
|
|
<input id="assignee_id" name="assignee_id" type="hidden" value="{{.assignee_id}}">
|
|
<div class="ui {{if not .IsRepositoryWriter}}disabled{{end}} floating jump select-assignee dropdown">
|
|
<span class="text">
|
|
<strong>{{.i18n.Tr "repo.issues.new.assignee"}}</strong>
|
|
<span class="octicon octicon-gear"></span>
|
|
</span>
|
|
<div class="menu" data-action="update" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/assignee">
|
|
<div class="no-select item">{{.i18n.Tr "repo.issues.new.clear_assignee"}}</div>
|
|
{{range .Assignees}}
|
|
<div class="item" data-id="{{.ID}}" data-href="{{$.RepoLink}}/issues?assignee={{.ID}}" data-avatar="{{.RelAvatarLink}}"><img src="{{.RelAvatarLink}}"> {{.Name}}</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
<div class="ui select-assignee list">
|
|
<span class="no-select item {{if .Issue.Assignee}}hide{{end}}">{{.i18n.Tr "repo.issues.new.no_assignee"}}</span>
|
|
<div class="selected">
|
|
{{if .Issue.Assignee}}
|
|
<a class="item" href="{{$.RepoLink}}/issues?assignee={{.Issue.Assignee.ID}}"><img class="ui avatar image" src="{{.Issue.Assignee.RelAvatarLink}}"> {{.Issue.Assignee.Name}}</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ui divider"></div>
|
|
|
|
<div class="ui participants">
|
|
<span class="text"><strong>{{.i18n.Tr "repo.issues.num_participants" .NumParticipants}}</strong></span>
|
|
<div>
|
|
{{range .Participants}}
|
|
<a href="{{.HomeLink}}">
|
|
<img class="ui avatar image poping up" src="{{.RelAvatarLink}}" data-content="{{.DisplayName}}" data-position="top center" data-variation="small inverted">
|
|
</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
{{if $.IssueWatch}}
|
|
<div class="ui divider"></div>
|
|
|
|
<div class="ui watching">
|
|
<span class="text"><strong>{{.i18n.Tr "notification.notifications"}}</strong></span>
|
|
<div>
|
|
<form method="POST" action="{{$.RepoLink}}/issues/{{.Issue.Index}}/watch">
|
|
<input type="hidden" name="watch" value="{{if $.IssueWatch.IsWatching}}0{{else}}1{{end}}" />
|
|
{{$.CsrfTokenHtml}}
|
|
<button class="fluid ui button">
|
|
{{if $.IssueWatch.IsWatching}}
|
|
<i class="octicon octicon-mute"></i>
|
|
{{.i18n.Tr "repo.issues.unsubscribe"}}
|
|
{{else}}
|
|
<i class="octicon octicon-unmute"></i>
|
|
{{.i18n.Tr "repo.issues.subscribe"}}
|
|
{{end}}
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{if .Repository.IsTimetrackerEnabled }}
|
|
{{if .CanUseTimetracker }}
|
|
<div class="ui divider"></div>
|
|
<div class="ui timetrack">
|
|
<span class="text"><strong>{{.i18n.Tr "repo.issues.tracker"}}</strong></span>
|
|
<div>
|
|
<form method="POST" action="{{$.RepoLink}}/issues/{{.Issue.Index}}/times/stopwatch/toggle" id="toggle_stopwatch_form">
|
|
{{$.CsrfTokenHtml}}
|
|
</form>
|
|
<form method="POST" action="{{$.RepoLink}}/issues/{{.Issue.Index}}/times/stopwatch/cancel" id="cancel_stopwatch_form">
|
|
{{$.CsrfTokenHtml}}
|
|
</form>
|
|
{{if $.IsStopwatchRunning}}
|
|
<div class="ui buttons fluid stop-cancel">
|
|
<button onclick="this.disabled=true;toggleStopwatch()" class="ui button stop">{{.i18n.Tr "repo.issues.stop_tracking"}}</button>
|
|
<button onclick="this.disabled=true;cancelStopwatch()" class="ui negative button cancel">{{.i18n.Tr "repo.issues.cancel_tracking"}}</button>
|
|
</div>
|
|
{{else}}
|
|
{{if .HasUserStopwatch}}
|
|
<div class="ui warning message">
|
|
{{.i18n.Tr "repo.issues.tracking_already_started" .OtherStopwatchURL | Safe}}
|
|
</div>
|
|
{{end}}
|
|
<div class="ui buttons two fluid start-add">
|
|
<button onclick="this.disabled=true;toggleStopwatch()" class="ui button poping up start" data-content='{{.i18n.Tr "repo.issues.start_tracking"}}' data-position="top center" data-variation="small inverted">{{.i18n.Tr "repo.issues.start_tracking_short"}}</button>
|
|
<button onclick="timeAddManual()" class="ui button green poping up add-time" data-content='{{.i18n.Tr "repo.issues.add_time"}}' data-position="top center" data-variation="small inverted">{{.i18n.Tr "repo.issues.add_time_short"}}</button>
|
|
<div class="ui mini modal">
|
|
<div class="header">{{.i18n.Tr "repo.issues.add_time"}}</div>
|
|
<div class="content">
|
|
<form method="POST" id="add_time_manual_form" action="{{$.RepoLink}}/issues/{{.Issue.Index}}/times/add" class="ui action input fluid">
|
|
{{$.CsrfTokenHtml}}
|
|
<input placeholder='{{.i18n.Tr "repo.issues.add_time_hours"}}' type="number" name="hours">
|
|
<input placeholder='{{.i18n.Tr "repo.issues.add_time_minutes"}}' type="number" name="minutes" class="ui compact">
|
|
</form>
|
|
</div>
|
|
<div class="actions">
|
|
<div class="ui green approve button">{{.i18n.Tr "repo.issues.add_time_short"}}</div>
|
|
<div class="ui red cancel button">{{.i18n.Tr "repo.issues.add_time_cancel"}}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{if gt (len .WorkingUsers) 0}}
|
|
<div class="ui divider"></div>
|
|
<div class="ui participants comments">
|
|
<span class="text"><strong>{{.i18n.Tr "repo.issues.time_spent_from_all_authors" ($.Issue.TotalTrackedTime | Sec2Time) | Safe}}</strong></span>
|
|
<div>
|
|
{{range $user, $trackedtime := .WorkingUsers}}
|
|
<div class="comment">
|
|
<a class="avatar">
|
|
<img src="{{$user.RelAvatarLink}}">
|
|
</a>
|
|
<div class="content">
|
|
<a class="author">{{$user.DisplayName}}</a>
|
|
<div class="text">
|
|
{{$trackedtime}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
</div>
|