diff --git a/trac/htdocs/css/report.css b/trac/htdocs/css/report.css
|
a
|
b
|
|
| 50 | 50 | /* Styles for the report list and the report results table |
| 51 | 51 | (extends the styles for "table.listing") */ |
| 52 | 52 | .reports td.title { width: 100% } |
| 53 | | .reports tbody td :link, .reports tbody td :visited, |
| 54 | | .tickets tbody td :link, .tickets tbody td :visited { display: block } |
| 55 | 53 | .tickets { border-bottom: none } |
| 56 | 54 | .tickets thead th { text-transform: capitalize; white-space: nowrap; } |
| 57 | 55 | .tickets tbody td, .reports tbody td { padding: .1em .5em !important } |
diff --git a/trac/htdocs/css/ticket.css b/trac/htdocs/css/ticket.css
|
a
|
b
|
|
| 56 | 56 | width: 20%; |
| 57 | 57 | } |
| 58 | 58 | #ticket table.properties td { width: 30% } |
| | 59 | #ticket table.properties td p:first-child { margin-top: 0 } |
| | 60 | #ticket table.properties td p:last-child { margin-bottom: 0 } |
| 59 | 61 | #ticket table.properties .description { border-top: 1px solid #dd9 } |
| 60 | 62 | |
| 61 | 63 | #ticket .description h3 { |
diff --git a/trac/ticket/api.py b/trac/ticket/api.py
|
a
|
b
|
|
| 271 | 271 | if '' in field['options']: |
| 272 | 272 | field['optional'] = True |
| 273 | 273 | field['options'].remove('') |
| | 274 | elif field['type'] == 'text': |
| | 275 | field['format'] = config.get(name + '.format', 'plain') |
| 274 | 276 | elif field['type'] == 'textarea': |
| | 277 | field['format'] = config.get(name + '.format', 'plain') |
| 275 | 278 | field['width'] = config.getint(name + '.cols') |
| 276 | 279 | field['height'] = config.getint(name + '.rows') |
| 277 | 280 | fields.append(field) |
diff --git a/trac/ticket/query.py b/trac/ticket/query.py
|
a
|
b
|
|
| 573 | 573 | |
| 574 | 574 | cols = self.get_columns() |
| 575 | 575 | labels = dict([(f['name'], f['label']) for f in self.fields]) |
| | 576 | wikify = dict((f['name'], f['type'] == 'text' and f.get('format') == 'wiki') for f in self.fields) |
| 576 | 577 | |
| 577 | 578 | # TODO: remove after adding time/changetime to the api.py |
| 578 | 579 | labels['changetime'] = _('Modified') |
| … |
… |
|
| 580 | 581 | |
| 581 | 582 | headers = [{ |
| 582 | 583 | 'name': col, 'label': labels.get(col, _('Ticket')), |
| | 584 | 'wikify': wikify.get(col, False), |
| 583 | 585 | 'href': self.get_href(context.href, order=col, |
| 584 | 586 | desc=(col == self.order and not self.desc)) |
| 585 | 587 | } for col in cols] |
diff --git a/trac/ticket/templates/query_results.html b/trac/ticket/templates/query_results.html
|
a
|
b
|
|
| 62 | 62 | <py:when test="name == 'reporter'">${authorinfo(value)}</py:when> |
| 63 | 63 | <py:when test="name == 'cc'">${format_emails(ticket_context, value)}</py:when> |
| 64 | 64 | <py:when test="name == 'owner' and value">${authorinfo(value)}</py:when> |
| | 65 | <py:when test="header.wikify">${wiki_to_oneliner(ticket_context, value)}</py:when> |
| 65 | 66 | <py:otherwise>$value</py:otherwise> |
| 66 | 67 | </td> |
| 67 | 68 | </py:with> |
diff --git a/trac/ticket/templates/ticket.html b/trac/ticket/templates/ticket.html
|
a
|
b
|
|
| 324 | 324 | </select> |
| 325 | 325 | <textarea py:when="'textarea'" id="field-${field.name}" name="field_${field.name}" |
| 326 | 326 | cols="${field.width}" rows="${field.height}" |
| | 327 | class="${field.format == 'wiki' and 'wikitext' or None}" |
| 327 | 328 | py:content="value"></textarea> |
| 328 | 329 | <span py:when="'checkbox'"> |
| 329 | 330 | <input type="checkbox" id="field-${field.name}" name="field_${field.name}" |
diff --git a/trac/ticket/tests/api.py b/trac/ticket/tests/api.py
|
a
|
b
|
|
| 24 | 24 | self.env.config.set('ticket-custom', 'test', 'text') |
| 25 | 25 | self.env.config.set('ticket-custom', 'test.label', 'Test') |
| 26 | 26 | self.env.config.set('ticket-custom', 'test.value', 'Foo bar') |
| | 27 | self.env.config.set('ticket-custom', 'test.format', 'wiki') |
| 27 | 28 | fields = TicketSystem(self.env).get_custom_fields() |
| 28 | 29 | self.assertEqual({'name': 'test', 'type': 'text', 'label': 'Test', |
| 29 | | 'value': 'Foo bar', 'order': 0}, |
| | 30 | 'value': 'Foo bar', 'order': 0, 'format': 'wiki'}, |
| 30 | 31 | fields[0]) |
| 31 | 32 | |
| 32 | 33 | def test_custom_field_select(self): |
| … |
… |
|
| 57 | 58 | self.env.config.set('ticket-custom', 'test.value', 'Foo bar') |
| 58 | 59 | self.env.config.set('ticket-custom', 'test.cols', '60') |
| 59 | 60 | self.env.config.set('ticket-custom', 'test.rows', '4') |
| | 61 | self.env.config.set('ticket-custom', 'test.format', 'wiki') |
| 60 | 62 | fields = TicketSystem(self.env).get_custom_fields() |
| 61 | 63 | self.assertEqual({'name': 'test', 'type': 'textarea', 'label': 'Test', |
| 62 | 64 | 'value': 'Foo bar', 'width': 60, 'height': 4, |
| 63 | | 'order': 0}, |
| | 65 | 'order': 0, 'format': 'wiki'}, |
| 64 | 66 | fields[0]) |
| 65 | 67 | |
| 66 | 68 | def test_custom_field_order(self): |
diff --git a/trac/ticket/web_ui.py b/trac/ticket/web_ui.py
|
a
|
b
|
|
| 48 | 48 | from trac.web.chrome import add_link, add_script, add_stylesheet, \ |
| 49 | 49 | add_warning, add_ctxtnav, prevnext_nav, Chrome, \ |
| 50 | 50 | INavigationContributor, ITemplateProvider |
| 51 | | from trac.wiki.formatter import format_to |
| | 51 | from trac.wiki.formatter import format_to, format_to_html, format_to_oneliner |
| 52 | 52 | |
| 53 | 53 | class InvalidTicket(TracError): |
| 54 | 54 | """Exception raised when a ticket fails validation.""" |
| … |
… |
|
| 580 | 580 | |
| 581 | 581 | return 'ticket.html', data, None |
| 582 | 582 | |
| 583 | | def _prepare_data(self, req, ticket, absurls=False): |
| | 583 | def _get_preserve_newlines(self): |
| 584 | 584 | preserve_newlines = self.preserve_newlines |
| 585 | 585 | if preserve_newlines == 'default': |
| 586 | 586 | preserve_newlines = self.env.get_version(initial=True) >= 21 # 0.11 |
| 587 | | preserve_newlines = preserve_newlines in _TRUE_VALUES |
| | 587 | return preserve_newlines in _TRUE_VALUES |
| | 588 | |
| | 589 | def _prepare_data(self, req, ticket, absurls=False): |
| 588 | 590 | return {'ticket': ticket, |
| 589 | 591 | 'context': Context.from_request(req, ticket.resource, |
| 590 | 592 | absurls=absurls), |
| 591 | | 'preserve_newlines': preserve_newlines} |
| | 593 | 'preserve_newlines': self._get_preserve_newlines()} |
| 592 | 594 | |
| 593 | 595 | def _toggle_cc(self, req, cc): |
| 594 | 596 | """Return an (action, recipient) tuple corresponding to a change |
| … |
… |
|
| 1149 | 1151 | value = ticket.values.get(name) |
| 1150 | 1152 | if value in ('1', '0'): |
| 1151 | 1153 | field['rendered'] = value == '1' and _('yes') or _('no') |
| 1152 | | |
| | 1154 | elif type_ == 'text': |
| | 1155 | if field.get('format') == 'wiki': |
| | 1156 | field['rendered'] = format_to_oneliner(self.env, context, |
| | 1157 | ticket[name]) |
| | 1158 | elif type_ == 'textarea': |
| | 1159 | if field.get('format') == 'wiki': |
| | 1160 | field['rendered'] = \ |
| | 1161 | format_to_html(self.env, context, ticket[name], |
| | 1162 | escape_newlines=self._get_preserve_newlines()) |
| | 1163 | |
| 1153 | 1164 | # ensure sane defaults |
| 1154 | 1165 | field.setdefault('optional', False) |
| 1155 | 1166 | field.setdefault('options', []) |