diff --git a/addressbook/inc/class.addressbook_hooks.inc.php b/addressbook/inc/class.addressbook_hooks.inc.php
index fd0050ea89..c7dbc8d5f3 100644
--- a/addressbook/inc/class.addressbook_hooks.inc.php
+++ b/addressbook/inc/class.addressbook_hooks.inc.php
@@ -72,11 +72,13 @@ class addressbook_hooks
'Site configuration' => Egw::link('/index.php',array(
'menuaction' => 'admin.uiconfig.index',
'appname' => $appname,
+ 'ajax' => 'true',
)),
'Global Categories' => Egw::link('/index.php',array(
'menuaction' => 'admin.admin_categories.index',
'appname' => $appname,
'global_cats'=> True,
+ 'ajax' => 'true',
)),
);
// custom fields are not availible in LDAP
diff --git a/admin/inc/class.admin_ui.inc.php b/admin/inc/class.admin_ui.inc.php
index df3ee62723..3f5ab0bf31 100644
--- a/admin/inc/class.admin_ui.inc.php
+++ b/admin/inc/class.admin_ui.inc.php
@@ -90,7 +90,6 @@ class admin_ui
{
$vars = $_GET;
$vars['menuaction'] = $vars['load'];
- unset($vars['ajax']);
unset($vars['load']);
$content['iframe'] = Egw::link('/index.php', $vars);
}
diff --git a/admin/js/app.js b/admin/js/app.js
index 85becb3fef..5f94ac2c38 100644
--- a/admin/js/app.js
+++ b/admin/js/app.js
@@ -35,6 +35,13 @@ app.classes.admin = AppJS.extend(
*/
nm: null,
+ /**
+ * Refarence to div to hold AJAX loadable pages
+ *
+ * {et2_box}
+ */
+ ajax_target: null,
+
/**
* Reference to ACL edit dialog (not the list)
*/
@@ -82,6 +89,7 @@ app.classes.admin = AppJS.extend(
case 'admin.index':
var iframe = this.iframe = this.et2.getWidgetById('iframe');
this.nm = this.et2.getWidgetById('nm');
+ this.ajax_target = this.et2.getWidgetById('ajax_target');
if (iframe)
{
var self = this;
@@ -130,9 +138,35 @@ app.classes.admin = AppJS.extend(
window.open(_url, '_blank');
return;
}
+ var ajax = false;
if (_url)
{
- this.iframe.set_src(_url);
+ // Try to load it without the iframe
+ ajax = _url.match(/ajax=true/);
+ if(ajax)
+ {
+
+ if(this.ajax_target.node.children.length)
+ {
+ // Node has children already? Check for loading over an
+ // existing etemplate, and remove it first
+ jQuery(this.ajax_target.node.children).each(function() {
+ var old = etemplate2.getById(this.id);
+ if(old) old.clear();
+ });
+ jQuery(this.ajax_target.node).empty();
+ }
+ this.egw.json(
+ framework.activeApp.getMenuaction('ajax_exec'),
+ // It's important that the context is null, or etemplate2
+ // won't load the template properly
+ [_url], this._ajax_load_callback,null, true, this
+ ).sendRequest();
+ }
+ else
+ {
+ this.iframe.set_src(_url);
+ }
}
else
{
@@ -140,8 +174,9 @@ app.classes.admin = AppJS.extend(
// blank iframe, to not keep something running there
this.iframe.getDOMNode().contentDocument.location.href = 'about:blank';
}
- this.iframe.set_disabled(!_url);
- this.nm.set_disabled(!!_url);
+ this.iframe.set_disabled(!_url || ajax);
+ this.nm.set_disabled(!!_url || ajax);
+ this.ajax_target.set_disabled(!ajax);
},
/**
@@ -263,6 +298,19 @@ app.classes.admin = AppJS.extend(
this.load(url);
},
+ /**
+ * Callback to load an etemplate
+ *
+ * @param {Object[]} _data
+ */
+ _ajax_load_callback: function(_data)
+ {
+ if(!_data || _data.type != undefined) return;
+
+ // Insert the content, etemplate will load into it
+ jQuery(this.ajax_target.node).append(_data[0]);
+ },
+
/**
* Link hander for jDots template to just reload our iframe, instead of reloading whole admin app
*
@@ -276,7 +324,7 @@ app.classes.admin = AppJS.extend(
{
if (matches)
{
- _url = _url.replace(/menuaction=admin.admin_ui.index/, 'menuaction='+matches[1]).replace(/&(ajax=true|load=[^&]+)/g, '');
+ _url = _url.replace(/menuaction=admin.admin_ui.index/, 'menuaction='+matches[1]).replace(/&(load=[^&]+)/g, '');
}
this.load(_url);
return true;
diff --git a/admin/templates/default/index.xet b/admin/templates/default/index.xet
index 6e72f7101b..0c75086076 100644
--- a/admin/templates/default/index.xet
+++ b/admin/templates/default/index.xet
@@ -50,5 +50,6 @@
+
-
+
\ No newline at end of file
diff --git a/api/lang/egw_de.lang b/api/lang/egw_de.lang
index 0972185015..7e23143f5a 100644
--- a/api/lang/egw_de.lang
+++ b/api/lang/egw_de.lang
@@ -396,7 +396,7 @@ displayed in the top line of the groupbox (legend) common de wird oben in der Um
distribution lists as groups groupdav de Verteilerlisten als Gruppen
djibouti common de DSCHIBUTI
do not notify common de Nicht benachrichtigen
-do not notify of these changes common de Keine Benachrichtigung
+do not notify of these changes common de Es werden keine Benachrichtigungen beim Anlegen oder Ändern versendet.
do you also want to delete all subcategories ? common de Sollen alle Unterkategorien gelöscht werden ?
do you want to save the changes you made in table %s? common de Wollen Sie die Änderungen in der Tabelle '%s' speichern?
do you want to send the message to all selected entries, without further editing? common de Wollen Sie die Nachricht an alle ausgewählten Einträge OHNE weitere Bearbeitung versenden?
diff --git a/api/lang/egw_en.lang b/api/lang/egw_en.lang
index a701c226ea..afdc2e820e 100644
--- a/api/lang/egw_en.lang
+++ b/api/lang/egw_en.lang
@@ -396,7 +396,7 @@ displayed in the top line of the groupbox (legend) common en Displayed in the to
distribution lists as groups groupdav en Distribution lists as groups
djibouti common en DJIBOUTI
do not notify common en Do not notify
-do not notify of these changes common en Do not notify of these changes
+do not notify of these changes common en Do not send notifications when creating or changing
do you also want to delete all subcategories ? common en Do you also want to delete all sub categories?
do you want to save the changes you made in table %s? common en Do you want to save the changes you made in table %s?
do you want to send the message to all selected entries, without further editing? common en Do you want to send the message to all selected entries, WITHOUT further editing?
diff --git a/calendar/lang/egw_de.lang b/calendar/lang/egw_de.lang
index ba46fea30f..5b840f2ff9 100644
--- a/calendar/lang/egw_de.lang
+++ b/calendar/lang/egw_de.lang
@@ -317,6 +317,7 @@ location, start- and endtimes, ... calendar de Ort, Start- und Endzeiten
mail all participants calendar de Mail an alle Teilnehmer
make freebusy information available to not loged in persons? calendar de Die freien/nicht verfügbaren Zeiten für nicht angemeldete Personen sichtbar machen?
manage mapping calendar de Feldzuordnungen verwalten
+mark event as private to hide title and description calendar de Kennzeichnet Termin als privat und unterdrückt Sichtbarkeit von Titel und Beschreibung
max. number of entries to show (leave empty for no restriction) calendar de Max. Anzahl von Einträgen die angezeigt werden sollen (Kein Eintrag = Keine Beschränkung)
maximum available quantity of %1 exceeded! calendar de Maximale Anzahl von %1 erreicht!
meeting canceled calendar de Termin abgesagt
diff --git a/calendar/lang/egw_en.lang b/calendar/lang/egw_en.lang
index 6819ac5bc6..13d7f77f8a 100644
--- a/calendar/lang/egw_en.lang
+++ b/calendar/lang/egw_en.lang
@@ -317,6 +317,7 @@ location, start- and endtimes, ... calendar en Location, start and end times, ..
mail all participants calendar en Mail all participants
make freebusy information available to not loged in persons? calendar en Make Free/Busy information available to not logged in persons
manage mapping calendar en Manage mapping
+mark event as private to hide title and description calendar en Mark event as private to hide title and description
max. number of entries to show (leave empty for no restriction) calendar en Max. number of entries to show. Leave empty for no restriction.
maximum available quantity of %1 exceeded! calendar en Maximum available quantity of %1 exceeded!
meeting canceled calendar en Meeting canceled
diff --git a/calendar/templates/default/edit.xet b/calendar/templates/default/edit.xet
index acffc86ea5..d8622cfb17 100644
--- a/calendar/templates/default/edit.xet
+++ b/calendar/templates/default/edit.xet
@@ -210,15 +210,15 @@
-
+
diff --git a/pixelegg/css/mobile.css b/pixelegg/css/mobile.css
index aaa604aa2b..8aad5b1192 100644
--- a/pixelegg/css/mobile.css
+++ b/pixelegg/css/mobile.css
@@ -1436,10 +1436,10 @@ div#ui-datepicker-div {
.ui-datepicker div.ui-timepicker-div dt.ui_tpicker_minute_label {
font-size: 0.9em;
}
-.ui-datepicker div.ui-timepicker-div div.ui_tpicker_hour_slider a.ui-slider-handle {
+.ui-datepicker div.ui-timepicker-div div.ui_tpicker_hour_slider span.ui-slider-handle {
background-color: #0C5DA5;
}
-.ui-datepicker div.ui-timepicker-div div.ui_tpicker_minute_slider a.ui-slider-handle {
+.ui-datepicker div.ui-timepicker-div div.ui_tpicker_minute_slider span.ui-slider-handle {
background-color: #0C5DA5;
}
.ui-datepicker div.ui-datepicker-buttonpane {
diff --git a/pixelegg/css/pixelegg.css b/pixelegg/css/pixelegg.css
index f3f3d8999c..9d22095b44 100644
--- a/pixelegg/css/pixelegg.css
+++ b/pixelegg/css/pixelegg.css
@@ -1425,10 +1425,10 @@ div#ui-datepicker-div {
.ui-datepicker div.ui-timepicker-div dt.ui_tpicker_minute_label {
font-size: 0.9em;
}
-.ui-datepicker div.ui-timepicker-div div.ui_tpicker_hour_slider a.ui-slider-handle {
+.ui-datepicker div.ui-timepicker-div div.ui_tpicker_hour_slider span.ui-slider-handle {
background-color: #0C5DA5;
}
-.ui-datepicker div.ui-timepicker-div div.ui_tpicker_minute_slider a.ui-slider-handle {
+.ui-datepicker div.ui-timepicker-div div.ui_tpicker_minute_slider span.ui-slider-handle {
background-color: #0C5DA5;
}
.ui-datepicker div.ui-datepicker-buttonpane {
diff --git a/pixelegg/less/jquery-ui.less b/pixelegg/less/jquery-ui.less
index a91087a890..ceb6557194 100755
--- a/pixelegg/less/jquery-ui.less
+++ b/pixelegg/less/jquery-ui.less
@@ -349,10 +349,10 @@ span.ui-icon-search {
// Schieberegler
div.ui_tpicker_hour_slider {
- a.ui-slider-handle {background-color: @egw_color_2_a;}
+ span.ui-slider-handle {background-color: @egw_color_2_a;}
}
div.ui_tpicker_minute_slider {
- a.ui-slider-handle {background-color: @egw_color_2_a;}
+ span.ui-slider-handle {background-color: @egw_color_2_a;}
}
}
diff --git a/pixelegg/mobile/fw_mobile.css b/pixelegg/mobile/fw_mobile.css
index a19e192715..49399a099f 100644
--- a/pixelegg/mobile/fw_mobile.css
+++ b/pixelegg/mobile/fw_mobile.css
@@ -1447,10 +1447,10 @@ div#ui-datepicker-div {
.ui-datepicker div.ui-timepicker-div dt.ui_tpicker_minute_label {
font-size: 0.9em;
}
-.ui-datepicker div.ui-timepicker-div div.ui_tpicker_hour_slider a.ui-slider-handle {
+.ui-datepicker div.ui-timepicker-div div.ui_tpicker_hour_slider span.ui-slider-handle {
background-color: #0C5DA5;
}
-.ui-datepicker div.ui-timepicker-div div.ui_tpicker_minute_slider a.ui-slider-handle {
+.ui-datepicker div.ui-timepicker-div div.ui_tpicker_minute_slider span.ui-slider-handle {
background-color: #0C5DA5;
}
.ui-datepicker div.ui-datepicker-buttonpane {
diff --git a/resources/inc/class.resources_bo.inc.php b/resources/inc/class.resources_bo.inc.php
index 2d044dd5e7..83169666f8 100755
--- a/resources/inc/class.resources_bo.inc.php
+++ b/resources/inc/class.resources_bo.inc.php
@@ -391,14 +391,16 @@ class resources_bo
Link::unlink(0,'resources',$resource['res_id'],'','resources',$old['accessory_of']);
// Check for resource changing to accessory - move its accessories to resource
- if($old['accessory_of'] == -1 && $accessories = $this->get_acc_list($resource['res_id']))
+ if($old['accessory_of'] == -1 && ($accessories = $this->get_acc_list($resource['res_id'])))
{
foreach($accessories as $accessory => $name)
{
Link::unlink(0,'resources',$accessory,'','resources',$resource['res_id']);
- $acc = $this->read($accessory);
- $acc['accessory_of'] = -1;
- $this->so->save($acc);
+ if (($acc = $this->read($accessory)))
+ {
+ $acc['accessory_of'] = -1;
+ $this->so->save($acc);
+ }
}
}
}
@@ -412,10 +414,12 @@ class resources_bo
$accessories = $this->get_acc_list($resource['res_id']);
foreach($accessories as $accessory => $name)
{
- $acc = $this->so->read($accessory);
- $acc['cat_id'] = $resource['cat_id'];
- $this->so->data = $acc;
- $this->so->save();
+ if (($acc = $this->so->read($accessory)))
+ {
+ $acc['cat_id'] = $resource['cat_id'];
+ $this->so->data = $acc;
+ $this->so->save();
+ }
}
}
@@ -439,6 +443,7 @@ class resources_bo
*
* @author Lukas Weiss
* @param int $res_id id of resource
+ * @return string|false string with error or false on success
*/
function delete($res_id)
{
@@ -448,9 +453,12 @@ class resources_bo
}
// check if we only mark resources as deleted, or really delete them
- $old = $this->read($res_id);
$config = Api\Config::read('resources');
- if ($config['history'] != '' && $old['deleted'] == null)
+ if (!($old = $this->read($res_id)))
+ {
+ // error is returned at end of function
+ }
+ elseif ($config['history'] != '' && $old['deleted'] == null)
{
$old['deleted'] = time();
$this->save($old);
@@ -459,8 +467,7 @@ class resources_bo
foreach($accessories as $acc_id => $name)
{
// Don't purge already deleted accessories
- $acc = $this->read($acc_id);
- if(!$acc['deleted'])
+ if (($acc = $this->read($acc_id)) && !$acc['deleted'])
{
$acc['deleted'] = time();
$this->save($acc);
@@ -474,9 +481,8 @@ class resources_bo
$accessories = $this->get_acc_list($res_id, true);
foreach($accessories as $acc_id => $name)
{
- if($this->delete($acc_id))
+ if($this->delete($acc_id) && ($acc = $this->read($acc_id)))
{
- $acc = $this->read($acc_id);
$acc['accessory_of'] = -1;
$this->save($acc);
}
@@ -675,7 +681,7 @@ class resources_bo
// now decrement this quantity useable
$quantity = 1;
$this->bocal->so->split_status($part_detail,$quantity);
-
+
$res_info_cache[$resource_id]['useable']-=$quantity;
}
}
diff --git a/resources/inc/class.resources_hooks.inc.php b/resources/inc/class.resources_hooks.inc.php
index b5c22fb212..57f41d360d 100644
--- a/resources/inc/class.resources_hooks.inc.php
+++ b/resources/inc/class.resources_hooks.inc.php
@@ -57,7 +57,9 @@ class resources_hooks
'Global Categories' => Egw::link('/index.php',array(
'menuaction' => 'admin.admin_categories.index',
'appname' => $appname,
- 'global_cats'=> true)),
+ 'global_cats'=> true,
+ 'ajax' => 'true'
+ )),
'Configure Access Permissions' => Egw::link('/index.php',
'menuaction=resources.resources_acl_ui.index&ajax=true'),
'Custom Fields'=>egw::link('/index.php',
diff --git a/timesheet/inc/class.timesheet_egw_record.inc.php b/timesheet/inc/class.timesheet_egw_record.inc.php
index 4def600c22..e27a5528c0 100644
--- a/timesheet/inc/class.timesheet_egw_record.inc.php
+++ b/timesheet/inc/class.timesheet_egw_record.inc.php
@@ -44,10 +44,13 @@ class timesheet_egw_record implements importexport_iface_egw_record
public function __construct( $_identifier='' ){
$this->identifier = $_identifier;
$this->botimesheet = new timesheet_bo();
- $data = $this->botimesheet->read($this->identifier);
- // set ts_project from ts_project_blur, where it get moved, if it is no custom value
- if (empty($data['ts_project'])) $data['ts_project'] = $data['ts_project_blur'];
- $this->set_record($data);
+
+ if (($data = $this->botimesheet->read($this->identifier)))
+ {
+ // set ts_project from ts_project_blur, where it get moved, if it is no custom value
+ if (empty($data['ts_project'])) $data['ts_project'] = $data['ts_project_blur'];
+ $this->set_record($data);
+ }
}
/**
diff --git a/timesheet/inc/class.timesheet_ui.inc.php b/timesheet/inc/class.timesheet_ui.inc.php
index e3509ede8c..c7a3d34cd0 100644
--- a/timesheet/inc/class.timesheet_ui.inc.php
+++ b/timesheet/inc/class.timesheet_ui.inc.php
@@ -1133,9 +1133,9 @@ class timesheet_ui extends timesheet_bo
$cat_name = Api\Categories::id2name($settings);
$action_msg = lang('changed category to %1', $cat_name);
foreach((array)$checked as $n => $id) {
- $entry = $this->read($id);
- $entry['cat_id'] = $settings;
- if($this->save($entry) == 0)
+ if (($entry = $this->read($id)) &&
+ ($entry['cat_id'] = $settings) &&
+ $this->save($entry) == 0)
{
$success++;
}