[rt-users] Tool for canned responses
Wozz
wozz+rt at wookie.net
Sun Aug 6 01:12:06 EDT 2000
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