root/galaxy-central/templates/page/editor.mako @ 2

リビジョン 2, 36.5 KB (コミッタ: hatakeyama, 14 年 前)

import galaxy-central

行番号 
1<%inherit file="/webapps/galaxy/base_panels.mako"/>
2
3<%def name="init()">
4<%
5    self.has_left_panel=False
6    self.has_right_panel=False
7    self.active_view="user"
8    self.overlay_visible=False
9%>
10</%def>
11
12<%def name="late_javascripts()">
13    <script type='text/javascript' src="${h.url_for('/static/scripts/galaxy.panels.js')}"> </script>
14    <script type="text/javascript">
15        ensure_dd_helper();
16        ##make_left_panel( $("#left"), $("#center"), $("#left-border" ) );
17        ##make_right_panel( $("#right"), $("#center"), $("#right-border" ) );
18        ensure_popup_helper();
19        ## handle_minwidth_hint = rp.handle_minwidth_hint;
20    </script>
21</%def>
22
23<%def name="javascripts()">
24    ${parent.javascripts()}
25    ${h.js( "jquery", "jquery.event.drag", "jquery.event.drop", "jquery.event.hover", "jquery.form", "jquery.jstore-all", "json2",
26            "galaxy.base", "jquery.wymeditor", "jquery.autocomplete", "autocomplete_tagging")}   
27    <script type="text/javascript">
28           
29    // Useful Galaxy stuff.
30    var Galaxy =
31    {
32        // Item types.
33        ITEM_HISTORY : "item_history",
34        ITEM_DATASET : "item_dataset",
35        ITEM_WORKFLOW : "item_workflow",
36        ITEM_PAGE : "item_page",
37        ITEM_VISUALIZATION : "item_visualization",
38       
39        // Link dialogs.
40        DIALOG_HISTORY_LINK : "link_history",
41        DIALOG_DATASET_LINK : "link_dataset",
42        DIALOG_WORKFLOW_LINK : "link_workflow",
43        DIALOG_PAGE_LINK : "link_page",
44        DIALOG_VISUALIZATION_LINK : "link_visualization",
45       
46        // Embed dialogs.
47        DIALOG_EMBED_HISTORY : "embed_history",
48        DIALOG_EMBED_DATASET : "embed_dataset",
49        DIALOG_EMBED_WORKFLOW : "embed_workflow",
50        DIALOG_EMBED_PAGE : "embed_page",
51        DIALOG_EMBED_VISUALIZATION : "embed_visualization",
52       
53        // Annotation dialogs.
54        DIALOG_HISTORY_ANNOTATE : "history_annotate",
55    };
56   
57    // Initialize Galaxy elements.
58    function init_galaxy_elts(wym)
59    {
60        // Set up events to make annotation easy.
61        $('.annotation', wym._doc.body).each( function()
62        {
63             $(this).click( function() {
64                 // Works in Safari, not in Firefox.
65                 var range = wym._doc.createRange();
66                 range.selectNodeContents( this );
67                 var selection = window.getSelection();
68                 selection.removeAllRanges();
69                 selection.addRange(range);
70                 var t = "";
71             });
72        });
73       
74    };
75   
76    // Based on the dialog type, return a dictionary of information about an item
77    function get_item_info( dialog_type )
78    {
79        var
80            item_singular,
81            item_plural,
82            item_controller;
83        switch( dialog_type ) {
84            case( Galaxy.ITEM_HISTORY ):
85                item_singular = "History";
86                item_plural = "Histories";
87                item_controller = "history";
88                item_class = "History";
89                break;
90            case( Galaxy.ITEM_DATASET ):
91                item_singular = "Dataset";
92                item_plural = "Datasets";
93                item_controller = "dataset";
94                item_class = "HistoryDatasetAssociation";
95                break;
96            case( Galaxy.ITEM_WORKFLOW ):
97                item_singular = "Workflow";
98                item_plural = "Workflows";
99                item_controller = "workflow";
100                item_class = "StoredWorkflow";
101                break;
102            case( Galaxy.ITEM_PAGE ):
103                item_singular = "Page";
104                item_plural = "Pages";
105                item_controller = "page";
106                item_class = "Page";
107                break;
108            case( Galaxy.ITEM_VISUALIZATION ):
109                item_singular = "Visualization";
110                item_plural = "Visualizations";
111                item_controller = "visualization";
112                item_class = "Visualization";
113                break;
114        }
115       
116        // Build ajax URL that lists items for selection.
117        var item_list_action = "list_" + item_plural.toLowerCase() + "_for_selection";
118        var url_template = "${h.url_for( action='LIST_ACTION' )}";
119        var ajax_url = url_template.replace( "LIST_ACTION", item_list_action );
120       
121        // Set up and return dict.
122        return {
123            singular : item_singular,
124            plural : item_plural,
125            controller : item_controller,
126            iclass : item_class,
127            list_ajax_url : ajax_url
128        };
129    };
130   
131    // Make an item importable.
132    function make_item_importable( item_controller, item_id, item_type )
133    {
134        url_template = "${h.url_for( controller='ITEM_CONTROLLER', action='set_accessible_async' )}";
135        ajax_url = url_template.replace( "ITEM_CONTROLLER", item_controller );
136        $.ajax({
137          type: "POST",
138          url: ajax_url,
139          data: { id: item_id, accessible: 'True' },
140          error: function() { alert("Making " + item_type + " accessible failed"); }
141        });
142    };
143   
144    ## Completely replace WYM's dialog handling
145    WYMeditor.editor.prototype.dialog = function( dialogType, dialogFeatures, bodyHtml ) {
146         
147        var wym = this;
148        var sStamp = wym.uniqueStamp();
149        var selected = wym.selected();
150       
151        // Swap out URL attribute for id/name attribute in link creation to enable anchor creation in page.
152        function set_link_id()
153        {
154            // When "set link id" link clicked, update UI.
155            $('#set_link_id').click( function()
156            {
157                // Set label.
158                $("#link_attribute_label").text("ID/Name");
159               
160                // Set input elt class, value.
161                var attribute_input = $(".wym_href");
162                attribute_input.addClass("wym_id").removeClass("wym_href");
163                if (selected)
164                    attribute_input.val( $(selected).attr('id') );
165               
166                // Remove link.
167                $(this).remove();
168            });
169        }
170       
171        // LINK DIALOG
172        if ( dialogType == WYMeditor.DIALOG_LINK ) {
173            if(selected) {
174                jQuery(wym._options.hrefSelector).val(jQuery(selected).attr(WYMeditor.HREF));
175                jQuery(wym._options.srcSelector).val(jQuery(selected).attr(WYMeditor.SRC));
176                jQuery(wym._options.titleSelector).val(jQuery(selected).attr(WYMeditor.TITLE));
177                jQuery(wym._options.altSelector).val(jQuery(selected).attr(WYMeditor.ALT));
178            }
179            // Get current URL, title.
180            var curURL, curTitle;
181            if (selected)
182            {
183                curURL = $(selected).attr("href");
184                if (curURL == undefined)
185                    curURL = "";
186                curTitle = $(selected).attr("title");
187                if (curTitle == undefined)
188                    curTitle = "";
189            }
190            show_modal(
191                "Create Link",
192                "<div><div><label id='link_attribute_label'>URL <span style='float: right; font-size: 90%'><a href='#' id='set_link_id'>Create in-page anchor</a></span></label><br><input type='text' class='wym_href' value='" + curURL + "' size='40' /></div>"
193                    + "<div><label>Title</label><br><input type='text' class='wym_title' value='" + curTitle + "' size='40' /></div><div>",
194                {
195                    "Make link": function() {
196                        var sUrl = jQuery(wym._options.hrefSelector).val();
197                        sUrl = ( sUrl ? sUrl : "" );
198                        var sName = $(".wym_id").val();
199                        sName = ( sName ? sName : "" );
200                        if ( (sUrl.length > 0) || (sName.length > 0) ) {
201                            // Create link.
202                            wym._exec(WYMeditor.CREATE_LINK, sStamp);
203                           
204                            var link = jQuery("a[href=" + sStamp + "]", wym._doc.body);
205                            link.attr(WYMeditor.HREF, sUrl);
206                            link.attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val());
207                            if (sName.length > 0)
208                                link.attr("id", sName);
209                        }
210                        hide_modal();
211                    },
212                    "Cancel": function() {
213                        hide_modal();
214                    }
215                },
216                {},
217                set_link_id
218            );
219            return;
220        }
221       
222        // IMAGE DIALOG
223        if ( dialogType == WYMeditor.DIALOG_IMAGE ) {
224            if(wym._selected_image) {
225                jQuery(wym._options.dialogImageSelector + " " + wym._options.srcSelector)
226                  .val(jQuery(wym._selected_image).attr(WYMeditor.SRC));
227                jQuery(wym._options.dialogImageSelector + " " + wym._options.titleSelector)
228                  .val(jQuery(wym._selected_image).attr(WYMeditor.TITLE));
229                jQuery(wym._options.dialogImageSelector + " " + wym._options.altSelector)
230                  .val(jQuery(wym._selected_image).attr(WYMeditor.ALT));
231            }
232            show_modal(
233                "Image",
234                "<div class='row'>"
235                    + "<label>URL</label><br>"
236                    + "<input type='text' class='wym_src' value='' size='40' />"
237                    + "</div>"
238                    + "<div class='row'>"
239                    + "<label>Alt text</label><br>"
240                    + "<input type='text' class='wym_alt' value='' size='40' />"
241                    + "</div>"
242                    + "<div class='row'>"
243                    + "<label>Title</label><br>"
244                    + "<input type='text' class='wym_title' value='' size='40' />"
245                    + "</div>",
246                {
247                    "Insert": function() { 
248                        var sUrl = jQuery(wym._options.srcSelector).val();
249                        if(sUrl.length > 0) {
250                          wym._exec(WYMeditor.INSERT_IMAGE, sStamp);
251                          jQuery("img[src$=" + sStamp + "]", wym._doc.body)
252                              .attr(WYMeditor.SRC, sUrl)
253                              .attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val())
254                              .attr(WYMeditor.ALT, jQuery(wym._options.altSelector).val());
255                        }
256                        hide_modal();
257                    },
258                    "Cancel": function() {
259                        hide_modal();
260                    }
261                }
262            );
263            return;
264        }
265       
266        // TABLE DIALOG
267        if ( dialogType == WYMeditor.DIALOG_TABLE ) {
268            show_modal(
269                "Table",
270                "<div class='row'>"
271                    + "<label>Caption</label><br>"
272                    + "<input type='text' class='wym_caption' value='' size='40' />"
273                    + "</div>"
274                    + "<div class='row'>"
275                    + "<label>Summary</label><br>"
276                    + "<input type='text' class='wym_summary' value='' size='40' />"
277                    + "</div>"
278                    + "<div class='row'>"
279                    + "<label>Number Of Rows<br></label>"
280                    + "<input type='text' class='wym_rows' value='3' size='3' />"
281                    + "</div>"
282                    + "<div class='row'>"
283                    + "<label>Number Of Cols<br></label>"
284                    + "<input type='text' class='wym_cols' value='2' size='3' />"
285                    + "</div>",
286                {
287                    "Insert": function() {
288                        var iRows = jQuery(wym._options.rowsSelector).val();
289                        var iCols = jQuery(wym._options.colsSelector).val();
290                 
291                        if(iRows > 0 && iCols > 0) {
292                 
293                          var table = wym._doc.createElement(WYMeditor.TABLE);
294                          var newRow = null;
295                                  var newCol = null;
296                 
297                                  var sCaption = jQuery(wym._options.captionSelector).val();
298                 
299                                  //we create the caption
300                                  var newCaption = table.createCaption();
301                                  newCaption.innerHTML = sCaption;
302                 
303                                  //we create the rows and cells
304                                  for(x=0; x<iRows; x++) {
305                                          newRow = table.insertRow(x);
306                                          for(y=0; y<iCols; y++) {newRow.insertCell(y);}
307                                  }
308                 
309                          //set the summary attr
310                          jQuery(table).attr('summary',
311                              jQuery(wym._options.summarySelector).val());
312                 
313                          //append the table after the selected container
314                          var node = jQuery(wym.findUp(wym.container(),
315                            WYMeditor.MAIN_CONTAINERS)).get(0);
316                          if(!node || !node.parentNode) jQuery(wym._doc.body).append(table);
317                          else jQuery(node).after(table);
318                        }
319                        hide_modal();
320                    },
321                    "Cancel": function() {
322                        hide_modal();
323                    }
324                }
325            );
326        }
327       
328        // INSERT "GALAXY ITEM" LINK DIALOG
329        if ( dialogType == Galaxy.DIALOG_HISTORY_LINK || dialogType == Galaxy.DIALOG_DATASET_LINK ||
330             dialogType == Galaxy.DIALOG_WORKFLOW_LINK || dialogType == Galaxy.DIALOG_PAGE_LINK ||
331             dialogType == Galaxy.DIALOG_VISUALIZATION_LINK ) {
332            // Based on item type, set useful vars.
333            var item_info;
334            switch(dialogType)
335            {
336                case(Galaxy.DIALOG_HISTORY_LINK):
337                    item_info = get_item_info(Galaxy.ITEM_HISTORY);
338                    break;
339                case(Galaxy.DIALOG_DATASET_LINK):
340                    item_info = get_item_info(Galaxy.ITEM_DATASET);
341                    break;
342                case(Galaxy.DIALOG_WORKFLOW_LINK):
343                    item_info = get_item_info(Galaxy.ITEM_WORKFLOW);
344                    break;
345                case(Galaxy.DIALOG_PAGE_LINK):
346                    item_info = get_item_info(Galaxy.ITEM_PAGE);
347                    break;
348                case(Galaxy.DIALOG_VISUALIZATION_LINK):
349                    item_info = get_item_info(Galaxy.ITEM_VISUALIZATION);
350                    break;
351            }
352           
353            $.ajax(
354            {
355                url: item_info.list_ajax_url,
356                data: {},
357                error: function() { alert( "Failed to list "  + item_info.plural.toLowerCase() + " for selection"); },
358                success: function(table_html)
359                {
360                    show_modal(
361                        "Insert Link to " + item_info.singular,
362                        table_html +
363                        "<div><input id='make-importable' type='checkbox' checked/>" +
364                        "Make the selected " + item_info.plural.toLowerCase() + " accessible so that they can viewed by everyone.</div>"
365                        ,
366                        {
367                            "Insert": function()
368                            {
369                                // Make selected items accessible (importable) ?
370                                var make_importable = false;
371                                if ( $('#make-importable:checked').val() !== null )
372                                    make_importable = true;
373                               
374                                // Insert links to history for each checked item.
375                                var item_ids = new Array();
376                                $('input[name=id]:checked').each(function() {
377                                    var item_id = $(this).val();
378                                   
379                                    // Make item importable?
380                                    if (make_importable)
381                                        make_item_importable(item_info.controller, item_id, item_info.singular);
382                                   
383                                    // Insert link(s) to item(s). This is done by getting item info and then manipulating wym.
384                                    url_template = "${h.url_for( controller='ITEM_CONTROLLER', action='get_name_and_link_async' )}?id=" + item_id;
385                                    ajax_url = url_template.replace( "ITEM_CONTROLLER", item_info.controller);
386                                    $.getJSON( ajax_url, function( returned_item_info ) {
387                                        // Get link text.
388                                        wym._exec(WYMeditor.CREATE_LINK, sStamp);
389                                        var link_text = $("a[href=" + sStamp + "]", wym._doc.body).text();
390                                       
391                                        // Insert link: need to do different actions depending on link text.
392                                        if (
393                                            link_text == "" // Firefox.
394                                            ||
395                                            link_text == sStamp // Safari
396                                            )
397                                        {
398                                            // User selected no text; create link from scratch and use default text.
399                                            wym.insert("<a href='" + returned_item_info.link + "'>" + item_info.singular + " '" + returned_item_info.name + "'</a>");
400                                        }
401                                        else
402                                        {
403                                            // Link created from selected text; add href and title.
404                                            $("a[href=" + sStamp + "]", wym._doc.body).attr(WYMeditor.HREF, returned_item_info.link).attr(WYMeditor.TITLE, item_info.singular + item_id);
405                                        }
406                                    });                                   
407                                });
408                               
409                                hide_modal();
410                            },
411                            "Cancel": function()
412                            {
413                                hide_modal();
414                            }
415                        }
416                    );
417                }
418            });
419        }
420        // EMBED GALAXY OBJECT DIALOGS
421        if ( dialogType == Galaxy.DIALOG_EMBED_HISTORY || dialogType == Galaxy.DIALOG_EMBED_DATASET || dialogType == Galaxy.DIALOG_EMBED_WORKFLOW || dialogType == Galaxy.DIALOG_EMBED_PAGE || dialogType == Galaxy.DIALOG_EMBED_VISUALIZATION ) {
422            // Based on item type, set useful vars.
423            var item_info;
424            switch(dialogType)
425            {
426                case(Galaxy.DIALOG_EMBED_HISTORY):
427                    item_info = get_item_info(Galaxy.ITEM_HISTORY);
428                    break;
429                case(Galaxy.DIALOG_EMBED_DATASET):
430                    item_info = get_item_info(Galaxy.ITEM_DATASET);
431                    break;
432                case(Galaxy.DIALOG_EMBED_WORKFLOW):
433                    item_info = get_item_info(Galaxy.ITEM_WORKFLOW);
434                    break;
435                case(Galaxy.DIALOG_EMBED_PAGE):
436                    item_info = get_item_info(Galaxy.ITEM_PAGE);
437                    break;
438                case(Galaxy.DIALOG_EMBED_VISUALIZATION):
439                    item_info = get_item_info(Galaxy.ITEM_VISUALIZATION);
440                    break;
441            }
442           
443            $.ajax(
444            {
445                url: item_info.list_ajax_url,
446                data: {},
447                error: function() { alert( "Failed to list "  + item_info.plural.toLowerCase() + " for selection"); },
448                success: function(list_html)
449                {
450                    // Can make histories, workflows importable; cannot make datasets importable.
451                    if (dialogType == Galaxy.DIALOG_EMBED_HISTORY || dialogType == Galaxy.DIALOG_EMBED_WORKFLOW
452                        || dialogType == Galaxy.DIALOG_EMBED_VISUALIZATION)
453                        list_html = list_html + "<div><input id='make-importable' type='checkbox' checked/>" +
454                                    "Make the selected " + item_info.plural.toLowerCase() + " accessible so that they can viewed by everyone.</div>";
455                    show_modal(
456                        "Embed " + item_info.plural,
457                        list_html,
458                        {
459                            "Embed": function()
460                            {   
461                                // Make selected items accessible (importable) ?
462                                var make_importable = false;
463                                if ( $('#make-importable:checked').val() != null )
464                                    make_importable = true;
465                               
466                                $('input[name=id]:checked').each(function() {
467                                    // Get item ID and name.
468                                    var item_id = $(this).val();
469                                    // Use ':first' because there are many labels in table; the first one is the item name.
470                                    var item_name = $("label[for='" + item_id + "']:first").text();
471                                   
472                                    if (make_importable)
473                                        make_item_importable(item_info.controller, item_id, item_info.singular);
474                                   
475                                    // Embedded item HTML; item class is embedded in div container classes; this is necessary because the editor strips
476                                    // all non-standard attributes when it returns its content (e.g. it will not return an element attribute of the form
477                                    // item_class='History').
478                                    var item_elt_id = item_info.iclass + "-"  + item_id;
479                                    var item_embed_html =                                     
480                                        "<p><div id='"  + item_elt_id + "' class='embedded-item " + item_info.singular.toLowerCase() +
481                                                " placeholder'> \
482                                            <p class='title'>Embedded Galaxy " + item_info.singular + " '" + item_name + "'</p> \
483                                            <p class='content'> \
484                                                [Do not edit this block; Galaxy will fill it in with the annotated " +
485                                                item_info.singular.toLowerCase() + " when it is displayed.] \
486                                            </p> \
487                                        </div></p>";
488                                   
489                                    // Insert embedded item into document.
490                                    wym.insert("&nbsp;"); // Needed to prevent insertion from occurring in child element in webkit browsers.
491                                    wym.insert(item_embed_html);
492                                   
493                                    // TODO: can we fix this?
494                                    // Due to oddities of wym.insert() [likely due to inserting a <div> and/or a complete paragraph], an
495                                    // empty paragraph (or two!) may be included either before an embedded item. Remove these paragraphs.
496                                    $("#" + item_elt_id, wym._doc.body).each( function() {
497                                        // Remove previous empty paragraphs.
498                                        var removing = true;
499                                        while (removing)
500                                        {
501                                            var prev_elt = $(this).prev();
502                                            if ( prev_elt.length != 0 && jQuery.trim(prev_elt.text()) == "" )
503                                                prev_elt.remove();
504                                            else
505                                                removing = false;
506                                        }
507                                    });
508                                   
509                                });
510                                hide_modal();
511                            },
512                            "Cancel": function()
513                            {
514                                hide_modal();
515                            }
516                        }
517                    );
518                }
519            });
520        }
521       
522        // ANNOTATE HISTORY DIALOG
523        if ( dialogType == Galaxy.DIALOG_ANNOTATE_HISTORY ) {
524            $.ajax(
525            {
526                url: "${h.url_for( action='list_histories_for_selection' )}",
527                data: {},
528                error: function() { alert( "Grid refresh failed" ) },
529                success: function(table_html)
530                {
531                    show_modal(
532                        "Insert Link to History",
533                        table_html,
534                        {
535                            "Annotate": function()
536                            {
537                                // Insert links to history for each checked item.
538                                var item_ids = new Array();
539                                $('input[name=id]:checked').each(function() {
540                                    var item_id = $(this).val();
541                                   
542                                    // Get annotation table for history.
543                                    $.ajax(
544                                    {
545                                        url: "${h.url_for( action='get_history_annotation_table' )}",
546                                        data: { id : item_id },
547                                        error: function() { alert( "Grid refresh failed" ) },
548                                        success: function(result)
549                                        {
550                                            // Insert into document.
551                                            wym.insert(result);
552                                           
553                                            init_galaxy_elts(wym);
554
555                                        }
556                                    });                                   
557                                });
558                               
559                                hide_modal();
560                            },
561                            "Cancel": function()
562                            {
563                                hide_modal();
564                            }
565                        }
566                    );
567                }
568            });
569        }
570    };
571    </script>
572   
573    <script type='text/javascript'>
574        $(function(){
575            ## Generic error handling
576            $(document).ajaxError( function ( e, x ) {
577                // console.log( e, x );
578                var message = x.responseText || x.statusText || "Could not connect to server";
579                show_modal( "Server error", message, { "Ignore error" : hide_modal } );
580                return false;
581            });
582            ## Create editor
583            $("[name=page_content]").wymeditor( {
584                skin: 'galaxy',
585                basePath: "${h.url_for('/static/wymeditor')}/",
586                iframeBasePath: "${h.url_for('/static/wymeditor/iframe/galaxy')}/",
587                boxHtml:   "<table class='wym_box' width='100%' height='100%'>"
588                            + "<tr><td><div class='wym_area_top'>"
589                            + WYMeditor.TOOLS
590                            + "</div></td></tr>"
591                            + "<tr height='100%'><td>"
592                            + "<div class='wym_area_main' style='height: 100%;'>"
593                            // + WYMeditor.HTML
594                            + WYMeditor.IFRAME
595                            + WYMeditor.STATUS
596                            + "</div>"
597                            + "</div>"
598                            + "</td></tr></table>",
599                toolsItems: [
600                    {'name': 'Bold', 'title': 'Strong', 'css': 'wym_tools_strong'},
601                    {'name': 'Italic', 'title': 'Emphasis', 'css': 'wym_tools_emphasis'},
602                    {'name': 'Superscript', 'title': 'Superscript', 'css': 'wym_tools_superscript'},
603                    {'name': 'Subscript', 'title': 'Subscript', 'css': 'wym_tools_subscript'},
604                    {'name': 'InsertOrderedList', 'title': 'Ordered_List', 'css': 'wym_tools_ordered_list'},
605                    {'name': 'InsertUnorderedList', 'title': 'Unordered_List', 'css': 'wym_tools_unordered_list'},
606                    {'name': 'Indent', 'title': 'Indent', 'css': 'wym_tools_indent'},
607                    {'name': 'Outdent', 'title': 'Outdent', 'css': 'wym_tools_outdent'},
608                    {'name': 'Undo', 'title': 'Undo', 'css': 'wym_tools_undo'},
609                    {'name': 'Redo', 'title': 'Redo', 'css': 'wym_tools_redo'},
610                    {'name': 'CreateLink', 'title': 'Link', 'css': 'wym_tools_link'},
611                    {'name': 'Unlink', 'title': 'Unlink', 'css': 'wym_tools_unlink'},
612                    {'name': 'InsertImage', 'title': 'Image', 'css': 'wym_tools_image'},
613                    {'name': 'InsertTable', 'title': 'Table', 'css': 'wym_tools_table'},
614                ]
615            });
616            ## Get the editor object
617            var editor = $.wymeditors(0);
618            var save = function ( callback ) {
619                show_modal( "Saving page", "progress" );
620               
621                /*
622                    Not used right now.
623                // Gather annotations.
624                var annotations = new Array();
625               
626                $('.annotation', editor._doc.body).each( function() {
627                    var item_class = $(this).attr( 'item_class' );
628                    var item_id = $(this).attr( 'item_id' );
629                    var text = $(this).text();
630                    annotation = {
631                        "item_class" : item_class,
632                        "item_id" : item_id,
633                        "text" : text
634                    };
635                    annotations[ annotations.length ] = annotation;
636                });
637               
638                */
639               
640                // Do save.
641                $.ajax( {   
642                    url: "${h.url_for( action='save' )}",
643                    type: "POST",
644                    data: {
645                        id: "${trans.security.encode_id(page.id)}",
646                        content: editor.xhtml(),
647                        annotations: JSON.stringify(new Object()),
648                        ## annotations: JSON.stringify(annotations),
649                        "_": "true"
650                    },
651                    success: function() {
652                        callback();
653                    }
654                });
655            }
656            ## Save button
657            $("#save-button").click( function() {
658                save( function() { hide_modal(); } )
659            });
660            ## Close button
661            $("#close-button").click(function() {
662                <% next_url = h.url_for( controller='page', action='list' ) %>
663                // var new_content = editor.xhtml();
664                // var changed = ( initial_content != new_content );
665                var changed = false;
666                if ( changed ) {
667                    var do_close = function() {
668                        window.onbeforeunload = undefined;
669                        window.document.location = "${next_url}"
670                    };
671                    show_modal( "Close editor",
672                                "There are unsaved changes to your page which will be lost.",
673                                {
674                                    "Cancel" : hide_modal,
675                                    "Save Changes" : function() {
676                                        save( do_close );
677                                    }
678                                }, {
679                                    "Don't Save": do_close
680                                } );
681                } else {
682                    window.document.location = "${next_url}";
683                }
684            });
685           
686            // Initialize galaxy elements.
687            //init_galaxy_elts(editor);
688           
689            //
690            // Containers, Galaxy style
691            //
692            var containers_menu = $("<div class='galaxy-page-editor-button'><a id='insert-galaxy-link' class='action-button popup' href='#'>${_('Paragraph type')}</a></div>");
693            $(".wym_area_top").append( containers_menu );
694                       
695            // Add menu options.
696            var items = {}
697            $.each( editor._options.containersItems, function( k, v ) {
698                var tagname = v.name;
699                items[ v.title.replace( '_', ' ' ) ] = function() { editor.container( tagname ) }
700            });
701            make_popupmenu( containers_menu, items);
702           
703            //
704            // Create 'Insert Link to Galaxy Object' menu.
705            //
706           
707            // Add menu button.
708            var insert_link_menu_button = $("<div><a id='insert-galaxy-link' class='action-button popup' href='#'>${_('Insert Link to Galaxy Object')}</a></div>").addClass('galaxy-page-editor-button');
709            $(".wym_area_top").append(insert_link_menu_button);
710           
711            // Add menu options.
712            make_popupmenu( insert_link_menu_button, {
713                "Insert History Link": function() {
714                    editor.dialog(Galaxy.DIALOG_HISTORY_LINK);
715                },
716                "Insert Dataset Link": function() {
717                    editor.dialog(Galaxy.DIALOG_DATASET_LINK);
718                },
719                "Insert Workflow Link": function() {
720                    editor.dialog(Galaxy.DIALOG_WORKFLOW_LINK);
721                },
722                "Insert Page Link": function() {
723                    editor.dialog(Galaxy.DIALOG_PAGE_LINK);
724                },
725                "Insert Visualization Link": function() {
726                    editor.dialog(Galaxy.DIALOG_VISUALIZATION_LINK);
727                },
728            });
729           
730            //
731            // Create 'Embed Galaxy Object' menu.
732            //
733           
734            // Add menu button.
735            var embed_object_button = $("<div><a id='embed-galaxy-object' class='action-button popup' href='#'>${_('Embed Galaxy Object')}</a></div>").addClass('galaxy-page-editor-button');
736            $(".wym_area_top").append(embed_object_button);
737           
738            // Add menu options.
739            make_popupmenu( embed_object_button, {
740                "Embed History": function() {
741                    editor.dialog(Galaxy.DIALOG_EMBED_HISTORY);
742                },
743                "Embed Dataset": function() {
744                    editor.dialog(Galaxy.DIALOG_EMBED_DATASET);
745                },
746                "Embed Workflow": function() {
747                    editor.dialog(Galaxy.DIALOG_EMBED_WORKFLOW);
748                },
749                "Embed Visualization": function() {
750                    editor.dialog(Galaxy.DIALOG_EMBED_VISUALIZATION);
751                },
752                ##"Embed Page": function() {
753                ##    editor.dialog(Galaxy.DIALOG_EMBED_PAGE);
754                ##}
755            });                   
756        });
757    </script>
758</%def>
759
760<%def name="stylesheets()">
761    ${parent.stylesheets()}
762    ${h.css( "base", "autocomplete_tagging", "embed_item" )}
763    <style type='text/css'>
764        .galaxy-page-editor-button
765        {
766            position: relative;
767            float: left;
768            padding: 0.2em;
769        }
770    </style>
771</%def>
772
773<%def name="center_panel()">
774
775    <div class="unified-panel-header" unselectable="on">
776        <div class="unified-panel-header-inner" style="float: right">
777            <a id="save-button" class="panel-header-button">Save</a>
778            <a id="close-button" class="panel-header-button">Close</a>
779        </div>
780        <div class="unified-panel-header-inner">
781            Page Editor <span style="font-weight: normal">| Title : ${page.title}</span>
782        </div>
783    </div>
784
785    <div class="unified-panel-body">
786        <textarea name="page_content">${page.latest_revision.content.decode('utf-8')}</textarea>
787    </div>
788
789</%def>
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。