diff --git a/Bugzilla/DB/Schema.pm b/Bugzilla/DB/Schema.pm index 7ea7e0e18..6d6dcfc43 100644 --- a/Bugzilla/DB/Schema.pm +++ b/Bugzilla/DB/Schema.pm @@ -618,6 +618,7 @@ use constant ABSTRACT_SCHEMA => { id => {TYPE => 'INTSERIAL', NOTNULL => 1, PRIMARYKEY => 1}, value => {TYPE => 'varchar(255)', NOTNULL => 1}, product_id => {TYPE => 'INT4', NOTNULL => 1, REFERENCES => {TABLE => 'products', COLUMN => 'id', DELETE => 'CASCADE'}}, + sortkey => {TYPE => 'INT4', NOTNULL => 1, DEFAULT => 0}, isactive => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 'TRUE'}, ], INDEXES => [ diff --git a/Bugzilla/Install/DB.pm b/Bugzilla/Install/DB.pm index 4effd9d8b..dcaac43c7 100644 --- a/Bugzilla/Install/DB.pm +++ b/Bugzilla/Install/DB.pm @@ -861,6 +861,8 @@ WHERE description LIKE \'%[CC:%]%\''); $dbh->bz_alter_column('bugs', $_->name, Bugzilla::Field->SQL_DEFINITIONS->{FIELD_TYPE_NUMERIC()}); } + $dbh->bz_add_column('versions', 'sortkey'); + _move_old_defaults($old_params); ################################################################ diff --git a/Bugzilla/Version.pm b/Bugzilla/Version.pm index 8c99fdefd..24d9e4820 100644 --- a/Bugzilla/Version.pm +++ b/Bugzilla/Version.pm @@ -43,6 +43,7 @@ use constant DB_COLUMNS => qw( id value product_id + sortkey isactive ); @@ -54,11 +55,13 @@ use constant REQUIRED_CREATE_FIELDS => qw( use constant UPDATE_COLUMNS => qw( value isactive + sortkey ); use constant VALIDATORS => { product => \&_check_product, isactive => \&Bugzilla::Object::check_boolean, + sortkey => \&_check_sortkey, }; use constant UPDATE_VALIDATORS => { @@ -107,7 +110,7 @@ sub _do_list_select { my $self = shift; my $list = $self->SUPER::_do_list_select(@_); - return [ sort { vers_cmp(lc($a->{value}), lc($b->{value})) } @$list ]; + return [ sort { ($a->{sortkey} <=> $b->{sortkey}) || vers_cmp(lc $a->{value}, lc $b->{value}) } @$list ]; } sub run_create_validators @@ -180,6 +183,7 @@ sub update sub product_id { return $_[0]->{product_id}; } sub is_active { return $_[0]->{isactive}; } +sub sortkey { return $_[0]->{sortkey}; } sub product { @@ -195,6 +199,7 @@ sub product sub set_name { $_[0]->set('value', $_[1]); } sub set_is_active { $_[0]->set('isactive', $_[1]); } +sub set_sortkey { $_[0]->set('sortkey', $_[1]); } sub _check_value { @@ -226,6 +231,12 @@ sub _check_product return Bugzilla->user->check_can_admin_product($product->name); } +sub _check_sortkey +{ + my ($invocant, $sortkey) = @_; + return int($sortkey || 0); +} + 1; __END__ diff --git a/editversions.cgi b/editversions.cgi index c76ad5991..9eb577eca 100755 --- a/editversions.cgi +++ b/editversions.cgi @@ -122,6 +122,7 @@ if ($action eq 'new') my $version = Bugzilla::Version->create({ name => $version_name, product => $product, + sortkey => $ARGS->{sortkey} || 0, }); delete_token($token); $vars->{message} = 'version_created'; @@ -210,6 +211,7 @@ if ($action eq 'update') $version->set_name($version_name); $version->set_is_active($isactive); + $version->set_sortkey($ARGS->{sortkey}); my $changes = $version->update(); $changes->{control_lists} = 1 if $version->field->update_control_lists($version->id, $ARGS); diff --git a/template/en/default/admin/versions/edit.html.tmpl b/template/en/default/admin/versions/edit.html.tmpl index c504a2f67..1e9945955 100644 --- a/template/en/default/admin/versions/edit.html.tmpl +++ b/template/en/default/admin/versions/edit.html.tmpl @@ -27,6 +27,10 @@ + + + + [% IF version.id %]