Only one problem I’ve found.
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@popularpower.com
Give your computer something to dream about. (tm)
Popular Power - www.popularpower.com
#!/usr/bin/perl -w
cannery - produce a JavaScript file to insert canned responses for RT
###########
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
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">
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
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 = ) {
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@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@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(‘
<select name=“templates” size=“1”’ +
‘onChange=“insert(document.reply.content, ’ +
'document.reply.templates)”>’);
document.writeln(’ Select a template…');
for (var key in questions) {
document.writeln(’ ’ + questions[key]);
}
document.write(“\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;
}
}
}