wiki:WikiFormsPlugin

Version 15 (modified by figaro, 6 years ago) (diff)

Moved example to functional description

Provides forms anywhere where there is a wiki

Notice: This plugin is unmaintained and available for adoption.

Description

This plugin allows you to add a form on any Trac wiki page. This is meant to provide a more flexible version of TracFormsPlugin. For a comparison between the two plugins, see here.

This plugin can be used in the following ways:

Normal wiki formatted stuff...

{{{
#!WikiForms

== Selects

|| '''Description''' || '''Example'''                                      || '''Value'''
|| simple select     || <tf>select:simple_select:1 2 3 4</tf>              || <tf>value:simple_select</tf>
|| labeled select    || <tf>select:labeled_select:1=l1 2=l2 3=l3 4=l4</tf> || <tf>value:labeled_select</tf>
|| quoted select     || <tf>select:quoted_select:'"a"' "'b'" 'c c'</tf>    || <tf>value:quoted_select</tf>
|| complex select    || <tf>select:complex_select:
#
# keep in mind that 
#  - comments are removed
#  - newlines are replaced with '' (empty string)
# prior to parsing. After all those the preformatting the 
# fields still have to be separated by whitespace to be distinguishable.
# Further cfg-options are:
#   default 
#   class
#   id
value0                            # label = value
 'v a l u e 1'                    # label = value, both containing whitespace
        value2='l a b e l 2'      # 
 'v a l u e 3'=label3             # 
 'val ue4'="lab el4"
 class=my_css_class
 id=my_css_id
 default=value2                   # this is the cfg option (not an entry for the selector-list)...
 :                                # separator, from now on everything becomes a selector-list entry even if the name matches a cfg-option
</tf>                                                                      || <tf>value:complex_select</tf>

== Checkboxes

|| '''Description''' || '''Example'''                                      || '''Value'''
|| simple checkbox   || <tf>checkbox:simple_checkbox</tf>                  || <tf>value:simple_checkbox</tf>
|| complex checkbox  || <tf>checkbox:complex_checkbox:
# Further cfg-options are:
# checked  : flag ('1','true' 'on' 'yes') used if there is no database entry available...
# value    : value stored when checkbox is checked
# class 
# id 
value=value_if_checked
checked=true
</tf>                                                                      || <tf>value:complex_checkbox</tf>

== Inputs

|| '''Description''' || '''Example'''                                      || '''Value'''
|| simple input      || <tf>input:simple_input</tf>                        || <tf>value:simple_input</tf>
|| complex input     || <tf>input:complex_input:
# Further cfg-options are:
# value    : default value if no database entry is available
# size     : width in characters (defaults to 22)
# class 
# id 
value="   'foo'   "'"bar" 'baz  
size=30
</tf>                                                                      || <tf>value:complex_input</tf>

== Radios

|| '''Description''' || '''Example'''                                                                                                                                     || '''Value'''
|| simple radio      || <tf>radio:simple_radio:value='beer'</tf> [[BR]]<tf>radio:simple_radio:value=milk checked=true</tf> [[BR]] <tf>radio:simple_radio:value=water</tf> || <tf>value:simple_radio</tf>
|| complex radio     || <tf>radio:complex_radio:
# Further cfg-options are:
# checked  : flag ('1','true' 'on' 'yes') used if there is no database entry available...
# value    : value stored when this radio is selected
# class 
# id 
value=dummy1  
size=30
</tf> [[BR]] <tf>radio:complex_radio:
value=dummy2</tf>                                                                                                                                                         || <tf>value:complex_radio</tf>

== Text areas

|| '''Description''' || '''Example'''                 || '''Value'''
|| simple text       || <tf>textarea:simple_text</tf> || <tf>value:simple_text</tf>
|| complex text      || <tf>textarea:complex_text:
# Further cfg-options are:
# rows     : defaults to 2
# cols     : defaults to 10
# value    : default value if no database entry is available, defaults to ''
# class 
# id 
cols=30 rows=5 value='Please fill your
approval
comment
in here'</tf>                                          || <tf>value:complex_text</tf>

== Submit Buttons

|| '''Description''' || '''Example'''
|| simple button     || <tf>submit</tf>
|| complex button    || <tf>submit:
# label    : label on the button, defaults to 'Send'
# class 
# id 
label='Commit'</tf>

== Query Stuff

<tf>
# to have a value which is always there...
set:to_be_queried:magic_value</tf>

=== Without Formatting

|| '''Value'''  || <tf>value:to_be_queried</tf>
|| '''Who'''    || <tf>who:to_be_queried</tf>
|| '''When'''   || <tf>when:to_be_queried</tf>

=== With Formatting

|| '''Value''' (in bold)  || '''<tf>value:to_be_queried</tf>'''
|| '''Who''' (underlined) || __<tf>who:to_be_queried</tf>__
|| '''When''' (in italic) || ''<tf>when:to_be_queried</tf>''

<tf>lastmodified</tf>

== Debug Stuff

<tf>
# set an relative field
set:rel_name:rel_value
</tf>

<tf>
# set an absolute field
set:/abs_name:abs_value
</tf>

<tf>delete:/abs_name</tf>

<tf>
# dump fields...
dump:.*
</tf>
}}}

Normal wiki formatted stuff...

New Include Feature

Let's assume you have a wiki page named 'sandbox':

{{{
({{a}})

({{b}})

({{x}})

({{a}})

({{ c }})

({{d}})
}}}

If you call it like this:

[[WikiFormInclude(sandbox:a=1 b=2 c=' " ' d='a b c d')]]

all defined values are replaced and the resulting page is rendered as usual.

New Permission Feature

Think of an example like this:

admin
user
normal
user
other
user
region1 rw r /
region2 rw / /
region3 / / r
{{{
#!WikiForms

<f>permission:change:                                            # default access is none                          </f>
<f>permission:change: +rw     : user in admin_user1,admin_user2  # admin user gets additionally read/write access  </f>
<f>permission:change: +r      : user in user1 , user2            # normal user get additionally read access        </f>
<f>permission:alias : region1                                    # save this as permission for region 1            </f>


<f>permission:change:                                            # default access is none                          </f>
<f>permission:change: +rw     : user in admin_user1,admin_user2  # admin user gets read/write access               </f>
<f>permission:alias : region2                                    # save this as permission for region 2            </f>


<f>permission:change:  r                                         # default access is read                          </f>
<f>permission:change: -r      : user in admin_user1,admin_user2  # admin user should not see default message       </f>
<f>permission:change: -r      : user in user1 , user2            # normal user should not see default message      </f>
<f>permission:alias : region3                                    # save this as permission for region 3            </f>


<f>permission:alias:region1</f>
<f>checkbox:approval1</f>  This is region 1 (rw for admin-user, r for normal-user, hidden for others)


<f>permission:alias:region2</f>
<f>checkbox:approval2</f>  This is region 2 (rw for admin-user, hidden for normal-user and others)


<f>permission:alias:region3</f>
<f>checkbox:approval3</f>  This is region 3 (hidden for admin- and normal-user, r for others)
}}}

Permissions might be based on the state of a ticket or milestone like this:

{{{
#!WikiForms

<f>permission:change:rw</f>
<f>permission:change:-w:ticket_state 42 in closed         # ticket with id=42 has to exist!    </f>

|| <f>checkbox:approval:checked=true</f>                             || (read-only if #42 is in closed state)
|| <f>input:comment:value='Please fill in your comment' size=50</f>  || (read-only if #42 is in closed state)


<f>permission:change:rw</f>
<f>permission:change:-w:milestone_is_complete 'my next milestone'   # milestone with name='my next milestone' has to exist!              </f> 

<f>checkbox:approval:checked=true</f>  (read-only if milestone is completed)
}}}

New Notification feature

Sometimes users want to be informed via email if a form is updated, eg when form is at review checklist.

The new notify-tag supports this:

<tf>notify:mail_to="comma separated list of mail addresses to be notified" subject="subject of notification e-mail"    body="optional information included into the notification e-mail"</tf>

A real life example: The svn-post-commit hook appends the following review checklist call to the check-in comment:

[[WikiFormInclude(checklists/commit_review/v1:mail_to=foo@bar revision=r1234)]]

The called checklist contains the following notify-tag:

<tf>notify:mail_to={{mail_to}} subject="Commit Review {{revision}} Updated"</tf>

Bugs/Feature Requests

Existing bugs and feature requests for WikiFormsPlugin are here.

If you have any issues, create a new ticket.

defect

9 / 10

enhancement

1 / 5

Download

Download the zipped source from here.

Source

You can check out WikiFormsPlugin from here using Subversion, or browse the source with Trac.

Installation

General instructions on installing Trac plugins can be found on the TracPlugins page.

Recent Changes

17238 by rjollos on 2018-07-09 20:09:40
TracWikiForms 1.0.0dev: Fix windows incompatibility

The %T format code does not exist on Windows.

Fixes #13451.

16886 by rjollos on 2017-10-16 05:58:27
TracWikiForms 1.0.0dev: WIKIFORMS_ADMIN grants WIKIFORMS_VIEW

Refs #13301.

16885 by rjollos on 2017-10-16 05:52:55
TracWikiForms 1.0.0dev: Remove import unused after r16884

Refs #13301.

(more)

Author/Contributors

Author: asic_druide
Maintainer: none (needsadoption)
Contributors: