add Elements/StaticSelect, viewOpen now only takes a modal

This commit is contained in:
Deon George 2022-02-23 10:41:34 +11:00
parent 4ea6152194
commit a98debe69a
5 changed files with 117 additions and 16 deletions

View File

@ -316,7 +316,7 @@ final class API
{ {
Log::debug(sprintf('%s:Open a view',static::LOGKEY),['m'=>__METHOD__,'t'=>$trigger]); Log::debug(sprintf('%s:Open a view',static::LOGKEY),['m'=>__METHOD__,'t'=>$trigger]);
return new Generic($this->execute('views.open',json_encode(['trigger_id'=>$trigger,'view'=>json_encode($view)]))); return new Generic($this->execute('views.open',json_encode(['trigger_id'=>$trigger,'view'=>$view])));
} }
/** /**
@ -329,21 +329,21 @@ final class API
* @throws \Exception * @throws \Exception
* @todo Add some smarts to detect if the new view is the same as the current view, and thus no need to post. * @todo Add some smarts to detect if the new view is the same as the current view, and thus no need to post.
*/ */
public function viewPublish(string $user,string $view,string $hash=''): Generic public function viewPublish(string $user,Modal $view,string $hash=''): Generic
{ {
Log::debug(sprintf('%s:Publish a view',static::LOGKEY),['m'=>__METHOD__,'u'=>$user,'h'=>$hash]); Log::debug(sprintf('%s:Publish a view',static::LOGKEY),['m'=>__METHOD__,'u'=>$user,'h'=>$hash]);
return new Generic($this->execute('views.publish',json_encode($hash ? ['user_id'=>$user,'view'=>$view,'hash'=>$hash] : ['user_id'=>$user,'view'=>$view]))); return new Generic($this->execute('views.publish',json_encode($hash ? ['user_id'=>$user,'view'=>$view,'hash'=>$hash] : ['user_id'=>$user,'view'=>$view])));
} }
public function viewPush(string $trigger,string $view): Generic public function viewPush(string $trigger,Modal $view): Generic
{ {
Log::debug(sprintf('%s:Push a view',static::LOGKEY),['m'=>__METHOD__,'t'=>$trigger]); Log::debug(sprintf('%s:Push a view',static::LOGKEY),['m'=>__METHOD__,'t'=>$trigger]);
return new Generic($this->execute('views.push',json_encode(['trigger_id'=>$trigger,'view'=>$view]))); return new Generic($this->execute('views.push',json_encode(['trigger_id'=>$trigger,'view'=>$view])));
} }
public function viewUpdate(string $view_id,string $view): Generic public function viewUpdate(string $view_id,Modal $view): Generic
{ {
Log::debug(sprintf('%s:Update a view',static::LOGKEY),['m'=>__METHOD__,'id'=>$view_id]); Log::debug(sprintf('%s:Update a view',static::LOGKEY),['m'=>__METHOD__,'id'=>$view_id]);

View File

@ -5,7 +5,7 @@ namespace Slack\Blockkit\Blocks;
use \Exception; use \Exception;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Slack\Blockkit\Blocks; use Slack\Blockkit\Blocks;
use Slack\Blockkit\Blocks\Elements\Text; use Slack\Blockkit\Blocks\Elements\{Button,MultiStaticSelect,Text};
use Slack\Blockkit\Element; use Slack\Blockkit\Element;
final class Actions extends Blocks final class Actions extends Blocks
@ -16,6 +16,12 @@ final class Actions extends Blocks
private const MAX_ELEMENTS = 5; private const MAX_ELEMENTS = 5;
private const VALID_ELEMENTS = [
Button::class,
MultiStaticSelect::class,
Blocks\Accessories\Overflow::class,
];
/** /**
* @param Text $text * @param Text $text
* @throws Exception * @throws Exception
@ -33,6 +39,14 @@ final class Actions extends Blocks
return new self(); return new self();
} }
public function jsonSerialize()
{
if (! $this->elements)
throw new Exception('Must define at least 1 element');
return parent::jsonSerialize();
}
/* OPTIONAL ITEMS */ /* OPTIONAL ITEMS */
public function block_id(string $string): self public function block_id(string $string): self
@ -47,6 +61,8 @@ final class Actions extends Blocks
if (count($collection) > self::MAX_ELEMENTS) if (count($collection) > self::MAX_ELEMENTS)
throw new Exception(sprintf('Can only have maximum %d elements',self::MAX_ELEMENTS)); throw new Exception(sprintf('Can only have maximum %d elements',self::MAX_ELEMENTS));
// @todo Check that a valid element is added. https://api.slack.com/reference/block-kit/blocks#actions
$this->elements = $collection; $this->elements = $collection;
return $this; return $this;

View File

@ -15,6 +15,8 @@ final class MultiStaticSelect extends Element
private const MAX_OPTIONS = 100; private const MAX_OPTIONS = 100;
// @todo option_group? (double check it is applicable to this item)
/** /**
* @param Text $placeholder * @param Text $placeholder
* @param string $action_id * @param string $action_id
@ -43,7 +45,7 @@ final class MultiStaticSelect extends Element
throw new Exception(sprintf('Can only have maximum %d options',self::MAX_OPTIONS)); throw new Exception(sprintf('Can only have maximum %d options',self::MAX_OPTIONS));
$this->options = $options->transform(function($item) { $this->options = $options->transform(function($item) {
return ['text'=>Text::item($item->name,'plain_text'),'value'=>(string)$item->id]; return ['text'=>Text::item($item->name,'plain_text'),'value'=>(string)$item->value];
}); });
} }
@ -68,18 +70,18 @@ final class MultiStaticSelect extends Element
return $this; return $this;
} }
public function initial_options(Collection $collection): self public function initial_options(array $initial=NULL): self
{ {
// No initial options. // No initial options.
if (! count($collection)) if (count($initial)) {
return $this; if (! $this->options)
throw new Exception('Cannot set an initial value without options defined first');
if (count($collection) > self::MAX_OPTIONS) if (count($initial) > self::MAX_OPTIONS)
throw new Exception(sprintf('Can only have maximum %d options',self::MAX_OPTIONS)); throw new Exception(sprintf('Can only have maximum %d options',self::MAX_OPTIONS));
$this->initial_options = $collection->transform(function($item) { $this->initial_options = $this->options->filter(function($item) use ($initial) { return in_array($item['value'],$initial); });
return ['text'=>Text::item($item->name,'plain_text'),'value'=>(string)$item->id]; }
});
return $this; return $this;
} }

View File

@ -0,0 +1,83 @@
<?php
namespace Slack\Blockkit\Blocks\Elements;
use \Exception;
use Illuminate\Support\Collection;
use Slack\Blockkit\Element;
final class StaticSelect extends Element
{
protected const LIMITS = [
'action_id' => 255,
'placeholder' => 150,
];
private const MAX_OPTIONS = 100;
// @todo option_group
/**
* @param Text $placeholder
* @param string $action_id
* @param Collection $options
* @throws Exception
* @todo We dont handle option_groups yet.
*/
public function __construct(Text $placeholder,string $action_id,Collection $options)
{
parent::__construct();
// Defaults
$this->type = 'static_select';
if ($placeholder->type != 'plain_text')
throw new Exception(sprintf('Text must be plain_text not %s',$placeholder->type));
if (strlen($placeholder->text) > self::LIMITS['placeholder'])
throw new Exception(sprintf('Text must be %d chars or less',self::LIMITS['placeholder']));
$this->placeholder = $placeholder;
$this->action_id = $this->validate('action_id',$action_id);
if (count($options) > self::MAX_OPTIONS)
throw new Exception(sprintf('Can only have maximum %d options',self::MAX_OPTIONS));
$this->options = $options->transform(function($item) {
return ['text'=>Text::item($item->name,'plain_text'),'value'=>(string)$item->value];
});
}
public static function item(Text $placeholder,string $action_id,Collection $options): self
{
return new self($placeholder,$action_id,$options);
}
/* OPTIONAL ITEMS */
public function confirm(Confirm $confirm): self
{
$this->confirm = $confirm;
return $this;
}
public function focus_on_load(bool $bool): self
{
$this->focus_on_load = $bool;
return $this;
}
public function initial_option(string $string=NULL): self
{
if (! $this->options)
throw new Exception('Cannot set an initial value without options defined first');
if ($string)
$this->initial_option = $this->options->first(function($item) use ($string) { return $item['value'] == $string; });
return $this;
}
}

View File

@ -56,9 +56,9 @@ class Team extends Model
*/ */
public function getAppTokenObfuscateAttribute(): string public function getAppTokenObfuscateAttribute(): string
{ {
$attrs = explode('-',$this->getAppTokenAttribute()->token); $attrs = explode('-',$this->token->token);
$items = count($attrs)-1; $items = count($attrs)-1;
$attrs[$items] = '...'.substr($attrs[$items],-5); $attrs[$items] = '...'.substr($attrs[$items],-3);
return implode('-',$attrs); return implode('-',$attrs);
} }