[rt-users] Tool for canned responses

Wozz wozz+rt at wookie.net
Sun Aug 6 01:27:58 EDT 2000


That did it!  Thanks!

On Sat, Aug 05, 2000 at 10:21:09PM -0700, Marc Hedlund wrote:
> 
> Hm, maybe I left out something.  I bet I know what it is -- you probably
> have to add 
>    name=\"reply\"
> to the form tag just above the place I said to put the script tag.  So,
> the whole part of forms.pm (lines 373-381) should look like this:
> 
> ---begin---
> 
>     print "<form action=\"$ScriptURL\" method=\"post\" name=\"reply\" $target>
> <input type=\"hidden\" name=\"serial_num\" value=\"$serial_num\">";
>     &UpdateOptions();
> 
> print "<input type=\"hidden\" name=\"do_req_respond\" value=\"true\">
> <script language=\"JavaScript1.1\" src=\"/etc/rt/canned.js\"></script>
> 
> <font size=\"$MESSAGE_FONT\">
> <br><textarea rows=15 cols=78 name=\"content\" WRAP=HARD>
> 
> ---end---
> 
> I'll change the script and report it so you don't have to do that.  (I'm
> also adding sorted question names per another request.)  Sorry about the
> omission!
> 
> -Marc <marc at popularpower.com>
> 
> 	     Give your computer something to dream about.    (tm)
> 		 Popular Power - www.popularpower.com
> 
> 
> On Sat, 5 Aug 2000, Wozz wrote:
> 
> > Great job!
> > 
> > Only one problem I've found.
> > 
> > When I select a response, I get the following javascript error and nothing is
> > written to the test area:
> > 
> > Line: 34
> > Char: 1
> > Error: 'document.reply.content' is not an object
> > Code: 0
> > 
> > I know nothing about javascript, but I assume this is supposed to be the
> > pre-existing content of the reply textarea, but I don't see where you get that
> > data from initially.  Any ideas?
> > 
> > On Sat, Aug 05, 2000 at 07:30:03PM -0700, Marc Hedlund wrote:
> > > 
> > > We use RT to track feedback on our site.  We often get frequently asked
> > > questions (despite a FAQ list...) and want to quickly respond to them.  I
> > > wrote a utility to use JavaScript to insert a set of canned responses into
> > > the reply form in RT, and thought it might be useful to others.
> > > 
> > > It will require a little configuration, which is documented in comments at
> > > the head of the script.  Basically you make a directory of canned
> > > responses, where the first line of each file is a description, and the
> > > rest is the response.  Then run the script, and modify one line of
> > > rt/lib/rt/ui/web/forms.pm to point to the generated JavaScript
> > > file.  That's all it should take.
> > > 
> > > Let me know if you have suggestions or wind up using this.  Enjoy.
> > > 
> > > -Marc <marc at popularpower.com>
> > > 
> > > 	     Give your computer something to dream about.    (tm)
> > > 		 Popular Power - www.popularpower.com
> > > 
> > 
> > Content-Description: cannery - perl RT utility
> > > #!/usr/bin/perl -w
> > > 
> > > # cannery - produce a JavaScript file to insert canned responses for RT
> > > # Copyright (c) 2000 Marc Hedlund <marc at popularpower.com> 
> > > 
> > > ###########
> > > # LICENSE #
> > > ###########
> > > 
> > > # This program is free software; you can redistribute it and/or modify
> > > # it under the terms of the GNU General Public License as published by
> > > # the Free Software Foundation; either version 2 of the License, or
> > > # (at your option) any later version.
> > > #
> > > # This program is distributed in the hope that it will be useful, but
> > > # WITHOUT ANY WARRANTY; without even the implied warranty of
> > > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > > # General Public License for more details.
> > > #
> > > # You should have received a copy of the GNU General Public License
> > > # along with this program; if not, write to the Free Software
> > > # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
> > > # USA
> > > 
> > > ################
> > > # INSTRUCTIONS #
> > > ################
> > > 
> > > # This script auto-generates a JavaScript file (canned.js) to write a
> > > # 'select' pop-up menu into the RT reply form, from which an RT queue
> > > # member can select a canned response to insert into the reply
> > > # textarea.  (See <http://www.fsck.com/projects/rt/> for more about
> > > # RT.)  Canned responses are read from a set of plaintext files in the
> > > # firectory named by $formdir, below.  These files should be written
> > > # so that the first line describes the canned response -- this is the
> > > # line that will be shown in the pop-up menu.  The rest of the file is
> > > # the response itself, which will be inserted into the top of the
> > > # reply textarea.  
> > > #
> > > # Running this script will write the JavaScript file into the $basedir
> > > # directory specified below, which should be a directory in the
> > > # document root of the Web server running RT.  Once that is done,
> > > # insert the following line at line 378 rt/lib/rt/ui/web/forms.pm
> > > # (relative to the rt home directory), just above the textarea tag: 
> > > #
> > > #  <script language=\"JavaScript1.1\" src=\"/etc/rt/canned.js\"></script>
> > > #
> > > # where "/etc/rt/canned.js" points to the file generated by running
> > > # this script, starting at the document root of the Web server.
> > > #
> > > # That's all you should have to do to install canned responses.  When
> > > # you come up with more to add, just drop them in the 'uncanned'
> > > # directory and re-run 'cannery' -- they will be added immediately.
> > > #
> > > # If you have comments or suggestions about this script, please let me
> > > # know.  Thanks!  --Marc Hedlund <marc at popularpower.com>
> > > 
> > > use strict;
> > > use diagnostics;
> > > 
> > > my $basedir = "/home/www/in.popularpower.com/etc/rt";
> > > my $formdir = "$basedir/uncanned";
> > > 
> > > open(INSERT, ">$basedir/canned.js")
> > >     or die "Unable to write to canned.js: $!\n";
> > > 
> > > print INSERT &header();
> > > 
> > > opendir(FORMS, "$formdir")
> > >     or die "Unable to read $formdir: $!\n";
> > > 
> > > my @formletters = grep { $_ ne '.' and $_ ne '..' } readdir FORMS;
> > > 
> > > closedir FORMS;
> > > 
> > > my $bodyformat = <<'FORMAT';
> > > ~~           "^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< " +
> > > FORMAT
> > > 
> > > for (my $idx = 0; $idx < scalar(@formletters); $idx++) {
> > >     my $formfile = $formletters[$idx];
> > > 
> > >     open(FORM, "$formdir/$formfile")
> > > 	or warn "Unable to open $formfile: $!\n";
> > > 
> > >     my $linecount = '';
> > >     my @formlines = map { 
> > > 	if ($_ =~ /\w/) {
> > > 	    $linecount++;
> > > 	    chomp $_; 
> > > 	    $_ =~ s/\"/\\\"/g; 
> > > 	    $_ . " ";
> > >         } elsif ($linecount > 1) {
> > > 	    '\n\n';
> > > 	} else {
> > >             '';
> > >         }
> > >     } <FORM>;
> > >     
> > >     close FORM;
> > > 
> > >     my $question = shift @formlines;
> > >     my $answer   = join('', @formlines);
> > >     my $formanswer = swrite($bodyformat, $answer);
> > > 
> > >     $question   =~ s/\s+$//;
> > >     $formanswer =~ s/\s+\"\s\+\s*$/\ \"\ \+/mg;
> > > 
> > >     print qq(Writing template "$question"...\n);
> > > 
> > >     print INSERT "new template(\"$formfile\", \"$question\",\n$formanswer\n";
> > >     print INSERT '             "\n\n");' . "\n\n";
> > > }
> > > 
> > > while (my $line = <DATA>) {
> > >     print INSERT $line;
> > > }
> > > 
> > > sub swrite {
> > >     my $format = shift;
> > >     $^A = "";
> > >     formline($format, @_);
> > >     return $^A;
> > > }
> > > 
> > > sub header {
> > >     return <<'HEADER';
> > > /*
> > >  * This file is auto-generated by the "cannery" script.
> > >  * Please don't edit this file -- edit the "cannery" script and
> > >  * re-run it instead.  If you want to enter a new template, just put a
> > >  * new plaintext file in the "formletters" directory, where the first
> > >  * line is the question to be answered, and the rest of the lines are
> > >  * the answer.
> > >  *
> > >  * "cannery" written by Marc Hedlund <marc at popularpower.com>
> > >  */
> > > 
> > > /*
> > >  * Set up data structures
> > >  */
> > > 
> > > var questions = new Object();
> > > var answers   = new Object();
> > > 
> > > /*
> > >  * Build the canned response entries.  These are drawn from the 
> > >  * "uncanned" directory.
> > >  */
> > > 
> > > HEADER
> > > }
> > > 
> > > __DATA__
> > > /*
> > >  * This is the closing line that will be inserted at the bottom of
> > >  * every template.
> > >  */
> > > 
> > > var closing = "Thanks very much for taking the time to write to us!\n\n";
> > > 
> > > /*
> > >  * Nothing below here should be changed in the usual case -- this is
> > >  * just the 'guts'.  If you do make changes below that you think would
> > >  * be generally useful, let me know!  <marc at popularpower.com>
> > >  */
> > > 
> > > // Write out the select tag and the embedded option tags.
> > > 
> > > writeMenu();
> > > 
> > > // Functions, called above or from the HTML page.
> > > 
> > > /*
> > >  * Adds an entry to the canned response collection.
> > >  */
> > > 
> > > function template(key, question, answer) {
> > >   questions[key] = question;
> > >   answers[key]   = answer;
> > > }
> > > 
> > > /*
> > >  * Writes a menu of canned responses into the current HTML page
> > >  */
> > > 
> > > function writeMenu() {
> > >   document.writeln('<br><select name="templates" size="1"' +
> > >                    'onChange="insert(document.reply.content, ' +
> > >                    'document.reply.templates)">');
> > >   
> > >   document.writeln('  <option value="none" selected>Select a template...');
> > > 
> > >   for (var key in questions) {
> > >     document.writeln('  <option value="' + key + '">' + questions[key]);
> > >   }
> > > 
> > >   document.write("</select>\n\n");
> > > }
> > > 
> > > /*
> > >  * Inserts a canned response selected by the user into the reply 
> > >  * textarea.
> > >  */
> > > 
> > > function insert(textarea, select) {
> > >   for (var i = 0; i < select.options.length; i++) {
> > >     var option = select.options[i];
> > >     if (option.selected && option.value != "none") {
> > >       textarea.value =
> > >         answers[option.value] + closing + textarea.value;
> > >     }
> > >   }
> > > }
> > 
> > 
> 





More information about the rt-users mailing list