* custom device field web display and edit * make display work; relies on T::T calling dict slot or method with same syntax * add storing port custom fields * use resultset method instead, use cf_ prefix * update Pg min ver for jsonb * allow override of position and default for port custom fields * support hidden for custom fields * update description of Objects API class * allow left and mid position for custom fields * add custom fields in csv * change port control sidebar label * fix default missing bug on backend jobs
		
			
				
	
	
		
			87 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
package App::Netdisco::Web::CustomFields;
 | 
						|
 | 
						|
use Dancer ':syntax';
 | 
						|
use Dancer::Plugin::DBIC;
 | 
						|
 | 
						|
use App::Netdisco::DB::ResultSet::Device;
 | 
						|
use App::Netdisco::DB::ResultSet::DevicePort;
 | 
						|
 | 
						|
use App::Netdisco::Web::Plugin;
 | 
						|
 | 
						|
my @inline_device_actions = ();
 | 
						|
my @inline_device_port_actions = ();
 | 
						|
 | 
						|
foreach my $config (@{ setting('custom_fields')->{'device'} || [] }) {
 | 
						|
 | 
						|
  if (! $config->{'name'}) {
 | 
						|
      error 'custom_field missing name';
 | 
						|
      next;
 | 
						|
  }
 | 
						|
 | 
						|
  register_device_details({
 | 
						|
    %{ $config },
 | 
						|
    field => ('cf_' . $config->{'name'}),
 | 
						|
    label => ($config->{'label'} || ucfirst $config->{'name'}),
 | 
						|
  }) unless $config->{'hidden'};
 | 
						|
 | 
						|
  push @inline_device_actions, $config->{'name'};
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
foreach my $config (@{ setting('custom_fields')->{'device_port'} || [] }) {
 | 
						|
 | 
						|
  if (! $config->{'name'}) {
 | 
						|
      error 'custom_field missing name';
 | 
						|
      next;
 | 
						|
  }
 | 
						|
 | 
						|
  register_device_port_column({
 | 
						|
    position => 'right', # or "mid" or "right"
 | 
						|
    default  => undef,   # or undef
 | 
						|
    %{ $config },
 | 
						|
    field => ('cf_' . $config->{'name'}),
 | 
						|
    label => ($config->{'label'} || ucfirst $config->{'name'}),
 | 
						|
  }) unless $config->{'hidden'};
 | 
						|
 | 
						|
  push @inline_device_port_actions, $config->{'name'};
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
{
 | 
						|
  package App::Netdisco::DB::ResultSet::Device;
 | 
						|
 | 
						|
  sub with_custom_fields {
 | 
						|
    my ($rs, $cond, $attrs) = @_;
 | 
						|
 | 
						|
    return $rs
 | 
						|
      ->search_rs($cond, $attrs)
 | 
						|
      ->search({},
 | 
						|
        { '+columns' => {
 | 
						|
            map {( ('cf_'. $_) => \[ 'me.custom_fields ->> ?' => $_ ] )}
 | 
						|
                @inline_device_actions
 | 
						|
        }});
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
{
 | 
						|
  package App::Netdisco::DB::ResultSet::DevicePort;
 | 
						|
 | 
						|
  sub with_custom_fields {
 | 
						|
    my ($rs, $cond, $attrs) = @_;
 | 
						|
 | 
						|
    return $rs
 | 
						|
      ->search_rs($cond, $attrs)
 | 
						|
      ->search({},
 | 
						|
        { '+columns' => {
 | 
						|
            map {( ('cf_'. $_) => \[ 'me.custom_fields ->> ?' => $_ ] )}
 | 
						|
                @inline_device_port_actions
 | 
						|
        }});
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
set('_inline_actions' => [
 | 
						|
  map {'cf_' . $_} (@inline_device_actions, @inline_device_port_actions)
 | 
						|
]);
 | 
						|
 | 
						|
true;
 |