'', 'favorite' => 'blank' ); /** * Nextmatch settings * @see Etemplate\Widget\Nextmatch * @var array */ protected $nm_settings = array( 'lettersearch' => false, 'favorites' => false, // Hide favorite control 'actions' => array(), 'placeholder_actions' => array() ); /** * Constructor sets up the portlet according to the user's saved property values * for this particular portlet. It is possible to have multiple instances of the * same portlet with different properties. * * The implementing class is allowed to modify the context, if needed, but it is * better to use get_properties(). * * We try to keep the constructor light as it gets called often, and only load * things needed for display in exec. * * @param context Array portlet settings such as size, as well as values for properties * @param boolean $need_reload Flag to indicate that the portlet needs to be reloaded (exec will be called) */ public function __construct(Array &$context = array(), &$need_reload = false) { // Process dropped data (Should be [appname => , id => ]) into something useable if($context['dropped_data']) { foreach((Array)$context['dropped_data'] as $dropped) { // Only handle one, but dropped is an array $context['appname'] = $dropped['appname']; $context['favorite'] = $dropped['id']; break; } unset($context['dropped_data']); $need_reload = true; } // Favorite not set for new widgets created via context menu if(!$context['favorite'] && !($context['width'] || $context['height'])) { // Set initial size to 6x3, default is way too small $context['width'] = max($context['width'], 6); $context['height'] = max($context['height'], 3); $need_reload = true; } // Load and copy favorite if($context['appname']) { $favorites = Framework\Favorites::get_favorites($context['appname']); } $this->favorite = is_array($context['favorite']) ? $context['favorite'] : (array)$favorites[$context['favorite'] ?: 'blank']; $this->title = lang($context['appname']) . ': ' . $this->favorite['name']; $this->context = $context; if($this->favorite) { $this->nm_settings['favorite'] = $this->context['favorite']; if(is_string($context['favorite']) && is_array($favorites[$context['favorite']]['state'])) { $this->nm_settings += $this->favorite['state']; } } $this->nm_settings['columnselection_pref'] = "nextmatch-home.{$this->context['id']}"; Api\Translation::add_app($context['appname']); } public function exec($id = null, Etemplate &$etemplate = null) { if($etemplate == null) { $etemplate = new Etemplate(); } $etemplate->read('home.favorite'); $etemplate->set_dom_id($id); $content = $this->context + array('nm' => $this->nm_settings); $content['header_node'] = "home-index_{$id}_header"; unset($content['template']); $sel_options = $content['sel_options'] ? $content['sel_options'] : array(); unset($content['sel_options']); $etemplate->setElementAttribute('nm', 'template',$this->nm_settings['template']); // Always load app's css Framework::includeCSS($this->context['appname'], 'app-'.$GLOBALS['egw_info']['user']['preferences']['common']['theme']) || Framework::includeCSS($this->context['appname'],'app'); // Always load app's javascript, so most actions have a chance of working Framework::includeJS('.','app',$this->context['appname']); // Set this so app's JS gets initialized $old_app = $GLOBALS['egw_info']['flags']['currentapp']; $GLOBALS['egw_info']['flags']['currentapp'] = $this->context['appname']; $etemplate->exec(get_called_class() .'::process',$content,$sel_options); $GLOBALS['egw_info']['flags']['currentapp'] = $old_app; } public static function process($content = array()) { unset($content); // not used, but required by function signature // We need to keep the template going, thanks. Etemplate\Widget::setElementAttribute('', '', ''); } public function get_actions() { return array(); } public function get_type() { return 'et2-portlet-favorite'; } /** * Get a list of "Add" actions * @return array */ public function get_add_actions() { $desc = $this->get_description(); $actions = array(); // Add a list of favorites if($this->context['appname'] && ($favorites = Framework\Favorites::get_favorites($this->context['appname']))) { foreach($favorites as $name => $favorite) { $actions[] = array( 'id' => __CLASS__ . $name, 'caption' => $name, 'onExecute' => 'javaScript:app.home.add' ); } } else { $actions[] = array( 'id' => __CLASS__, 'caption' => lang('List'), 'hint' => $desc['description'], 'onExecute' => 'javaScript:app.home.add', 'acceptedTypes' => $this->accept_drop(), 'allowOnMultiple' => $this->accept_multiple() ); } return $actions; } /** * Some descriptive information about the portlet, so that users can decide if * they want it or not, and for inclusion in lists, hover text, etc. * * These should be already translated, no further Api\Translation will be done. * * @return Array with keys * - displayName: Used in lists * - title: Put in the portlet header * - description: A short description of what this portlet does or displays */ public function get_description() { return array( 'displayName'=> lang('Favorite'), 'title'=> $this->title, 'description'=> lang('Show all the entries using a favorite') ); } /** * Return a list of settings to customize the portlet. * * Settings should be in the same style as for preferences. It is OK to return an empty array * for no customizable settings. * * These should be already translated, no further Api\Translation will be done. * * @see preferences/inc/class.preferences_settings.inc.php * @return Array of settings. Each setting should have the following keys: * - name: Internal reference * - type: Widget type for editing * - label: Human name * - help: Description of the setting, and what it does * - default: Default value, for when it's not set yet */ public function get_properties() { $properties = parent::get_properties(); $favorite = array( 'label' => lang('Favorite'), 'name' => 'favorite', 'type' => 'select', 'select_options' => $favorite_list ); if($this->context['favorite']) { $favorite['type'] = 'select_ro'; } $properties[] = $favorite; $properties[] = array( 'appname' => 'appname' ); return $properties; } }