Home progress:

- Fix changing position
- Added a quick HTML note-to-self portlet
This commit is contained in:
Nathan Gray 2014-11-12 21:33:42 +00:00
parent e923931fda
commit 57d802eeb5
5 changed files with 229 additions and 4 deletions

View File

@ -134,7 +134,7 @@ class home_favorite_portlet extends home_portlet
return array( return array(
'displayName'=> lang('Favorite'), 'displayName'=> lang('Favorite'),
'title'=> $this->title, 'title'=> $this->title,
'description'=> lang('Show the entries from a favorite') 'description'=> lang('Show all the entries using a favorite')
); );
} }
/** /**

View File

@ -0,0 +1,166 @@
<?php
/*
* Egroupware
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package home
* @subpackage portlet
* @link http://www.egroupware.org
* @author Nathan Gray
* @version $Id$
*/
/**
* A simple HTML note-to-self
*
* The implementation is a little more complicated because CKEditor needs some
* CSP exceptions, but the headers will always be already sent. This means we
* need a popup window instead of edit in place or a dialog.
*/
class home_note_portlet extends home_portlet
{
// Allow access to edit from client
public $public_functions = array(
'edit' => true
);
/**
* Context for this portlet
*/
public function __construct(Array &$context = array(), &$need_reload = false)
{
// Title not set for new widgets created via context menu
if(!$context['title'])
{
// Set initial size to 3x2, default is too small
$context['width'] = 3;
$context['height'] = 2;
$need_reload = true;
}
$this->context = $context;
}
/**
* Edit the note in a popup to accommodate CKEditor's CSP
* @param type $content
*/
public function edit($content = array())
{
$id = $_GET['id'] ? $_GET['id'] : $content['id'];
$height = $_GET['height'] ? $_GET['height'] : $content['height'];
$prefs = $GLOBALS['egw']->preferences->read_repository();
$portlets = (array)$prefs['home']['portlets'];
if($content['button'])
{
$portlets[$id]['note'] = $content['note'];
// Save updated preferences
$GLOBALS['egw']->preferences->add('home', 'portlets', $portlets);
$GLOBALS['egw']->preferences->save_repository(True);
// Yay for AJAX submit
egw_json_response::get()->apply('window.opener.app.home.refresh',array($id));
if(key($content['button'])=='save')
{
egw_json_response::get()->apply('window.close',array());
}
}
$etemplate = new etemplate_new('home.note');
$content = array(
'note' => $portlets[$id]['note']
);
$etemplate->setElementAttribute('note', 'width', '99%');
$etemplate->setElementAttribute('note', 'height', $height);
$preserve = array(
'id' => $id,
'height' => $height,
);
$etemplate->exec('home.home_note_portlet.edit',$content, array(),array('note'=>false,'save'=>false), $preserve);
}
public function exec($id = null, etemplate_new &$etemplate = null)
{
// Allow to submit directly back here
if(is_array($id) && $id['id'])
{
$id = $id['id'];
}
if($etemplate == null)
{
$etemplate = new etemplate_new();
}
$etemplate->read('home.note');
$etemplate->set_dom_id($id);
$content = $this->context;
if(!$content['note'])
{
$content['note'] = '';
}
$etemplate->exec('home.home_note_portlet.exec',$content,array(),array('__ALL__'=>true),array('id' =>$id));
}
public function get_actions()
{
$actions = array(
'edit' => array(
'icon' => 'edit',
'caption' => lang('edit'),
'hideOnDisabled' => false,
'onExecute' => 'javaScript:app.home.note_edit',
'default' => true
),
'edit_settings' => array(
'default' => false
)
);
return $actions;
}
/**
* 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 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();
$properties[] = array(
'name' => 'title',
'type' => 'textbox',
'label' => lang('Title'),
);
// Internal - no type means it won't show in configure dialog
$properties[] = array(
'name' => 'note'
);
return $properties;
}
public function get_description()
{
return array(
'displayName'=> lang('Note'),
'title'=> $this->context['title'],
'description'=> lang('A quick note')
);
}
}

View File

@ -391,6 +391,11 @@ class home_ui
{ {
$prefs = $GLOBALS['egw']->preferences->read_repository(); $prefs = $GLOBALS['egw']->preferences->read_repository();
$portlets = (array)$prefs['home']['portlets']; $portlets = (array)$prefs['home']['portlets'];
if($values =='~reload~')
{
$full_exec = true;
$values = array();
}
if($values == '~remove~') if($values == '~remove~')
{ {
unset($portlets[$portlet_id]); unset($portlets[$portlet_id]);
@ -408,8 +413,7 @@ class home_ui
$add = true; $add = true;
$classname = substr($classname, 4); $classname = substr($classname, 4);
} }
$full_exec = false; $portlet = $this->get_portlet($portlet_id, $context, $content, $attributes, $full_exec);
$portlet = $this->get_portlet($portlet_id, $context, $content, $attributes);
$context['class'] = get_class($portlet); $context['class'] = get_class($portlet);
foreach($portlet->get_properties() as $property) foreach($portlet->get_properties() as $property)

View File

@ -249,6 +249,19 @@ app.classes.home = AppJS.extend(
); );
}, },
/**
* Allow a refresh from anywhere by triggering an update with no changes
*
* @param {string} id
*/
refresh: function($id) {
var p = this.portlet_container.getWidgetById($id);
if(p)
{
p._process_edit(et2_dialog.OK_BUTTON, '~reload~');
}
},
/** /**
* For link_portlet - opens the configured record when the user * For link_portlet - opens the configured record when the user
* double-clicks or chooses view from the context menu * double-clicks or chooses view from the context menu
@ -308,7 +321,7 @@ app.classes.home = AppJS.extend(
*/ */
serialize_params: function($w, grid) { serialize_params: function($w, grid) {
return { return {
id: $w.children('.ui-widget-header').next().attr('id'), id: $w.attr('id').replace(app.home.portlet_container.getInstanceManager().uniqueId+'_',''),
row: grid.row, row: grid.row,
col: grid.col, col: grid.col,
width: grid.size_x, width: grid.size_x,
@ -481,5 +494,36 @@ app.classes.home = AppJS.extend(
portlet.options.settings.list.splice(row.index(), 1); portlet.options.settings.list.splice(row.index(), 1);
portlet._process_edit(et2_dialog.OK_BUTTON,{list: portlet.options.settings.list || {}}); portlet._process_edit(et2_dialog.OK_BUTTON,{list: portlet.options.settings.list || {}});
} }
},
/**
* Functions for the note portlet
*/
/**
* Set up for editing a note
* CKEditor has CSP issues, so we need a popup
*
* @param {egwAction} action
* @param {egwActionObject[]} Selected
*/
note_edit: function(action, selected) {
var id = selected[0].id;
// Aim to match the size
var portlet_dom = $j('[id$='+id+'][data-sizex]',this.portlet_container.getDOMNode);
var width = portlet_dom.attr('data-sizex') * this.GRID;
var height = portlet_dom.attr('data-sizey') * this.GRID;
// CKEditor is impossible to use below a certain size
// Add 35px for the toolbar, 35px for the buttons
var window_width = Math.max(580, width+20);
var window_height = Math.max(350, height+70);
// Open popup, but add 30 to the height for the toolbar
egw.open_link(egw.link('/index.php',{
menuaction: 'home.home_note_portlet.edit',
id: selected[0].id,
height: window_height - 70
}),action.id+selected[0].id, window_width+'x'+window_height,'home');
} }
}); });

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<overlay>
<template id="home.note" template="" lang="" group="0" version="1.9.001">
<htmlarea id="note"/>
<hbox id="button">
<button statustext="Saves this entry" label="Save" id="save" image="save" background_image="1"/>
<button statustext="Apply the changes" label="Apply" id="apply" image="apply" background_image="1"/>
<button statustext="leave without saveing the entry" label="Cancel" id="cancel" onclick="window.close();" image="cancel" background_image="1"/>
</hbox>
</template>
</overlay>