Skip to content
Snippets Groups Projects
class.queue.php 37.3 KiB
Newer Older
  • Learn to ignore specific revisions
  •                 $props = array();
                    foreach ($vars['properties'] as $i=>$cid) {
                        if ($cid != $id)
                            // Not a property for this condition
                            continue;
    
                        // Determine the property configuration
                        $prop = $vars['property_name'][$i];
                        if (!($F = QueueColumnConditionProperty::getField($prop))) {
                            // Not a valid property
                            continue;
                        }
                        $prop_form = new SimpleForm(array($F), $vars, array('id' => $cid));
                        $props[$prop] = $prop_form->getField($prop)->getClean();
    
                    $json = array('crit' => $crit, 'prop' => $props);
                    $this->_conditions[] = QueueColumnCondition::fromJson($json);
                    $conditions[] = $json;
    
            // Store as JSON array
    
            $this->annotations = JsonDataEncoder::encode($annotations);
            $this->conditions = JsonDataEncoder::encode($conditions);
        }
    
    class QueueColumnGlue
    extends VerySimpleModel {
        static $meta = array(
            'table' => QUEUE_COLUMN_TABLE,
            'pk' => array('queue_id', 'column_id'),
            'joins' => array(
                'column' => array(
                    'constraint' => array('column_id' => 'QueueColumn.id'),
                ),
                'queue' => array(
                    'constraint' => array('queue_id' => 'CustomQueue.id'),
                ),
            ),
            'select_related' => array('column', 'queue'),
            'ordering' => array('sort'),
        );
    }
    
    class QueueColumnListBroker
    extends InstrumentedList {
        function __construct($fkey, $queryset=false) {
            parent::__construct($fkey, $queryset);
            $this->queryset->select_related('column');
        }
    
        function getOrBuild($modelClass, $fields, $cache=true) {
            $m = parent::getOrBuild($modelClass, $fields, $cache);
            if ($m && $modelClass === 'QueueColumnGlue') {
                // Instead, yield the QueueColumn instance with the local fields
    
                // in the association table as annotations
    
                $m = AnnotatedModel::wrap($m->column, $m, 'QueueColumn');
            }
            return $m;
        }
    
        function add($column, $glue=null) {
            $glue = $glue ?: QueueColumnGlue::create();
            $glue->column = $column;
    
            $anno = AnnotatedModel::wrap($column, $glue);
            parent::add($anno);
            return $anno;
    
    abstract class QueueColumnFilter {
        static $registry;
    
        static $id = null;
        static $desc = null;
    
    
        static function register($filter, $group) {
    
            if (!isset($filter::$id))
                throw new Exception('QueueColumnFilter must define $id');
            if (isset(static::$registry[$filter::$id]))
                throw new Exception($filter::$id
                    . ': QueueColumnFilter already registered under that id');
            if (!is_subclass_of($filter, get_called_class()))
                throw new Exception('Filter must extend QueueColumnFilter');
    
    
            static::$registry[$filter::$id] = array($group, $filter);
    
        }
    
        static function getFilters() {
    
            $list = static::$registry;
            $base = array();
            foreach ($list as $id=>$stuff) {
                list($group, $class) = $stuff;
                $base[$group][$id] = __($class::$desc);
    
            }
            return $base;
        }
    
        static function getInstance($id) {
    
            if (isset(static::$registry[$id])) {
                list(, $class) = static::$registry[$id];
                return new $class();
            }
    
        }
    
        function mangleQuery($query, $column) { return $query; }
    
        abstract function filter($value, $row);
    }
    
    class TicketLinkFilter
    extends QueueColumnFilter {
        static $id = 'link:ticket';
        static $desc = /* @trans */ "Ticket Link";
    
        function filter($text, $row) {
    
            if ($link = $this->getLink($row))
    
                return sprintf('<a style="display:inline" href="%s">%s</a>', $link, $text);
    
        }
    
        function mangleQuery($query, $column) {
            static $fields = array(
                'link:ticket'   => 'ticket_id',
                'link:ticketP'  => 'ticket_id',
                'link:user'     => 'user_id',
                'link:org'      => 'user__org_id',
            );
    
            if (isset($fields[static::$id])) {
                $query = $query->values($fields[static::$id]);
            }
            return $query;
        }
    
        function getLink($row) {
            return Ticket::getLink($row['ticket_id']);
        }
    }
    
    class UserLinkFilter
    extends TicketLinkFilter {
        static $id = 'link:user';
        static $desc = /* @trans */ "User Link";
    
        function getLink($row) {
            return User::getLink($row['user_id']);
        }
    }
    
    class OrgLinkFilter
    extends TicketLinkFilter {
        static $id = 'link:org';
        static $desc = /* @trans */ "Organization Link";
    
        function getLink($row) {
    
            return Organization::getLink($row['user__org_id']);
    
    QueueColumnFilter::register('TicketLinkFilter', __('Link'));
    QueueColumnFilter::register('UserLinkFilter', __('Link'));
    QueueColumnFilter::register('OrgLinkFilter', __('Link'));
    
    
    class TicketLinkWithPreviewFilter
    extends TicketLinkFilter {
        static $id = 'link:ticketP';
        static $desc = /* @trans */ "Ticket Link with Preview";
    
        function filter($text, $row) {
            $link = $this->getLink($row);
    
            return sprintf('<a style="display: inline" class="preview" data-preview="#tickets/%d/preview" href="%s">%s</a>',
    
                $row['ticket_id'], $link, $text);
        }
    }
    
    QueueColumnFilter::register('TicketLinkWithPreviewFilter', __('Link'));
    
    class DateTimeFilter
    extends QueueColumnFilter {
        static $id = 'date:full';
        static $desc = /* @trans */ "Date and Time";
    
        function filter($text, $row) {
            return $text->changeTo(Format::datetime($text->value));
        }
    }
    
    class HumanizedDateFilter
    extends QueueColumnFilter {
        static $id = 'date:human';
        static $desc = /* @trans */ "Relative Date and Time";
    
        function filter($text, $row) {
            return sprintf(
                '<time class="relative" datetime="%s" title="%s">%s</time>',
                date(DateTime::W3C, Misc::db2gmtime($text->value)),
                Format::daydatetime($text->value),
                Format::relativeTime(Misc::db2gmtime($text->value))
            );
        }
    }
    QueueColumnFilter::register('DateTimeFilter', __('Date Format'));
    QueueColumnFilter::register('HumanizedDateFilter', __('Date Format'));
    
    class QueueColDataConfigForm
    extends AbstractForm {
    
        function buildFields() {
            return array(
                'primary' => new DataSourceField(array(
                    'label' => __('Primary Data Source'),
    
                    'required' => true,
    
                    'configuration' => array(
                        'root' => 'Ticket',
                    ),
                    'layout' => new GridFluidCell(6),
                )),
                'secondary' => new DataSourceField(array(
                    'label' => __('Secondary Data Source'),
                    'configuration' => array(
                        'root' => 'Ticket',
                    ),
                    'layout' => new GridFluidCell(6),
                )),
                'name' => new TextboxField(array(
                    'label' => __('Name'),
                    'required' => true,
                    'layout' => new GridFluidCell(4),
    
                'filter' => new ChoiceField(array(
                    'label' => __('Filter'),
    
                    'required' => false,
    
                    'choices' => QueueColumnFilter::getFilters(),
    
                    'layout' => new GridFluidCell(4),
    
                )),
                'truncate' => new ChoiceField(array(
                    'label' => __('Text Overflow'),
                    'choices' => array(
                        'wrap' => __("Wrap Lines"),
                        'ellipsis' => __("Add Ellipsis"),
                        'clip' => __("Clip Text"),
    
                        'lclip' => __("Clip Beginning Text"),
    
                    ),
                    'default' => 'wrap',
    
                    'layout' => new GridFluidCell(4),