forked from extern/egroupware
Home progress:
- Fix changing position - Added a quick HTML note-to-self portlet
This commit is contained in:
parent
e923931fda
commit
57d802eeb5
@ -134,7 +134,7 @@ class home_favorite_portlet extends home_portlet
|
||||
return array(
|
||||
'displayName'=> lang('Favorite'),
|
||||
'title'=> $this->title,
|
||||
'description'=> lang('Show the entries from a favorite')
|
||||
'description'=> lang('Show all the entries using a favorite')
|
||||
);
|
||||
}
|
||||
/**
|
||||
|
166
home/inc/class.home_note_portlet.inc.php
Normal file
166
home/inc/class.home_note_portlet.inc.php
Normal 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')
|
||||
);
|
||||
}
|
||||
}
|
@ -391,6 +391,11 @@ class home_ui
|
||||
{
|
||||
$prefs = $GLOBALS['egw']->preferences->read_repository();
|
||||
$portlets = (array)$prefs['home']['portlets'];
|
||||
if($values =='~reload~')
|
||||
{
|
||||
$full_exec = true;
|
||||
$values = array();
|
||||
}
|
||||
if($values == '~remove~')
|
||||
{
|
||||
unset($portlets[$portlet_id]);
|
||||
@ -408,8 +413,7 @@ class home_ui
|
||||
$add = true;
|
||||
$classname = substr($classname, 4);
|
||||
}
|
||||
$full_exec = false;
|
||||
$portlet = $this->get_portlet($portlet_id, $context, $content, $attributes);
|
||||
$portlet = $this->get_portlet($portlet_id, $context, $content, $attributes, $full_exec);
|
||||
|
||||
$context['class'] = get_class($portlet);
|
||||
foreach($portlet->get_properties() as $property)
|
||||
|
@ -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
|
||||
* double-clicks or chooses view from the context menu
|
||||
@ -308,7 +321,7 @@ app.classes.home = AppJS.extend(
|
||||
*/
|
||||
serialize_params: function($w, grid) {
|
||||
return {
|
||||
id: $w.children('.ui-widget-header').next().attr('id'),
|
||||
id: $w.attr('id').replace(app.home.portlet_container.getInstanceManager().uniqueId+'_',''),
|
||||
row: grid.row,
|
||||
col: grid.col,
|
||||
width: grid.size_x,
|
||||
@ -481,5 +494,36 @@ app.classes.home = AppJS.extend(
|
||||
portlet.options.settings.list.splice(row.index(), 1);
|
||||
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');
|
||||
}
|
||||
});
|
||||
|
11
home/templates/default/note.xet
Normal file
11
home/templates/default/note.xet
Normal 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>
|
Loading…
Reference in New Issue
Block a user