Add tableselect form element

Heine - April 5, 2008 - 10:09
Project:Drupal
Version:7.x-dev
Component:forms system
Category:feature request
Priority:normal
Assigned:Unassigned
Status:needs work
Description

The amount of code required to build tables on admin/user/user or admin/content/node is a waste IMO as we could simply create a reusable form element.

Attached patch implements such a form element. It provides:
- Support for tablesort_sql
- Checkboxes or radiobuttons (#multiple => TRUE vs FALSE)
- JS multi-selection via tableselect.js (when #multiple => TRUE and #advanced_select => TRUE)

Most important properties are #header and #options. Structure:

$header = array(
  'col1' => 'Title of field 1',
  'col2' => 'Title of field 2',
);

$options['some_unique_id'] = array(
  'col1' => 'Value of field 1',
  'col2' => 'Value of field 2',
);

A simple example:

<?php
  $header
= array(
   
'title' => t('Title'),
   
'author' => t('Author'),
  );

 
$query = "SELECT n.nid, n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid";
 
$result = pager_query(db_rewrite_sql($query));

  while(
$partial_node = db_fetch_object($result)) {
   
$options[$partial_node->nid] = array(
     
'title' => check_plain($partial_node->title),
     
'author' => check_plain($partial_node->name),
    );
  }
 
$form['nodes'] = array(
   
'#type' => 'tableselect',
   
'#header' => $header,
   
'#options' => $options,
  );
?>

If this patch is accepted, we can convert existing tables to use the element.

AttachmentSizeStatusTest resultOperations
tselect.patch3.43 KBIdleFailed: Failed to install HEAD.View details | Re-test

#1

Heine - April 5, 2008 - 10:14

Here's a module to test the patch.

AttachmentSizeStatusTest resultOperations
example.tar_.gz1 KBIgnoredNoneNone

#2

moshe weitzman - April 5, 2008 - 17:34

will be very handy for many other modules too. devel's variable editor, views_build_operations module.

instead of a sample module why not convert a form in core?

#3

Wim Leers - April 5, 2008 - 17:57
Status:needs review» needs work

+1 for the idea/goal.

Initial review: why not use the normal Drupal formatting for FAPI elements here? I.e. instead of
$element[$key] = array('#type' => 'checkbox', '#processed' => TRUE, '#title' => '', '#return_value' => $key, '#default_value' => isset($value[$key]), '#attributes' => $element['#attributes']);

This would be better:

$element[$key] = array(
  '#type' => 'checkbox',
  '#processed' => TRUE,
  '#title' => '',
  '#return_value' => $key,
  '#default_value' => isset($value[$key]),
  '#attributes' => $element['#attributes'],
);

That's much more readable.

#4

Heine - April 5, 2008 - 20:22
Status:needs work» needs review

Thanks.

Attached patch has the code style change asked for by Wim Leers and one converted core form (admin/user/user).

AttachmentSizeStatusTest resultOperations
tableselect.patch9.21 KBIdleFailed: Failed to apply patch.View details | Re-test

#5

moshe weitzman - April 6, 2008 - 00:27
Status:needs review» reviewed & tested by the community

I tested and it works as designed. Gets rid of a nasty theme function as well.

#6

Heine - April 6, 2008 - 05:28
Status:reviewed & tested by the community» needs work

I've had a discussion with chx on the use of the element renderer (and rendering the checkboxes twice). Let's polish a bit.

#7

Heine - April 6, 2008 - 07:51
Status:needs work» needs review

After a discussion with chx, an updated patch. drupal_render has been modified to store rendered content in the element so parent items can reuse it.

Still using #options, to get element validation. #value is in the format expected, and the validator only looks at the keys in #options, not the values.

chx feels matching keys in #header and #options[foo] are problem and should perhaps be something like:

$table['roles']['rows'][$account->uid] = theme('item_list', $users_roles);
$table['roles']['header'] = t('Roles') ;

but then #header needs to be useable in tablesort_sql.

Right now, #header is not directly useable in tablesort_sql when there's no sort specified, because tablesort_sql relies on a 0 key.

AttachmentSizeStatusTest resultOperations
tselect.patch9.95 KBIdleFailed: Failed to apply patch.View details | Re-test

#8

chx - April 6, 2008 - 09:45

I wonder whether tablesort_sql could be also fixed... using current (the array pointer is reset afer assigment)...

#9

Heine - April 6, 2008 - 10:04

Here's a patch with the additional tablesort fixed. It uses 0 when set as the default sort, otherwise current. Added 'sql' => '' to remove another notice.

AttachmentSizeStatusTest resultOperations
tselect.patch10.73 KBIdleFailed: Failed to apply patch.View details | Re-test

#10

chx - April 6, 2008 - 16:46

$first = isset($header[0]) ? $header[0] : current($header); is hardly needed. If you have an unindexed list of header elements, then current() --for a reset array-- will return $header[0].

#11

moshe weitzman - April 7, 2008 - 01:06

I tested and this is good to go. If you are going in one more time as chx suggests, I propose adding a little Doxygen to theme_tableselect(). I will RTBC after those minor improvements.

#12

Heine - April 8, 2008 - 03:38

Thanks for the reviews & help. I initially kept [0] as default for explicitly set keys. But this is indeed nonsense; people can set 'sort'.

AttachmentSizeStatusTest resultOperations
tselect.patch10.98 KBIdleFailed: Failed to apply patch.View details | Re-test

#13

moshe weitzman - April 8, 2008 - 04:04
Status:needs review» reviewed & tested by the community

thanks for the new doxygen.

#14

chx - April 8, 2008 - 06:46

I agree with the RTBC. This is one nice patch.

#15

catch - April 8, 2008 - 12:12

One space missing in doxygen for theme_tableselect. I can't in good conscience mark it needs work, so here's a patch with the extra space.

Pretty please don't credit on commit.

Also, very nice indeed! I saw those theme functions in user module the other day and it seemed like overkill. Now it won't be :)

AttachmentSizeStatusTest resultOperations
tselect_2.patch10.98 KBIdleFailed: Failed to apply patch.View details | Re-test

#16

Heine - June 5, 2008 - 09:34

What does this patch need in order to get in or be rejected?

Benefits:

  • The change to drupal_render allows composit element types to render their children without doing double work.
  • Much easier creation of these kinds of tables (eg admin/content/node, admin/content/comments, tracker even perhaps)

#17

moshe weitzman - July 10, 2008 - 20:46

Did a quick check and this still applies and works. Can we please get some feedback here? Thanks.

#18

Dries - July 11, 2008 - 02:17
Status:reviewed & tested by the community» needs work

I started by reading the PHPdoc of this patch. Based on the PHPdoc, I could not figure out how to use this function or what its purpose is.

Would also be nice if we had tests for this new function.

#19

moshe weitzman - July 11, 2008 - 02:33

Thanks for the review.

I think decided a long time to document fapi properties outside of the code. We settled on http://api.drupal.org/api/file/developer/topics/forms_api.html/5 and http://api.drupal.org/api/file/developer/topics/forms_api_reference.html. We can change our minds about that, but at present virtually no fapi elements are documented in code.

I don't see any tests for form.inc at all. Am I missing them? We can start with this one but I'd love some discussion about how we want to test FAPI elements.

#20

moshe weitzman - July 11, 2008 - 09:37

Heine has written excellent documentation at http://cvs.drupal.org/viewvc.py/drupal/contributions/modules/elements/RE.... Now, where tp put this in Drupal?

#21

moshe weitzman - July 15, 2008 - 21:08
Status:needs work» reviewed & tested by the community

I have shown above that we have documentation waiting for api.drupal.org regarding this new form element. I looked but simply cannot find a suitable place for it in core.

We have zero form testing in core and I don't think this patch is the right place to initiate such an effort. So, I humbly set this to RTBC. I will personally update api.drupal.org if this goes in.

#22

catch - July 16, 2008 - 09:05

It seems like the easiest way to add a test for this would be the admin/user/user pages since there's an implementation of an actual form in the patch - there's an existing issue here (claimed by a new tester) for writing those tests #276583: TestingParty08: Tests for admin/user/user filters.

#23

moshe weitzman - July 16, 2008 - 14:08

Excellent proposal, Catch. I hope that the committers don't think that a test of that page is a prerequisite for this patch but we shall see.

#24

lilou - August 23, 2008 - 15:20

Re-roll to CVS HEAD.

AttachmentSizeStatusTest resultOperations
tselect_2_1.patch6.67 KBIdleFailed: Invalid PHP syntax.View details | Re-test

#25

moshe weitzman - August 29, 2008 - 00:09
Status:reviewed & tested by the community» needs review

Thanks for the reroll, lilou.

Note that we finally have the above mentioned test written and RTBC. so this form element should proceed soon.

#26

moshe weitzman - September 6, 2008 - 18:09
Status:needs review» reviewed & tested by the community

I have code reviewed the patch, and run the new simpletest for User Administration. 35 passes, 0 fails, 0 exceptions. RTBC.

#27

webchick - September 6, 2008 - 22:06

Hm. Is there a reason we don't convert admin/content/node and admin/content/comment to use this same construct?

#28

moshe weitzman - September 7, 2008 - 12:24

No reason - we are just trying to keep the patch small, and rightfully so because it has taken a long time to get it in already. I'll make sure those pages get converted after this goes in. I also signed up to do the docs.

#29

Heine - September 20, 2008 - 09:26
Status:reviewed & tested by the community» needs work

Patch in #24 misses most of the changes to user.admin.inc. #15 no longer applies due to the #value => #markup change.

#30

Heine - September 20, 2008 - 09:46
Status:needs work» needs review

I'll convert other forms in separate issues.

AttachmentSizeStatusTest resultOperations
ts.patch11.68 KBIdleFailed: 7241 passes, 4 fails, 0 exceptionsView details | Re-test

#31

Heine - September 20, 2008 - 10:02

Comment admin overview converted on http://drupal.org/node/311072.

This makes me wonder if we should introduce an #empty property to display a default empty message in the entire table width.

#32

Heine - September 20, 2008 - 10:37
Status:needs review» needs work

I just noticed the expand functions changed naming convention.

#33

dropcube - September 20, 2008 - 22:04

Yes, an #empty property would be required. Subscribing...

#34

drewish - September 22, 2008 - 01:42

subscribe

#35

webchick - September 22, 2008 - 04:34

Say, Heine? While you're fixing things up, +function theme_tableselect($element) { needs some PHPDoc.

#36

drewish - October 17, 2008 - 01:15

as moshe pointed out this would be really helpful for #322287: Add file.module to provide UI for managing files

#37

Arancaytar - November 3, 2008 - 05:11
Status:needs work» needs review

I've renamed expand_tableselect to form_process_tableselect as well as add support for an #empty attribute (which is assumed to be t('No items exist.') if not set). No PHPDoc yet, and I think my change still requires some work. Worth a look, though.

AttachmentSizeStatusTest resultOperations
drupal_forms_tableselect-242962-37.patch12.2 KBIdleFailed: Failed to install HEAD.View details | Re-test

#38

Arancaytar - November 3, 2008 - 05:13

(Forgot to mention: Keep in mind that the user admin page still prints debugging output instead of saving.)

#39

Heine - November 3, 2008 - 10:21

Converted comments, made #empty '' when not set and #value array() when there are no items.

AttachmentSizeStatusTest resultOperations
table_select_empty.patch17.23 KBIdleFailed: Failed to apply patch.View details | Re-test

#40

moshe weitzman - November 7, 2008 - 04:32
Status:needs review» reviewed & tested by the community

code looks great. comment and user admin tests pass. rtbc.

#41

System Message - November 16, 2008 - 22:00
Status:reviewed & tested by the community» needs work

The last submitted patch failed testing.

#42

lilou - November 17, 2008 - 03:42
Status:needs work» needs review

failure was due to HEAD not installing properly

#43

lilou - November 17, 2008 - 03:42
Status:needs review» reviewed & tested by the community

#44

System Message - November 17, 2008 - 03:42
Status:reviewed & tested by the community» needs work

The last submitted patch failed testing.

#45

lilou - November 17, 2008 - 12:57

#46

moshe weitzman - November 17, 2008 - 15:16

Sorry, I am confused. This was RTBC before. Why CNR now?

#47

lilou - November 17, 2008 - 15:47
Status:needs review» reviewed & tested by the community

You're right.

#48

System Message - December 4, 2008 - 01:45
Status:reviewed & tested by the community» needs work

The last submitted patch failed testing.

#49

Heine - December 4, 2008 - 09:36
Status:needs work» needs review

reroll

AttachmentSizeStatusTest resultOperations
table_select_empty_49.patch0 bytesIdleFailed: 9191 passes, 3 fails, 3 exceptionsView details | Re-test

#50

Heine - December 4, 2008 - 09:49

Non-empty patch file

AttachmentSizeStatusTest resultOperations
table_select_empty_49.patch17.12 KBIdleFailed: 9000 passes, 3 fails, 3 exceptionsView details | Re-test

#51

moshe weitzman - December 8, 2008 - 01:48
Status:needs review» reviewed & tested by the community

Code looks good (still). The admin/user/user tests still pass - lets commit this.

#52

Dave Reid - December 8, 2008 - 03:09

Very very nice!

#53

moshe weitzman - January 8, 2009 - 01:16

I'm beginning to think this issue is cursed. Please - commit or say whats wrong, folks. If this patch won't apply anymore, at least say if it is committable once fixed.

#54

webchick - January 8, 2009 - 01:44

At various points, I've asked some themers in #drupal to take a look at this issue, and so far haven't had any takers. So if you can grab someone who would be likely to deal with overriding this function who could provide an informed review, that would certainly expedite its commit process.

A FAPI guru wouldn't hurt either.

#55

moshe weitzman - January 8, 2009 - 02:00

webchick - please reconsider he request for more reviewers. this has been given a thimbs up by: webchick: heine, moshe, chx, wim leers, catch, drewish, Dave Reid , Arancaytar. i think this group has quite some themeing know how. i'm not sure who else to ask.

#56

noahb - January 9, 2009 - 08:50

re-roll to keep up with HEAD...

AttachmentSizeStatusTest resultOperations
tablesort_reroll.patch17.13 KBIdleFailed: Invalid PHP syntax.View details | Re-test

#57

System Message - January 9, 2009 - 09:15
Status:reviewed & tested by the community» needs work

The last submitted patch failed testing.

#58

Heine - January 9, 2009 - 10:17
Status:needs work» needs review

Let's try with Unix linebreaks.

AttachmentSizeStatusTest resultOperations
tablesort_reroll.patch16.68 KBIdlePassed: 9237 passes, 0 fails, 0 exceptionsView details | Re-test

#59

noahb - January 9, 2009 - 10:26
Status:needs review» reviewed & tested by the community

Issue was already RTBC, and the changes in #58 were only to sync with HEAD.

#60

noahb - January 10, 2009 - 09:32

Chasing HEAD.

AttachmentSizeStatusTest resultOperations
tselect.patch16.69 KBIdlePassed: 9263 passes, 0 fails, 0 exceptionsView details | Re-test

#61

System Message - January 19, 2009 - 14:15
Status:reviewed & tested by the community» needs work

The last submitted patch failed testing.

#62

catch - January 19, 2009 - 14:32
Status:needs work» needs review

test bot still doesn't like the file naming test.

#63

webchick - January 20, 2009 - 06:13
Status:needs review» needs work

Ok, I finally got a chance to sit down for awhile with this patch tonight. This is a good patch, and eliminates a lot of duplicate code in favour of a structured, consistent way to deal with "I have a big table of stuff I want to select ala admin/build/node and such." It also makes said code a lot more legible.

I don't believe Dries's earlier comments about the PHPDoc are addressed, however. I, too, can't figure out what these new functions do purely from their descriptions. This is particularly an issue because one of these functions is "themer-facing":

/**
+ * Render the element as a table, with the expanded children in the first row.

Sorry, but... what? :) This sounds like something that might be an inline comment within the function. But the purpose of the PHPDoc summary line is to signal to people who are looking at a page like http://api.drupal.org/api/group/themeable/7, "Oh, THAT'S the function I need for X." The other theme_TYPE theme functions tend to be like this:

* Format a set of radio buttons.

So maybe something like:

* Format a table with checkboxes or radio buttons to select items within it.

Then...

+ * @param $element
+ *   An associative array containing the properties of the element.

All other theme functions in the vicinity here include a line directly after this like this:

*   Properties used: title, value, id, required, error.

Let's add one here too as well, please.

* Create the right amount of checkboxes or radios to populate the table.

Should be "correct" amount. Also, this is missing a @param and @return.

Now, aside from documentation-related concerns, I also have a couple of naming-related ones too.

Looking at the default implementation in system_elements():

+  $type['tableselect'] = array(
+    '#input' => TRUE,
+    '#advanced_select' => TRUE,
+    '#multiple' => TRUE,
+    '#process' => array('form_process_tableselect'),
+    '#options' => array(),
+    '#empty' => '',
+  );

I can figure out (or mostly confidently guess) by reading most of these what they mean, but I'm stuck on '#advanced_select' .. I have no idea to what that's referring. Could this be renamed to something a bit closer to what it actually flags? Maybe #select_all ?

This confusion is also a good indication that both theme_tableselect() and form_process_tableselect() could use some more inline comments to explain what's going on in there. My general rule of thumb is one inline comment every 4-5 lines of code (or the closest place where it logically makes sense).

Not for this patch, since I imagine this is some silly FAPI internals thing, but it's really odd that checkboxes have a #processed property and #radios have a #spawned property.

+  if (empty($options)) {
+    $rows[] = array(array('data' => t('No users available.'), 'colspan' => '7'));
+    $form['accounts'] = array(
+      '#markup' => theme('table', $header, $rows),
+    );
+  }
+  else {
+    $form['accounts'] = array(
+      '#type' => 'tableselect',
+      '#header' => $header,
+      '#options' => $options,
+    );
+  }

Shouldn't this be an #empty property instead?

One final thing is that radio/radios, checkbox/checkboxes, text/textarea, form, date, file, etc. are all semi-"native" things in HTML. "tableselect" is not. At one point when I asked for reviews in #drupal, I remember someone being confused by this (though it doesn't appear they commented here to say this). However, we had a good round of bikeshed discussion and couldn't come up with anything better, and this patch has already been held up enough so we can try and think of something more clear sometime before code freeze as a follow-up patch.

Going through the rest of the code, I didn't spot anything else. I do think that we need tests for this though. We are introducing a big glomp of complex code here with many twisty passages and need to make all of the edge cases are working, esp. since this is going to be re-used everywhere. That means testing:

* Are checkboxes displayed when multiple is true, radios displayed when multiple is false?
* Is the empty text displayed when the table is empty?
* Is the select all checkbox rendered in the header if that property is set to true?
* Are correct selected element(s) retained when the form is submitted?

Without this, I have a feeling we're going to end up breaking this and not realizing it down the road. There is modules/simpletest/tests/form.test now which this can be added to as a new test case. If you need any help, there are lots of testing experts at all times in #drupal who would love to help you out.

So. Comments, some basic tests, and take a look at that chunk of code. If those things get done, I have no problem committing this.

#64

Heine - January 20, 2009 - 08:04

Webchick, thanks a lot. I'll be working on this.

#65

skiquel - January 20, 2009 - 14:25

Hello. Webchick, Crell, et al. is too shy to mention this.

Consider using the term '#type' => 'autotable' or '#type' => 'magictable' instead of 'type' => "tableselect". Toss it around a bit in your head. Have an epiphany.

#66

Heine - January 21, 2009 - 18:50
Status:needs work» needs review

I've renamed #advanced_select to #js_select, added a few comments, a number of tests, but pending the epiphany, the #type is still tableselect.

As #spawned is a D5 construct and no living soul remembers the "Why" of #processed apart from "Some optimization", both have been removed.

AttachmentSizeStatusTest resultOperations
core-242962-tselect_test.patch27.42 KBIdleFailed: Failed to apply patch.View details | Re-test

#67

System Message - January 21, 2009 - 18:55
Status:needs review» needs work

The last submitted patch failed testing.

#68

Heine - January 21, 2009 - 19:11
Status:needs work» needs review

Rerolled for whitespace change.

AttachmentSizeStatusTest resultOperations
core-242962-tselect_test.patch21.46 KBIdleFailed: 9021 passes, 26 fails, 24 exceptionsView details | Re-test

#69

System Message - January 21, 2009 - 19:35
Status:needs review» needs work

The last submitted patch failed testing.

#70

Heine - January 21, 2009 - 20:05
Status:needs work» needs review

Updated patch to include the new test module.

AttachmentSizeStatusTest resultOperations
core-242962-tselect_test.patch27.43 KBIdlePassed: 9289 passes, 0 fails, 0 exceptionsView details | Re-test

#71

moshe weitzman - January 22, 2009 - 18:37
Status:needs review» reviewed & tested by the community

Did another code review. Looks great. Since the extensive tests have passed, I'm comfortable with RTBC here.

#72

Dave Reid - January 23, 2009 - 02:24
Status:reviewed & tested by the community» needs work

I don't see why all the _form_test_tableselect_multiple_true_form(), _form_test_tableselect_multiple_false_form(), _form_test_tableselect_empty_form(), and _form_test_tableselect_js_select_form() functions can't be combined into one form builder function:

<?php
function _form_test_tableselect_form($form_state, array $options) {
 
$form = array();

  list(
$header, $options) = _form_test_tableselect_get_data();
 
 
$options += array(
   
'#type' => 'tableselect',
   
'#header' => $header,
   
'#options' => $options,
   
'#multiple' => FALSE,
   
'#js_select' => FALSE,
   
'#empty' => t('Empty text.'),
  );
 
 
$form['submit'] = array(
   
'#type' => 'submit',
   
'#value' => t('Submit'),
  );

  return
$form;
}

function
_form_test_tableselect_multiple_true_form() {
  return
_form_test_tableselect_form(array('#multiple' => TRUE));
}

function
_form_test_tableselect_multiple_false_form() {
  return
_form_test_tableselect_form();
}

function
_form_test_tableselect_empty_form() {
  return
_form_test_tableselect_form(array('#options' => array()));
}

etc...
?>

Replace list($header, $options) = $this->getData(); with _form_test_tableselect_get_data()...don't duplicate code.

#73

webchick - January 23, 2009 - 02:40

Review:

+ * Format a table with radiobuttons or checkboxes

"radio buttons or checkboxes." [radio buttons is two words, needs a period at the end.]

+    'operations' => array('data' => t('Operations')),

put the last ) on the following line.

+ * Test the tableselect form element for expected behaviour.
...
+      'description' => t('Test the tableselect element for expected behaviour'),

behavior. We use US English. Sorry. :(

+    $this->assertNoFieldByXPath('//th[@class="select-all"]', NULL, t('Do not display a "Select all" checkbox when #js_select is FALSE.'));
+

Extra blank line here.

So those are all minor. The patch itself is good to go from my perspective once these are fixed.

Next, I reviewed the tests, and got a little confused in places:

1. getData() and _form_test_tableselect_get_data() look to be exactly the same function. Since the setUp() function of the test already enabled the module, could you not just call _form_test_tableselect_get_data() as needed from the test?

2. I don't understand the purpose of function formSubmitHelper(), and none of our other tests need such a helper. Why not just do a drupalPost() and check its results to make sure that they do/do not contain the text that they should/shouldn't?

#74

Heine - January 23, 2009 - 08:01

I will make a patch based on these comments.

I need formSubmitHelper() to simulate posting invalid values to the form, so I can test if the FAPI #options checker works. When I try to post invalid values with drupalPost, simpletest itself complains about not finding fields.

As formSubmitHelper depends on FAPI implementation details I also would like another way of testing this.

#75

Heine - January 26, 2009 - 10:21
Status:needs work» needs review

Here's an updated patch. Pending #346095: Test #ahah and ajax, formSubmitHelper() is still necessary.

AttachmentSizeStatusTest resultOperations
core-242962-tableselect_tests_75.patch26.75 KBIdleFailed: Failed to apply patch.View details | Re-test

#76

System Message - January 26, 2009 - 19:30
Status:needs review» needs work

The last submitted patch failed testing.

#77

noahb - January 27, 2009 - 03:13

re-roll...

AttachmentSizeStatusTest resultOperations
tselect_reroll.patch26.14 KBIdlePassed: 9342 passes, 0 fails, 0 exceptionsView details | Re-test

#78

noahb - January 27, 2009 - 03:15
Status:needs work» needs review

and CNR... Do I need to do this to get the tests to run automatically, or will code needs work statuses also get tested?

#79

catch - January 27, 2009 - 09:33

Patches on issues that are Code Needs Work don't get tested automatically.

#80

webchick - January 28, 2009 - 07:45

I gave this one last read through and then committed it. The test coverage is outstanding, it solves a huge inconsistency problem, and since this issue pre-dates #346095: Test #ahah and ajax by many fortnights, I'm okay with formSubmitHelper() being in there as a temporary solution for now.

Leaving CNW because the upgrade docs and the form API reference need to be updated to reflect this new addition.

AWESOME WORK, Heine!! :D

#81

webchick - January 28, 2009 - 07:47
Status:needs review» needs work

Oops. I thought I marked it CNW, anyway. ;)

#82

drewish - September 18, 2009 - 02:14

Humm... noticed that the sorting is totally screwed up on this form element right now. I would have opened a new issue but since this is still CNW i guess we could address it here.

 
 

Drupal is a registered trademark of Dries Buytaert.