Changeset 4910

Show
Ignore:
Timestamp:
12/01/08 09:08:53 (1 month ago)
Author:
takanorig
Message:

(refs #4120)
python2.6でも動作するように修正。simplejson、json-pyのどちらか一方が利用できれば処理可能。
管理画面で、ダイアログメッセージが日本語になってしまう問題を修正。
(refs #4186)
チケットの変更の場合も、テンプレートが利用できるようにした。

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ticketextplugin/0.11/setup.py

    r4672 r4910  
    66setup( 
    77    name = 'TicketExtPlugin', 
    8     version = '0.2.1', 
     8    version = '0.2.2', 
    99    description = "Ticket extensions for Trac", 
    1010    url = "http://trac-hacks.org/wiki/TicketExtPlugin", 
  • ticketextplugin/0.11/ticketext/api.py

    r4454 r4910  
    33import json 
    44from os import environ 
    5 from trac.core import Component, implements 
     5from trac.core import * 
    66 
    77class TicketExtUtil(Component): 
     
    2929        template_field = self.get_template_field(ticket_type) 
    3030         
    31         response = json.write(
     31        response_data =
    3232            "template"     : template_field['template'], 
    3333            "enablefields" : template_field['enablefields'], 
    34         }); 
     34        } 
     35         
     36        if hasattr(json, 'dumps'): 
     37            # use simplejson(After python2.6 default) 
     38            response = json.dumps(response_data); 
     39            response = unicode(response, 'utf-8')         
     40        elif hasattr(json, 'write'): 
     41            # use json-py 
     42            response = json.write(response_data); 
     43        else: 
     44            raise TracError('JSON library import error.') 
     45         
    3546         
    3647        req.send_response(200) 
  • ticketextplugin/0.11/ticketext/htdocs/ticketext.js

    r4618 r4910  
    6262 * @param descIdValue The ticket description element id. 
    6363 */ 
    64 var TicketTemplate = function(baseUrlValue, typeIdValue, descIdValue) { 
    65          
     64var TicketTemplate = function(baseUrlValue) { 
     65     
    6666    this.STYLE_CLASS_EXCLUDE = "te_exclude"; 
    6767    this.DELIM               = ","; 
    6868     
    69     this.baseUrl          = "/"; 
    70     this.typeId           = "type"; 
    71     this.descId           = "template"; 
    72     this.enablefieldsId   = "enablefields"; 
     69    // for TracWysiwygPlugin Parameter 
     70    this.WYSISYG_MAX_NUM       = 10; 
     71    this.WYSISYG_EDITOR_PREFIX = "__EDITOR__"; 
     72     
     73    this.baseUrl           = "/"; 
     74    this.typeId            = "type"; 
     75    this.descId            = "template"; 
     76    this.enablefieldsId    = "enablefields"; 
     77    this.readyDescription  = false; 
     78    this.readyCustomfields = true; 
    7379     
    7480    // trac default field name 
    75     // "__EDITOR__1" is for TracWysiwygPlugin 
    7681    this.defaultPropArray = ["field_summary", "field_reporter", "field_description", 
    7782                             "field_owner", "field_type", "field_priority", "field_milestone", 
    78                              "field_component", "field_version", "field_keywords", "field_cc", 
    79                              "__EDITOR__1"]; 
     83                             "field_component", "field_version", "field_keywords", "field_cc"]; 
    8084     
    8185    if (baseUrlValue) { 
    8286        this.baseUrl = baseUrlValue; 
    83     } 
    84     if (typeIdValue) { 
    85         this.typeId = typeIdValue; 
    86     } 
    87     if (descIdValue) { 
    88         this.descId = descIdValue; 
    89     } 
    90      
     87    }     
     88}; 
     89 
     90/** 
     91 * Initialize TicketTemplate. 
     92 */ 
     93TicketTemplate.prototype.initialize = function() { 
    9194    var typeElem = document.getElementById(this.typeId); 
    9295    if (!typeElem) { 
     
    9598     
    9699    // Apply template at the first time. 
    97     // except preview 
    98     var previewFieldsElem = document.getElementById("preview"); 
    99     if (!previewFieldsElem || previewFieldsElem.tagName != "FIELDSET") { 
    100         this.selectTemplate(typeElem); 
    101     } 
     100    this.selectTemplate(typeElem); 
    102101     
    103102    $(typeElem).change(this.changeType(typeElem)); 
    104 }; 
     103} 
    105104 
    106105/** 
     
    168167    } 
    169168 
    170     this.applyDescription(templateData); 
    171     this.applyCustomfields(templateData); 
     169    // If not ready, not apply only at the first time. 
     170    // So ready to apply after first time. 
     171    if (this.readyDescription) { 
     172        this.applyDescription(templateData); 
     173    } else { 
     174        this.readyDescription = true; 
     175    } 
     176    if (this.readyCustomfields) { 
     177        this.applyCustomfields(templateData); 
     178    } else { 
     179        this.readyCustomfields = true; 
     180    } 
    172181} 
    173182 
     
    189198    // it must be chnage edit mode before change the description value. 
    190199    var enableWysiwyg = false; 
    191     var editorMode; 
    192     var textareaModeElem; 
    193     var wysiwygModeElem; 
    194      
    195200    if(typeof TracWysiwyg == "function") { 
    196201        enableWysiwyg = true; 
    197202    } 
     203 
     204    var editorMode; 
     205    var txtareaModeElemArray = new Array(); 
     206    var wysiwygModeElemArray = new Array(); 
    198207     
    199208    if (enableWysiwyg) { 
     209        for (var index = 0; index < this.WYSISYG_MAX_NUM; index++) { 
     210            var countStr = String(index + 1); 
     211            var txtareaModeElem = document.getElementById("editor-textarea-" + countStr); 
     212            var wysiwygModeElem = document.getElementById("editor-wysiwyg-" + countStr); 
     213            if (txtareaModeElem && wysiwygModeElem) { 
     214                txtareaModeElemArray.push(txtareaModeElem); 
     215                wysiwygModeElemArray.push(wysiwygModeElem); 
     216            } else { 
     217                break; 
     218            } 
     219        } 
     220         
    200221        editorMode = TracWysiwyg.getEditorMode(); 
    201         textareaModeElem = document.getElementById("editor-textarea-1"); 
    202         wysiwygModeElem = document.getElementById("editor-wysiwyg-1"); 
    203          
    204         if (editorMode != "textarea" && textareaModeElem) { 
    205             textareaModeElem.click(); 
    206         } 
    207     } 
    208      
     222         
     223        if (editorMode != "textarea") { 
     224            for (var index = 0; index < txtareaModeElemArray.length; index++) { 
     225                var txtareaModeElem = txtareaModeElemArray[index]; 
     226                if (txtareaModeElem) { 
     227                    txtareaModeElem.click(); 
     228                } 
     229            } 
     230        } 
     231    } 
     232     
     233    // apply template 
    209234    descElem.value = templateValue; 
    210235     
     
    212237        switch (editorMode) { 
    213238        case "textarea": 
    214             if (textareaModeElem) { 
    215                 textareaModeElem.click(); 
     239            for (var index = 0; index < txtareaModeElemArray.length; index++) { 
     240                var txtareaModeElem = txtareaModeElemArray[index]; 
     241                if (txtareaModeElem) { 
     242                    txtareaModeElem.click(); 
     243                } 
    216244            } 
    217245            break; 
    218246        case "wysiwyg": 
    219             if (wysiwygModeElem) { 
    220                 wysiwygModeElem.click(); 
     247            for (var index = 0; index < wysiwygModeElemArray.length; index++) { 
     248                var wysiwygModeElem = wysiwygModeElemArray[index]; 
     249                if (wysiwygModeElem) { 
     250                    wysiwygModeElem.click(); 
     251                } 
    221252            } 
    222253            break; 
     
    298329    for (var index = 0; index < inputElemArray.length; index++) { 
    299330        var inputType = inputElemArray[index].type; 
    300         if (inputType.match("(text)|(checkbox)|(radio)|(file)")) { 
     331        var elemName = inputElemArray[index].name; 
     332         
     333        // include input fields. 
     334        // exclude TracWysiwygPlugin fields.  
     335        if (inputType.match("(text)|(checkbox)|(radio)|(file)") 
     336         && elemName.indexOf(this.WYSISYG_EDITOR_PREFIX) != 0) { 
    301337            propArray.push(inputElemArray[index]); 
    302338        } 
     
    330366 
    331367/** 
    332  * Initialize TicketTemplate
     368 * Set element Id
    333369 *  
    334370 * @param typeId The ticket type element id. 
    335371 * @param descId The ticket description element id. 
    336372 */ 
    337 TicketTemplate.initialize = function(baseUrl, typeId, descId) { 
    338     var ticketTemplateObj = new TicketTemplate(baseUrl, typeId, descId); 
     373TicketTemplate.prototype.setElementId = function(typeId, descId) { 
     374    this.typeId = typeId; 
     375    this.descId = descId; 
     376
     377 
     378/** 
     379 * Apply the description on load page. 
     380 *  
     381 * @param readyDescription if true, apply the description on load 
     382 */ 
     383TicketTemplate.prototype.setReadyDescription = function(readyDescription) { 
     384    this.readyDescription = readyDescription; 
     385
     386 
     387/** 
     388 * Apply the custom fields on load page. 
     389 *  
     390 * @param readyCustomfields if true, apply the custom fields on load 
     391 */ 
     392TicketTemplate.prototype.setReadyCustomfields = function(readyCustomfields) { 
     393    this.readyCustomfields = readyCustomfields; 
     394
     395 
     396/** 
     397 * Initialize TicketTemplate as static. 
     398 *  
     399 * @param baseUrl The base URL of the ajax request. 
     400 */ 
     401TicketTemplate.setUp = function(baseUrl) { 
     402    var ticketTemplateObj = new TicketTemplate(baseUrl); 
     403    ticketTemplateObj.initialize(); 
    339404}; 
  • ticketextplugin/0.11/ticketext/template_admin.py

    r4531 r4910  
    3030        if req.perm.has_permission('TRAC_ADMIN') and filename.startswith('template_admin'): 
    3131            script = '\n<script type="text/javascript">'\ 
    32                    + 'TicketTemplate.initialize(\'' + req.base_path + '\');'\ 
     32                   + 'TicketTemplate.setUp(\'' + req.base_path + '\');'\ 
    3333                   + '</script>\n' 
    3434            return stream | Transformer('//div[@id="footer"]').before(MarkupTemplate(script).generate()) 
  • ticketextplugin/0.11/ticketext/template.py

    r4457 r4910  
    3232    # IRequestFilter method 
    3333    def post_process_request(self, req, template, data, content_type): 
    34         if template == 'ticket.html' and req.path_info == '/newticket'
     34        if template == 'ticket.html'
    3535            add_script(req, 'ticketext/ticketext.js') 
    3636            add_stylesheet(req, 'ticketext/ticketext.css') 
     
    4141    # ITemplateStreamFilter method 
    4242    def filter_stream(self, req, method, filename, stream, data): 
    43         if filename == 'ticket.html' and req.path_info == '/newticket': 
    44             script = '\n<script type="text/javascript">'\ 
    45                    + 'TicketTemplate.initialize(\'' + req.base_path + '\', \'field-type\', \'field-description\');'\ 
     43        if filename == 'ticket.html': 
     44            readyDescription = False 
     45             
     46            if req.path_info == '/newticket' and 'preview' not in req.args: 
     47                readyDescription = True 
     48             
     49            script = '\n<script type="text/javascript">\n'\ 
     50                   + 'var tikectTemplate = new TicketTemplate(\'' + req.base_path + '\');\n'\ 
     51                   + 'tikectTemplate.setElementId(\'field-type\', \'field-description\');\n'\ 
     52                   + 'tikectTemplate.setReadyDescription(' + str(readyDescription).lower() + ');\n'\ 
     53                   + 'tikectTemplate.initialize();\n'\ 
    4654                   + '</script>\n' 
     55 
    4756            return stream | Transformer('//div[@id="footer"]').before(MarkupTemplate(script).generate()) 
    4857         
  • ticketextplugin/0.11/ticketext/templates/template_admin.html

    r4453 r4910  
    55      xmlns:xi="http://www.w3.org/2001/XInclude" 
    66      xmlns:py="http://genshi.edgewall.org/" 
    7       lang="ja" xml:lang="ja"> 
     7      lang="en" xml:lang="en"> 
    88<xi:include href="admin.html" /> 
    99