├── htdocs ├── robo-bgr.jpg ├── de-logo-bw.png ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff ├── css │ └── style.css └── js │ └── bootstrap.min.js ├── README.md ├── templates ├── wiki_page_path.html ├── attach_file_form.html ├── macros.rss ├── author_or_creator.rss ├── page_index.html ├── preview_file.html ├── path_links.html ├── progress_bar_grouped.html ├── index.html ├── progress_bar.html ├── diff_options.html ├── history_view.html ├── repository_index.html ├── list_of_attachments.html ├── macros.html ├── search.html ├── timeline.html ├── layout.html ├── diff_view.html ├── about.html ├── theme.html ├── report_list.html ├── attachment.html ├── ticket_box.html ├── wiki_view.html ├── ticket_change.html ├── report_view.html ├── browser.html ├── revisionlog.html ├── error.html ├── diff_div.html └── ticket.html └── install /htdocs/robo-bgr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wearede/DEtrac/HEAD/htdocs/robo-bgr.jpg -------------------------------------------------------------------------------- /htdocs/de-logo-bw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wearede/DEtrac/HEAD/htdocs/de-logo-bw.png -------------------------------------------------------------------------------- /htdocs/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wearede/DEtrac/HEAD/htdocs/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /htdocs/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wearede/DEtrac/HEAD/htdocs/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /htdocs/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wearede/DEtrac/HEAD/htdocs/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | DEtrac = Trac + Boostrap 2 | ====== 3 | 4 | Attempt at modernizing trac 1.0.1 interface using latest bootstrap. 5 | 6 | This is still in its infancy, rough around the edges, but still usable. 7 | 8 | Install script assumes quite a lot of things, review it before running. 9 | 10 | ###Theme in action: https://support.weare.de.com/ 11 | 12 | -------------------------------------------------------------------------------- /templates/wiki_page_path.html: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /templates/attach_file_form.html: -------------------------------------------------------------------------------- 1 | 8 |
13 |

14 | 15 | 16 |

17 |
18 | -------------------------------------------------------------------------------- /templates/macros.rss: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 14 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /templates/author_or_creator.rss: -------------------------------------------------------------------------------- 1 | 2 | 10 | 14 | 15 | 16 | 17 | 18 | ${format_author(author)} 19 | ${format_author(author)} 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /templates/page_index.html: -------------------------------------------------------------------------------- 1 | 6 | 27 | 28 | -------------------------------------------------------------------------------- /templates/preview_file.html: -------------------------------------------------------------------------------- 1 | 7 | 12 | ${preview.rendered} 13 | 14 |

15 | (The file is empty) 16 |

17 |

18 | 19 | 20 | HTML preview not available, since the file size exceeds $preview.max_file_size bytes. 21 | 22 | 23 | HTML preview not available, since no preview renderer could handle it. 24 | 25 | 26 | Try downloading the file instead. 27 |

28 |
29 | 30 | -------------------------------------------------------------------------------- /templates/path_links.html: -------------------------------------------------------------------------------- 1 |
3 | 15 | 16 | 24 | 25 | 26 | 27 | 33 | 34 | 35 |
36 | -------------------------------------------------------------------------------- /templates/progress_bar_grouped.html: -------------------------------------------------------------------------------- 1 | 9 | 14 | 15 | 16 | 24 | 34 | 35 |
17 | (none) 18 | ${obfus_name} 22 | ${group.name} 23 | 25 | 33 |
36 | 37 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | Available Projects 10 | 11 | 12 | 13 | 14 | 15 |
16 | 19 |
20 | 21 | 22 | 23 | 24 |

$project.name

25 |

$project.description

26 |
27 |
28 | 29 |
30 |

$project.name

31 |

$project.description

32 | Error 33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |

WE ARE DE Ltd

41 |
42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /templates/progress_bar.html: -------------------------------------------------------------------------------- 1 | 12 | 20 | 21 | 22 | 23 | 30 | 31 |
26 | 29 |
32 | 33 |

${'%d%%' % stats.done_percent if percent is None else percent}

34 | 35 |

36 | 37 | Total number of ${stats.unit}: ${stats.count} 39 | 40 | 41 | - ${interval.title}: ${interval.count} 43 | 44 |

45 | 46 | -------------------------------------------------------------------------------- /install: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | read -r -p "This script is potentially dangerous and has only been tested on 1 ubuntu 14.04 server, continue? [y/N] " response 4 | 5 | if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]] 6 | then 7 | 8 | # sync files 9 | # src: install dir 10 | # des: /usr/share/pyshared/trac/htdocs/ 11 | # desL /usr/share/pyshared/trac/templates/ 12 | rsync -aP htdocs/* /usr/share/pyshared/trac/htdocs/ 13 | rsync -aP templates/* /usr/share/pyshared/trac/templates/ 14 | 15 | echo 'DEtrac theme sync [ok]' 16 | 17 | # htdocs 18 | # sync symlinks 19 | # src: /usr/share/pyshared/trac/htdocs/ 20 | # des: /usr/lib/python2.7/dist-packages/trac/htdocs 21 | rm -r /usr/lib/python2.7/dist-packages/trac/htdocs 22 | ln -s /usr/share/pyshared/trac/htdocs/ /usr/lib/python2.7/dist-packages/trac/htdocs 23 | 24 | echo 'htdocs symlink created at /usr/lib/python2.7/dist-packages/trac' 25 | 26 | # templates 27 | # sync symlinks 28 | # src: /usr/share/pyshared/trac/templates/ 29 | # des: /usr/lib/python2.7/dist-packages/trac/templates 30 | rm -r /usr/lib/python2.7/dist-packages/trac/templates 31 | ln -s /usr/share/pyshared/trac/templates/ /usr/lib/python2.7/dist-packages/trac/templates 32 | 33 | echo 'templates symlink created at /usr/lib/python2.7/dist-packages/trac' 34 | 35 | sed -i.backup -e '/trac.css/s/^/#/' /usr/share/pyshared/trac/web/chrome.py 36 | sed -i.backup -e '/wiki.css/s/^/#/' /usr/share/pyshared/trac/wiki/web_ui.py 37 | sed -i.backup -e '/timeline.css/s/^/#/' /usr/share/pyshared/trac/timeline/web_ui.py 38 | sed -i.backup -e '/search.css/s/^/#/' /usr/share/pyshared/trac/search/web_ui.py 39 | sed -i.backup -e '/browser.css/s/^/#/' /usr/share/pyshared/trac/versioncontrol/web_ui/browser.py 40 | sed -i.backup -e '/report.css/s/^/#/' /usr/share/pyshared/trac/ticket/report.py 41 | sed -i.backup -e '/ticket.css/s/^/#/' /usr/share/pyshared/trac/ticket/web_ui.py 42 | 43 | echo 'edits made to files in /usr/share/pyshared/trac. Originals saved with .backup extension.' 44 | 45 | echo 'install complete [ok]' 46 | 47 | read -r -p "reload apache? [y/N] " response 48 | 49 | if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]] 50 | then 51 | service apache2 reload 52 | else 53 | echo 'you should reload apache for theme to take effect' 54 | fi 55 | 56 | echo 'all [OK]' 57 | 58 | else 59 | 60 | echo 'bye :)' 61 | 62 | fi 63 | -------------------------------------------------------------------------------- /templates/diff_options.html: -------------------------------------------------------------------------------- 1 | 5 |
10 | 11 | 17 |
18 | 19 | 22 | 26 |
27 | 30 |
31 |
32 | Ignore: 33 |
34 | 36 | 37 |
38 |
39 | 41 | 42 |
43 |
44 | 46 | 47 |
48 |
49 |
50 | 51 |
52 |
53 | -------------------------------------------------------------------------------- /templates/history_view.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | $title 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 42 | 45 | 46 | 49 | 50 | 51 | 52 |
VersionDateAuthorComment
37 | 39 | 41 | 43 | $item.version 44 | ${pretty_dateinfo(item.date, dateonly=True)}${authorinfo(item.author)}${wiki_to_oneliner(context.child(resource), item.comment, shorten=True)}
53 | 54 | 57 | 58 |
59 |
60 | 61 | 62 | -------------------------------------------------------------------------------- /templates/repository_index.html: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 11 | 12 | 21 | 24 | 30 | 34 | 35 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
13 | 14 | 15 | $reponame 18 | 19 | 20 | 22 | 23 | 25 | 26 | ${repos.display_rev(change.rev)} 27 |   28 | 29 | 32 | ${pretty_dateinfo(change.date, dateonly=True) if chgset_view else '–'} 33 | ${authorinfo_short(change.author) if chgset_view else '–'} 36 | 37 | 38 | ${wiki_to_oneliner(chgset_context, change.message, shorten=True)} 39 | ${shorten_line(change.message)} 40 | 41 | 42 |
${wiki_to_html(context.child('source', '/', parent=repos.resource), repoinfo.description)}
50 | 51 | -------------------------------------------------------------------------------- /templates/list_of_attachments.html: -------------------------------------------------------------------------------- 1 | 10 | 17 | 18 | 19 | ${attachment.filename 20 | } 21 | (${pretty_size(attachment.size)}) - 22 | added by ${authorinfo(attachment.author)} ${pretty_dateinfo(attachment.date)}. 23 | 24 | 25 | 26 |
27 | 28 |

Attachments (${len(alist.attachments)})

29 |
30 |
    31 | 32 |
  • 33 | ${show_one_attachment(attachment)} 34 | ${wiki_to_oneliner(context, attachment.description)} 35 |
  • 36 |
    37 |
38 |

39 | Download all attachments as: .zip 40 |

41 |
42 |
43 | 44 |

Attachments (${len(alist.attachments)})

45 |
46 |
    47 | 48 |
  • 49 |
    ${show_one_attachment(attachment)}
    50 |

    ${wiki_to_oneliner(context, attachment.description)}

    51 |
  • 52 |
    53 |
54 |

55 | Download all attachments as: .zip 56 |

57 | 58 |
59 |
60 |
61 |
62 | 63 | -------------------------------------------------------------------------------- /templates/macros.html: -------------------------------------------------------------------------------- 1 |
6 | 7 | 14 | 15 | 19 | ${ 20 | pretty_size(size) 21 | } 22 | 23 | 30 | 51 | 52 | 53 | 58 | 59 | 60 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 76 | 77 | 78 | 79 | 80 | 85 | 86 | 87 | 88 | 89 |
90 | -------------------------------------------------------------------------------- /templates/search.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | 11 | <py:when test="query">Search Results</py:when> 12 | <py:otherwise>Search</py:otherwise> 13 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | 23 | 24 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /templates/timeline.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | Timeline 11 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 |
24 |
25 |
26 |
27 |
28 |
29 | 30 |
31 | 34 |
35 |
36 | 37 |
38 |
39 | 40 |
41 | 42 |
43 |
${day}: ${_("Today") if day == today else _("Yesterday") if day == yesterday else None}
44 | 62 |
63 |
64 |
65 |
66 | 67 |

68 | Note: See TracTimeline for information about the timeline view. 69 |

70 | 71 |
72 | 73 | 74 | -------------------------------------------------------------------------------- /templates/layout.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | 11 | <py:if test="title">${title} – </py:if>${project.name or 'Trac'} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 32 | 37 | 38 | ${script.prefix}${script.suffix} 39 | 40 | 48 | ${select("*[local-name() != 'title']|text()|comment()")} 49 | 50 | 51 | 52 | ${select('*|text()|comment()')} 53 | 54 | 59 | 64 | 65 | ${script.prefix}${script.suffix} 66 | 67 | 68 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /templates/diff_view.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | $title 11 | 12 | 13 | 14 | 15 | 16 |
17 |

18 | Changes between 19 | Version $old_version and 20 | Version $new_version of 21 | ${name or name_of(resource)} 22 | 23 | Changes between 24 | Initial Version and 25 | Version $new_version of 26 | ${name or name_of(resource)} 27 | 28 | Changes from 29 | Version $new_version of 30 | ${name or name_of(resource)} 31 | 32 |

33 |
34 |
35 | 36 | 37 | 38 | 39 | 40 |
41 |
42 |
43 |
Timestamp:
44 |
45 | (multiple changes) 46 | 47 | ${format_datetime(change.date)} (${dateinfo(change.date)} ago) 48 | 49 | -- 50 |
51 |
Author:
52 |
53 | (multiple changes) 54 | ${authorinfo(change.author)} 55 | (IP: $change.ipnr) 56 |
57 |
Comment:
58 |
59 | (multiple changes) 60 | ${wiki_to_html(context.child(resource), change.comment)} 61 |
62 |
63 |
64 |
65 |

Legend:

66 |
67 |
Unmodified
68 |
Added
69 |
Removed
70 |
Modified
71 |
72 |
73 | 74 | 75 | 76 |
77 |
78 | 79 | 80 | -------------------------------------------------------------------------------- /templates/about.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | About Trac 11 | 18 | 19 | 20 | 21 |
22 | 23 | 24 |

Trac is a web-based software project management and bug/issue 25 | tracking system emphasizing ease of use and low ceremony. 26 | It provides an integrated Wiki, an interface to version control 27 | systems, and a number of convenient ways to stay on top of events 28 | and changes within a project. 29 |

30 |

Trac is distributed under the modified BSD License.
31 | The complete text of the license can be found 32 | online 33 | as well as in the COPYING file included in the distribution.

34 | 35 | python powered 37 | 38 |

Please visit the Trac open source project: 39 | http://trac.edgewall.org/

40 | 43 | 44 | 45 |
46 | 47 |
48 |

System Information

49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
PackageVersion
$name$value
58 |
59 | 60 |
61 |

Installed Plugins

62 | 63 | 64 | 65 | 68 | 71 | 72 | 73 | 74 | 75 |
NameVersionLocation
69 | $plugin.name 70 | ${plugin.version or _('N/A')}$plugin.path
76 |
77 | 78 |
79 |

Configuration

80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 92 | 94 | 95 | 96 | 97 | 98 | 99 |
SectionNameValue
${section.name}${option.name}${option.value}
100 |
101 |
102 | 103 |
104 | 105 | 106 | -------------------------------------------------------------------------------- /templates/theme.html: -------------------------------------------------------------------------------- 1 | 4 | 9 | 10 | 11 | ${select('*|comment()|text()')} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 52 | 53 | 54 |
56 | 64 | 65 | 73 | 80 | 81 | ${select('*|text()|comment()')} 82 |
83 | 84 | 85 | 96 | 97 | 98 | 99 | 100 | 101 | 102 |
103 | 104 | -------------------------------------------------------------------------------- /templates/report_list.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | Available Reports 11 | 12 | 23 | 24 | 25 | 26 |
27 | 28 | 36 | 37 |
38 | 39 |
40 |
41 |
42 |
43 | 44 | 45 |
46 |
47 |

Return to Last Query

48 | 49 |
50 |

Continue browsing through the current list of results, 51 | from the last selected report or custom query.

52 |
53 |
54 | 55 |
56 |

Custom Query

57 | 58 |
59 |

Compose a new ticket query by selecting filters and columns to display.

60 |
61 |
62 | 63 | 64 | 78 | 79 | 101 | 102 | 103 |
104 | 105 | 106 |
107 |
108 |
109 | 110 | 111 |
112 |
113 |
114 | 115 |

116 | Note: 117 | See TracReports for help on using and creating reports. 118 |

119 |
120 | 121 | 122 | -------------------------------------------------------------------------------- /templates/attachment.html: -------------------------------------------------------------------------------- 1 | 4 | 9 | 10 | 11 | 12 | <py:when test="'new'">${name_of(parent)} – Attachment</py:when> 13 | <py:when test="'list'">${name_of(parent)} – Attachments</py:when> 14 | <py:otherwise><i18n:msg params="filename, parent">${attachment.filename} on ${name_of(parent)} – Attachment</i18n:msg></py:otherwise> 15 | 16 | 17 | 18 | 23 | 24 | 25 | 26 | 27 |
28 | 29 |

Add Attachment to ${name_of(parent)}

30 |
31 |
32 | 35 |
36 |
37 | Attachment Info 38 | 39 |
40 | 43 |
44 |
45 |
46 | 48 |
49 |
50 | 51 |
52 | 54 |
55 |
56 |
57 |
58 |
59 | 60 | 61 | 62 | 63 | 64 |
65 |
66 |
67 | 68 | 69 |

${name_of(parent)}: $attachment.filename

70 |

Are you sure you want to delete this attachment?
71 | This is an irreversible operation.

72 |
73 |
74 |
75 | 76 | 77 | 78 |
79 |
80 |
81 |
82 | 83 | 84 |

${name_of(parent)}

85 | 86 | 87 | 88 | 89 |
90 | 91 | 92 |

${name_of(parent)}: $attachment.filename

93 | 94 | 95 | 96 | 101 | 102 | 103 | 106 | 107 | 108 |
97 | File $attachment.filename, 98 | ${pretty_size(attachment.size)} 99 | (added by ${authorinfo(attachment.author)}, ${pretty_dateinfo(attachment.date)}) 100 |
104 | ${wiki_to_html(context.child(parent), attachment.description)} 105 |
109 | 110 |
111 | 112 |
113 | 114 | 115 |
116 |
117 |
118 | 119 | 120 |
121 |
122 |
123 |
124 |
125 | 126 |
127 | 128 | 129 | -------------------------------------------------------------------------------- /templates/ticket_box.html: -------------------------------------------------------------------------------- 1 | 14 |
20 | 21 |
22 |

Opened ${pretty_dateinfo(ticket.time)}

23 |

Closed ${pretty_dateinfo(closetime)}

24 |

25 | Last modified ${pretty_dateinfo(ticket.changetime)}

26 |

(ticket not yet created)

27 |
28 | 29 | 30 |

31 | #${ticket.id} 32 | 33 | ${'status' in fields_map and fields[fields_map['status']].rendered or ticket.status} 34 | 35 | 36 | ${'type' in fields_map and fields[fields_map['type']].rendered or ticket.type} 37 | 38 | 39 | (${'resolution' in fields_map and fields[fields_map['resolution']].rendered or ticket.resolution}) 40 | 41 |

42 | 43 | 57 | 58 | 60 | 64 | 65 | 66 | 67 | 68 | 69 | 71 | 72 | 79 | 90 | 91 | 92 |
Reported by:$v_reporterOwned by:$v_owner
77 | ${field.label or field.name}: 78 | 83 | 84 | 85 | ${field.rendered} 86 | ${ticket[field.name]} 87 | 88 | 89 |
93 |
94 | 103 | 104 |
105 | 106 |
108 |
109 | 110 | 111 |
112 |
113 |
114 | ${wiki_to_html(context, ticket.description, escape_newlines=preserve_newlines)} 115 |
116 |
117 |
118 |
119 |
120 | -------------------------------------------------------------------------------- /htdocs/css/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | Theme Name: DEtrac 3 | Theme URI: https://github.com/wearede/DEtrac 4 | Description: This is bootstrap based theme for Trac 1.0.1 5 | Author: WE ARE DE Ltd 6 | Author URI: http://weare.de.com/ 7 | Version: 1.0 8 | */ 9 | 10 | /* Common 11 | -------------------------------------------------- */ 12 | html { 13 | position: relative; 14 | min-height: 100%; 15 | } 16 | body { 17 | /* Margin bottom by footer height */ 18 | margin-bottom: 115px; 19 | padding-top: 60px; 20 | } 21 | #content {margin-bottom: 25px;} 22 | #help {margin-top: 25px;} 23 | .footer { 24 | position: absolute; 25 | bottom: 0; 26 | width: 100%; 27 | /* Set the fixed height of the footer here */ 28 | height: 60px; 29 | background-color: #f5f5f5; 30 | } 31 | .footer .text-muted { 32 | margin: 20px 0; 33 | } 34 | .footer .de-footer-logo { 35 | background: url("../de-logo-bw.png") no-repeat center right transparent; 36 | display: block; 37 | height: 45px; 38 | width: 115px; 39 | margin: 12px 0 3px 0; 40 | background-size: contain; 41 | line-height: 36px; 42 | color: #C4C4C4; 43 | text-transform: capitalize; 44 | text-decoration: none; 45 | font-size: 90%; 46 | font-weight: 600; 47 | } 48 | 49 | /* Boostrap additional helpers 50 | -------------------------------------------------- */ 51 | .table-borderless td, .table-borderless th, .table-borderless tr {border: none !important;} 52 | 53 | /* Index 54 | -------------------------------------------------- */ 55 | #de-index, #de-index body {height: 100%;} 56 | #de-index body { 57 | margin-bottom: 0; 58 | padding-top: 0; 59 | } 60 | #de-index .left-col { 61 | float: left; 62 | } 63 | #de-index .right-col { 64 | float: right; 65 | height: 100%; 66 | background: url("../robo-bgr.jpg") no-repeat right 0 transparent; 67 | -webkit-background-size: cover; 68 | -moz-background-size: cover; 69 | -o-background-size: cover; 70 | background-size: cover; 71 | } 72 | #de-index .logo { 73 | background: url("../de-logo-bw.png") no-repeat center center rgba(255, 255, 255, 0.5); 74 | text-indent: -9999em; 75 | width: 100%; 76 | height: 100%; 77 | margin: 0; 78 | } 79 | 80 | /* Timeline 81 | -------------------------------------------------- */ 82 | 83 | #content.timeline .wiki .label-info, 84 | #content.timeline .wiki .label-info a { 85 | color: #fff; 86 | } 87 | 88 | /* Wiki 89 | -------------------------------------------------- */ 90 | 91 | 92 | /* Versioncontrol 93 | -------------------------------------------------- */ 94 | 95 | #content.browser table.dirlist td.name {width: 100%;} 96 | 97 | #content.browser table.dirlist tr span.expander, 98 | #content.browser table.dirlist td.name a, 99 | #content.browser table.dirlist td.size a, 100 | #content.browser table.dirlist td.rev a.chgset { 101 | position: relative; 102 | cursor: pointer; 103 | display: inline-block; 104 | font-family: 'Glyphicons Halflings'; 105 | font-style: normal; 106 | font-weight: 300; 107 | line-height: 1; 108 | top: 1px; 109 | -webkit-font-smoothing: antialiased; 110 | -moz-osx-font-smoothing: grayscale; 111 | } 112 | #content.browser table.dirlist tr span.expander:before {content: "\e158";} 113 | #content.browser table.dirlist tr span.expander:hover {} 114 | #content.browser table.dirlist tr.expanded span.expander:before {content: "\e159";} 115 | 116 | #content.browser table.dirlist td.name a.dir:before { 117 | content: "\e117"; 118 | margin-right: 8px; 119 | } 120 | #content.browser table.dirlist .expanded td.name a.dir:before {content: "\e118";} 121 | #content.browser table.dirlist td.name a.file:before { 122 | content: "\e022"; 123 | margin-right: 8px; 124 | } 125 | 126 | #content.browser table.dirlist a.trac-rawlink:before, 127 | #content.browser table.dirlist a.trac-ziplink:before { 128 | content: "\e025"; 129 | } 130 | #content.browser table.dirlist td.size { 131 | color: #888; 132 | text-align: right; 133 | vertical-align: middle; 134 | font-size: 85%; 135 | white-space: nowrap; 136 | } 137 | #content.browser table.dirlist td.size span {margin-right: 5px;} 138 | 139 | #content.browser table.dirlist td.rev { 140 | text-align: right; 141 | vertical-align: middle; 142 | font-size: 85%; 143 | white-space: nowrap; 144 | } 145 | #content.browser table.dirlist td.rev a.chgset:before {content: "\e032";} 146 | 147 | #content.browser table.dirlist td.age { 148 | vertical-align: middle; 149 | font-size: 85%; 150 | border-width: 1px 7px 0 0; 151 | white-space: nowrap; 152 | } 153 | 154 | #content.browser table.dirlist td.author { 155 | font-size: 85%; 156 | font-style: italic; 157 | font-weight: 700; 158 | white-space: nowrap; 159 | } 160 | #content.browser table.dirlist td.change { 161 | font-size: 85%; 162 | color: #888; 163 | white-space: nowrap; 164 | } 165 | 166 | #content.browser table.dirlist tr th {white-space: nowrap;} 167 | 168 | /* Tickets 169 | -------------------------------------------------- */ 170 | 171 | .tickets tr.color1-odd { background: #fdc; border-color: #e88; color: #a22 } 172 | .tickets tr.color1-even { background: #fed; border-color: #e99; color: #a22 } 173 | .tickets tr.color2-odd { background: #ffb; border-color: #eea; color: #880 } 174 | .tickets tr.color2-even { background: #ffd; border-color: #dd8; color: #880 } 175 | .tickets tr.color3-odd { background: #fbfbfb; border-color: #ddd; color: #444 } 176 | .tickets tr.color3-even { background: #f6f6f6; border-color: #ccc; color: #333 } 177 | .tickets tr.color4-odd { background: #e7ffff; border-color: #cee; color: #099 } 178 | .tickets tr.color4-even { background: #dff; border-color: #bee; color: #099 } 179 | .tickets tr.color5-odd { background: #e7eeff; border-color: #cde; color: #469 } 180 | .tickets tr.color5-even { background: #dde7ff; border-color: #cde; color: #469 } 181 | .tickets tr.color6-odd { background: #f0f0f0; border-color: #ddd; color: #888 } 182 | .tickets tr.color6-even { background: #f7f7f7; border-color: #ddd; color: #888 } 183 | .tickets tr.color6-odd a, .color6-even a { color: #b66 } 184 | 185 | .report .collapsed div, 186 | .report .collapsed span, 187 | .report .collapsed form {display: none;} 188 | 189 | #prefs > div {display: inline-block;} 190 | 191 | /* Ticket 192 | -------------------------------------------------- */ 193 | 194 | .ticket .faux-avatar { 195 | background-color: #7CCDE0; 196 | border-radius: 100px; 197 | font-size: 1.5em; 198 | font-style: italic; 199 | width: 100px; 200 | height: 100px; 201 | text-align: center; 202 | padding-top: 31px; 203 | color: #fff; 204 | margin-top: -10px; 205 | } 206 | 207 | .ticket .trac-content { 208 | background-color: #D5EAED; 209 | border: 1px solid #1DA132; 210 | } 211 | 212 | .ticket .collapsed .attachments {display: none;} 213 | 214 | .ticket .ticket-state .faux-avatar {display: none;} 215 | .ticket .user-comment { 216 | min-height: 20px; 217 | padding: 10px; 218 | margin-bottom: 20px; 219 | border-bottom: 5px solid #F4F4F4; 220 | } 221 | 222 | 223 | 224 | -------------------------------------------------------------------------------- /templates/wiki_view.html: -------------------------------------------------------------------------------- 1 | 4 | 11 | 12 | 13 | $title 14 | 15 | 18 | 27 | 28 | 29 | 30 |
31 | 32 | 33 | 34 | 35 | 39 | 42 | 43 |
36 | Version $page.version (modified by ${authorinfo(page.author)}, ${pretty_dateinfo(page.time)}) 37 | (diff) 38 |
40 | ${wiki_to_html(context, page.comment or '--')} 41 |
44 |
45 | 46 |
47 |
48 |
49 | 50 |
51 | 52 | 53 |

The page ${name_of(page.resource)} does not exist. You can create it here.

54 | 55 |

You could also create the same page higher in the hierarchy:

56 |
    57 |
  • ${markup}
  • 58 |
59 |
60 |
61 |
62 |
63 | 64 |
65 | 67 | 68 | 70 | 71 |
72 | 73 |
74 |

75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 |

87 | 88 | 94 |
95 | 96 | 97 |

98 |
99 | 100 | 101 | 102 |
103 |
104 |

105 | 106 | 107 |

108 |
109 |
110 |
111 | 112 |
113 |
114 |
115 | 116 | 117 | 118 |
119 |
120 |
121 |
122 |
123 |
124 | 125 |
126 |

The following pages have a name similar to this page, and may be related:

127 |
    128 |
  • ${markup}
  • 129 |
130 |
131 | 132 | 133 | 140 |

141 | 142 | Last modified ${pretty_dateinfo(page.time)} 144 | 145 |

146 |
147 | 148 | 149 |
150 |
151 | 152 |
153 | 154 | 155 | -------------------------------------------------------------------------------- /templates/ticket_change.html: -------------------------------------------------------------------------------- 1 | 14 | 30 | 31 | $prefix$cnum 32 | 33 |
${authorinfo(change.author)}
34 |
35 |

36 | 38 | ${commentref('comment:', cnum)} 39 | 40 | in reply to: ${commentref('↑ ', change.replyto)} 41 | ; 42 | 43 | 44 | 45 | follow-up: 46 | follow-ups: 47 | 48 | 49 | ${commentref('↓ ', reply, 'follow-up')} 50 | 51 | 52 | 53 | 54 | 55 | Changed ${pretty_dateinfo(change.date)} by ${authorinfo(change.author)} 56 | 57 | 58 | Changed by ${authorinfo(change.author)} 59 | 60 | 61 | 62 |

63 |
64 |
65 |
66 | 67 | 68 |
69 |
70 |
72 |
73 | 74 | 75 |
76 |
77 |
78 |
    79 |
  • 81 | ${field.label} 82 | 83 | 84 | ${field.new 85 | } 87 | added 88 | 89 | ${field.rendered} 90 | 91 | changed from ${field.old} to ${field.new} 92 | 93 | 94 | set to ${field.new} 95 | 96 | 97 | ${field.old} deleted 98 | 99 | 100 | () 104 | 105 | 106 |
  • 107 |
108 |
110 |
111 | 113 | 114 |
115 |
116 | 118 | 120 | 122 |
123 |
124 | 125 |
128 | ${wiki_to_html(context, text, escape_newlines=preserve_newlines)} 129 |
130 |
131 | ${wiki_to_html(context, change.comment_history[int(cversion)].comment, escape_newlines=preserve_newlines)} 132 |
133 |
134 | ${wiki_to_html(context, change.comment, escape_newlines=preserve_newlines)} 135 |
136 |
137 |
139 | 140 | Version ${comment_version}, edited ${pretty_dateinfo(change.comment_history[comment_version].date)} 141 | by ${authorinfo(change.comment_history[comment_version].author)} 142 | 143 | 144 | Last edited ${pretty_dateinfo(change.comment_history[comment_version].date)} 145 | by ${authorinfo(change.comment_history[comment_version].author)} 146 | 147 | 148 | (previous) 150 | 151 | 152 | (next) 154 | 155 | 156 | (diff) 158 | 159 |
160 |
161 | 162 | -------------------------------------------------------------------------------- /templates/report_view.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | $title 11 | 16 | 17 | 18 | 19 |
20 | 25 | 26 | 29 | 30 |
31 |
32 |
33 |
34 |
35 | 36 | 37 |
38 |
39 | Arguments 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 50 | 51 | 52 |
48 | 49 |
53 |
54 |
55 | 56 |
57 |
58 | 59 | 60 |
61 |
62 |
63 | 64 | 65 |
66 |
67 |
68 |
69 | 70 | 71 |
72 |
73 |
74 |
75 | 76 | 77 |
78 |
79 |
80 |
81 | 82 |

83 | Results (${paginator.displayed_items()}) 84 |

85 | 86 | 87 | 88 | 91 | 92 | $header.title 93 | 94 | 95 | 96 | 97 | 98 |

99 | $value_for_group 100 | 101 | (${ngettext('%(num)s match', '%(num)s matches', cnt) if cnt else _('No matches found.')}) 102 | 103 |

104 |
105 | ${group_heading(*row_groups[0]) if row_groups else None} 106 | 107 | 108 | 109 | ${column_headers()} 110 | 111 | 112 | 113 | 116 | 117 | ${column_headers()} 118 | 119 | 120 | 121 | 122 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 143 | 144 | 145 | 146 | 151 | 152 | 153 | 154 | 159 | 160 | 161 | 162 | 163 | 166 | 167 | 168 | 169 | 172 | 173 | 174 | 175 | 178 | 179 | 180 | 181 | 185 | 186 | 187 | 188 | 192 | 193 | 194 | 195 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 |
114 | ${group_heading(value_for_group or _('(empty)'), row_group)} 115 |
140 | {$cell.value} 141 |
142 |
147 | ${shortname_of(row.resource)} 149 |
150 |
155 | $cell.value 157 |
158 |
${format_time(from_utimestamp(long(cell.value))) if cell.value != '' else '--'} 164 |
165 |
${format_date(from_utimestamp(long(cell.value))) if cell.value != '' else '--'} 170 |
171 |
${format_datetime(from_utimestamp(long(cell.value))) if cell.value != '' else '--'} 176 |
177 |
182 | ${wiki_to_html(context.child(row.resource), cell.value)} 183 |
184 |
189 | $cell.value 190 |
191 |
$cell.value 196 |
197 |
209 | 210 | 211 | 212 | 213 | 214 |

215 | Note: 216 | See TracReports for help on using and creating reports. 217 |

218 |
219 | 220 | 221 | -------------------------------------------------------------------------------- /templates/browser.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | 11 | <py:when test="1">/</py:when> 12 | <py:when test="2">${path_links[-1].name}</py:when> 13 | <py:otherwise><i18n:msg params="basename, dirname">${path_links[-1].name} in ${'/'.join(part.name for part in path_links[1:-1])}</i18n:msg></py:otherwise> 14 | 15 | 16 | 17 | 18 | 47 | 48 | 49 | 50 |
51 | 52 | 53 |

55 | Default Repository 56 |

57 | 58 | 59 | 60 |
61 |
62 |
63 | 70 |
71 |
72 |
73 | 74 |
75 |
76 |
77 | 79 | 80 |
81 |
82 |
83 | 84 |
85 |
86 |
87 | 88 | 95 | 96 |
97 |
98 |
99 | 100 |
101 | ${branch} 104 | ${tag} 105 |
106 |
107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 117 | 118 | 119 | 120 | 121 | 124 | 125 | 126 |
115 | ../ 116 |
122 | No files found 123 |
127 |
128 | 129 | 130 | 131 | 155 | 156 | 157 | 164 | 165 | 166 | 186 | 187 | 188 | 192 | 193 |
136 | 137 | 138 | 139 | Last change 140 | on this file since ${display_rev(stickyrev)} was 141 | $drev, 142 | checked in by $author, $age 143 | 144 | 145 | 146 | 147 | Last change 148 | on this file was 149 | $drev, 150 | checked in by $author, $age 151 | 152 | 153 | 154 |
158 | 159 | ${wiki_to_html(context.child('changeset', file.changeset.rev, parent=repos.resource), 160 | file.changeset.message, escape_newlines=True)} 161 | 162 | ${file.changeset.message} 163 |
167 |
    168 | 169 | 170 | $prop.value 171 | $prop.value 172 | 173 | 174 |
  • 175 | 176 | 178 |
    179 | 180 | 181 | Property $prop.name set to ${prop_value(prop)} 182 | 183 |
  • 184 |
185 |
189 | File size: 190 | ${pretty_size(file.size)} 191 |
194 | 195 |
196 | ${wiki_to_html(context.child('source', '/', parent=repos.resource), repoinfo.description)} 197 |
198 | 199 | 200 |
201 | 202 | 203 | 204 | 205 |
206 | 207 |
208 | 209 |
210 | 211 |
212 |
213 |
214 | 215 | 216 | 217 | 218 | 219 |
220 |
221 |
222 | 223 |

224 | Note: See TracBrowser for help on using the repository browser. 225 |

226 | 227 |
228 | 229 | 230 | -------------------------------------------------------------------------------- /templates/revisionlog.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | ${'/'.join(part.name for part in path_links[1:]) or '/'} (log) 11 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
31 |
32 | 33 | 34 |
35 |
36 | Revision Log Mode: 37 | 43 | 49 | 55 |
56 |
57 | 58 | 62 | 66 |
67 | 68 | 73 |
74 | 78 |
79 |
80 | 81 |
82 |
83 | 84 |
85 |
86 |

Legend:

87 |
88 |
Added
89 | 90 |
Removed
91 |
92 |
Modified
93 |
Copied or renamed
94 |
95 |
96 |
97 | 98 |
99 |
100 | 101 | 103 |
104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 124 | 125 | 126 | 127 | 131 | 132 | 133 | 137 | 138 | 139 | 140 | 149 | 150 | 157 | 169 | 184 | 185 | 187 | 188 | 189 | 196 | 197 | 198 | 199 | 200 | 201 |
GraphDiffRevAgeAuthorLog Message
119 | 120 | 121 | 122 | No revisions found 123 |
134 | 135 | copied from $item.copyfrom_path: 136 |
141 | 142 | 145 | 148 | 151 | 153 | 154 | ($item.change) 155 | 156 | 158 | 160 | @${display_rev(item.existing_rev)} 161 | 162 |   164 |   167 | 168 | 170 | 171 | 174 | 175 | 176 | ${wiki_to_oneliner(chgset_context, change.message, shorten=True)} 177 | 178 | ${shorten_line(change.message)} 179 | ${branch} 182 | ${tag} 183 | 186 |
190 | 191 | 192 | ${wiki_to_html(chgset_context, change.message, escape_newlines=True)} 193 | 194 |
${change.message}
195 |
202 | 203 |
204 | 206 |
207 |
208 | 209 |
210 | Note: See TracRevisionLog 211 | for help on using the revision log. 212 |
213 | 214 |
215 | 216 | 217 | -------------------------------------------------------------------------------- /templates/error.html: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 10 | ${title or _('Error')} 11 | 12 | 46 | 55 | 56 | 57 | 58 | 59 | 61 | 62 | 63 | 64 | 65 | 66 | 67 |
68 | 69 | 70 | 77 | 78 | 79 | 84 | 85 | 86 |

There was an internal error in Trac. 87 | It is recommended that you notify your local 88 | 89 | Trac administrator with the information needed to 90 | reproduce the issue. 91 |

92 |
94 |

To that end, you could ${create_ticket()} a ticket.

95 |
96 |

The action that triggered the error was:

97 |
${req.method}: ${req.path_info}
98 |
99 | 100 |
101 |

This is probably a local installation issue. 102 | 103 | You should ${create_ticket()} a ticket at the admin Trac to report 104 | the issue. 105 | 106 |

107 |
108 |
109 |

Found a bug in Trac?

110 |
111 |

If you think this should work and you can reproduce the problem, 112 | you should consider creating a bug report.

113 |

114 | 115 | Note that the ${faulty_plugins[0].name} plugin seems to be involved. 116 | 117 | 118 | Note that the following plugins seem to be involved: 119 | ${', '.join([p.name for p in faulty_plugins])} 120 | 121 | Please report this issue to the plugin maintainer. 122 |

123 |

Before you do that, though, please first try 124 | searching 125 | for similar issues, as it is quite likely that this problem 126 | has been reported before. For questions about installation 127 | and configuration of Trac or its plugins, please try the 128 | mailing list 129 | instead of creating a ticket. 130 |

131 |
132 | 136 |
137 | 138 |
139 |

Python Traceback

140 |
141 | Most recent call last: 142 | 176 |
File "${frame.filename}", line ${frame.lineno + 1}, in ${frame.function}
177 |     ${frame.line.lstrip()}
178 |   ${traceback}
179 |
180 | 183 |
184 |
185 |
186 |

System Information:

187 |
188 | 189 | 190 | 191 | 192 | 193 |
$name$value
194 |
195 |
196 | 197 |
198 |

Enabled Plugins:

199 |
200 | 201 | 202 | 205 | 206 | 207 | 208 |
203 | $plugin.name 204 | ${plugin.version or _('N/A')}$plugin.path
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |

217 | TracGuide — The Trac User and Administration Guide 218 |

219 |
220 | 221 | 222 | -------------------------------------------------------------------------------- /templates/diff_div.html: -------------------------------------------------------------------------------- 1 | 38 |
43 | 44 |
    45 | 46 |
  • 48 |

    49 | $new.path 51 |   52 |

    53 |
    $comments
    54 |
      55 | 56 | $name 57 | 58 | 59 | 60 | $prop.rendered.content 61 | $prop.value 62 | $prop.value 63 | 64 | 65 | 66 | $prop.diff 67 | 71 |
    • 72 | 73 | Property ${prop_name(name, name_attrs)} 74 | changed from ${render_property(prop.old)} to ${render_property(prop.new)} 75 | 76 | 77 | Property ${prop_name(name, name_attrs)} set to ${render_property(prop.new)} 78 | 79 | 80 | Property ${prop_name(name, name_attrs)} deleted 81 | 82 |
    • 83 |
      84 |
      85 |
    86 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 99 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 115 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 210 | 211 | 212 | 213 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 |
    96 | $longcol $old.rev 98 | 100 | $longcol $new.rev 102 |
    111 | 113 | $shortcol$old.shortrev 114 | 116 | 118 | $shortcol$new.shortrev 119 | ${item.diffs_title[0]} 
    $from_n$line $to_n${clines[idx] if idx < len(clines) else None} $from_n$to_n$line 
      $to_n$line  $to_n$line 
    $from_n$line   $from_n $line 
    ${block.base.offset+idx+1}$line ${block.changed.offset + idx + 1 if within_change else ' '}${block.changed.lines[idx]} 
    ${block.base.offset + idx + 1 if within_change else ' '}${block.base.lines[idx]} ${block.changed.offset + idx + 1}$line 
    ${block.base.offset + idx + 1} $line 
     ${block.changed.offset + idx + 1}$line 
      
    ${item.diffs_title[idx+1]} 
    240 |
  • 241 |
    242 |
243 | 244 |
245 | -------------------------------------------------------------------------------- /templates/ticket.html: -------------------------------------------------------------------------------- 1 | 4 | 9 | 10 | 11 | 12 | 13 | <py:when test="ticket.exists">#${ticket.id} (${ticket.summary})</py:when> 14 | <py:otherwise>New Ticket</py:otherwise> 15 | 16 | 17 | 114 | 115 | 116 | 117 | 118 | $prefix$cnum 119 | 120 | 121 |
130 | 131 |
132 | Modify ↓ 133 |
134 | 135 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 148 | 149 | 150 |
151 |
152 |
153 |
154 | 155 | 156 | 157 | 158 | 162 |
163 |
164 | 165 | 166 |
167 |
168 |
169 | 170 |

Change History (${len(changes)})

171 | 172 |
    173 | 174 |
  • 176 | 177 |
  • 178 |
    179 |
180 |
181 |
182 | 183 | 184 |
187 | 188 |
189 |

Add Comment

190 |
191 |
194 | This ticket has been modified since you started editing. You should review the 195 | other modifications which have been appended above, 196 | and any conflicts shown in the preview below. 197 | You can nevertheless proceed and submit your changes if you wish so. 198 |
199 | 200 |
201 | 205 | 207 |
208 |
209 |
210 | 211 |
212 |

Modify Ticket

213 |
214 | 215 | 216 | 220 | 221 |
223 | 224 |
225 | 226 | 227 | 228 | 231 | 232 | 233 | 234 | 235 | 238 | 239 | 240 | 241 | 242 | 243 | 251 | 252 | 253 |
229 | 230 |
236 | 237 |
244 |
245 | 248 | 249 |
250 |
254 |
255 | 256 |
257 | 258 | 261 | 263 | 268 | 319 | 320 | 321 |
264 | 267 | 270 | 271 | 284 | 287 | 288 | 290 | 291 | 292 | 298 | 299 | 300 | 301 | ${field.cc_entry} 302 | 305 | 306 | 307 | 308 | 311 | 312 | 313 | 315 | 316 | 317 | 318 |
322 |
323 |
324 | 325 | 326 | 327 | 328 |
329 | Action 330 |
331 | 333 | 334 | $controls 335 | $hint 336 |
337 |
338 | 339 | 340 | 341 | 342 | 343 |
344 |
345 |
346 |
347 | 348 | 349 |
352 | 353 |
354 | 355 | 356 |
357 |
358 | Author 359 | Reporter 360 | 361 | 362 | 365 | 369 | 370 |
363 |
364 |
366 | 367 |
368 |
371 |

372 | E-mail address and user name can be saved in the Preferences. 373 |

374 |
375 |
376 | 377 | 378 |

379 | 383 |

384 | 385 |
386 | Attachments ↑ 387 | Description ↑ 388 |
389 |
390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 |
398 | 399 |
400 | 401 | 403 | 404 |

405 | Note: See 406 | TracTickets for help on using 407 | tickets. 408 |

409 |
410 | 411 | 412 | -------------------------------------------------------------------------------- /htdocs/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.2.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('