* Calendar/Alarm: Move calendar Alarm from Alarm tab to Details tab and make it more user friendly to add alarm

This commit is contained in:
Hadi Nategh 2014-05-27 15:02:56 +00:00
parent eaccfdfe1d
commit 706c69ed90
6 changed files with 130 additions and 102 deletions

View File

@ -201,7 +201,7 @@ class calendar_uiforms extends calendar_ui
$exception['recurrence'] != $content['recur_exception'][$key]) continue;
$exception['uid'] = common::generate_uid('calendar', $id);
$exception['reference'] = $exception['recurrence'] = 0;
$this->bo->update($exception, true, true,false,true,$message,$content['no_notifications']);
$this->bo->update($exception, true, true,false,true,$messages,$content['no_notifications']);
break;
}
unset($content['recur_exception'][$key]);
@ -281,6 +281,7 @@ class calendar_uiforms extends calendar_ui
case 'add':
// email or rfc822 addresse (eg. "Ralf Becker <ralf@domain.com>") in the search field
// ToDo: get eTemplate to return that field
$matches = array();
if (($email = $_POST['exec']['participants']['resource']['query']) &&
(preg_match('/^(.*<)?([a-z0-9_.-]+@[a-z0-9_.-]{5,})>?$/i',$email,$matches)))
{
@ -322,7 +323,10 @@ class calendar_uiforms extends calendar_ui
{
list($app,$id) = explode(':',$data);
}
foreach($this->bo->resources as $type => $data) if ($data['app'] == $app) break;
foreach($this->bo->resources as $type => $data)
{
if ($data['app'] == $app) break;
}
$uid = $this->bo->resources[$type]['app'] == $app ? $type.$id : false;
if ($app == 'home-accounts')
{
@ -886,8 +890,8 @@ class calendar_uiforms extends calendar_ui
case 'add_alarm':
$time = ($content['actual_date'] ? $content['actual_date'] : $content['start']);
$offset = DAY_s * $content['new_alarm']['days'] + HOUR_s * $content['new_alarm']['hours'] + 60 * $content['new_alarm']['mins'];
if($content['before_after']) $offset *= -1;
$offset = $time - $content['new_alarm']['date'];
if ($event['recur_type'] != MCAL_RECUR_NONE &&
($next_occurrence = $this->bo->read($event['id'], $this->bo->now_su + $offset, true)) &&
$time < $next_occurrence['start'])
@ -898,7 +902,7 @@ class calendar_uiforms extends calendar_ui
{
$alarm = array(
'offset' => $offset,
'time' => $time - $offset,
'time' => $content['new_alarm']['date'],
'all' => !$content['new_alarm']['owner'],
'owner' => $content['new_alarm']['owner'] ? $content['new_alarm']['owner'] : $this->user,
);
@ -1105,14 +1109,14 @@ class calendar_uiforms extends calendar_ui
/**
* Edit a calendar event
*
* @param array $event=null Event to edit, if not $_GET['cal_id'] contains the event-id
* @param array $perserv=null following keys:
* @param array $event Event to edit, if not $_GET['cal_id'] contains the event-id
* @param array $preserv following keys:
* view boolean view-mode, if no edit-access we automatic fallback to view-mode
* hide_delete boolean hide delete button
* no_popup boolean use a popup or not
* edit_single int timestamp of single event edited, unset/null otherwise
* @param string $msg='' msg to display
* @param mixed $link_to_id='' $content from or for the link-widget
* @param string $msg msg to display
* @param mixed $li$link_to_idontent from or for the link-widget
*/
function edit($event=null,$preserv=null,$msg='',$link_to_id='')
{
@ -1121,6 +1125,8 @@ class calendar_uiforms extends calendar_ui
'status' => $this->bo->verbose_status,
'duration' => $this->durations,
'role' => $this->bo->roles,
'new_alarm[options]' =>array(300 => lang('5 Minutes'), 600 => lang('10 Minutes'), 900 => lang('15 Minutes'), 1800 => lang('30 Minutes'), 3600 => lang('1 Hour'), 7200 => lang('2 Hours'),
43200 => lang('12 Hours'), 86400 => lang('1 Day'), 172800 => lang('2 Days'), 604800 => lang('1 Week'), 0 => lang('Custom')),
'before_after'=>array(0 => lang('Before'), 1 => lang('After')),
'action' => array(
'copy' => array('label' => 'Copy', 'title' => 'Copy this event'),
@ -1445,14 +1451,9 @@ class calendar_uiforms extends calendar_ui
}
else
{
// hide the alarm tab for newly created exceptions
$readonlys['tabs']['alarms'] = true;
// disable the alarm tab functionality
$readonlys['button[add_alarm]'] = true;
$readonlys['new_alarm[days]'] = true;
$readonlys['new_alarm[hours]'] = true;
$readonlys['new_alarm[mins]'] = true;
$readonlys['new_alarm[options]'] = true;
$readonlys['new_alarm[owner]'] = true;
}
if (count($content['alarm']) == 1)
@ -1471,7 +1472,7 @@ class calendar_uiforms extends calendar_ui
$readonlys['__ALL__'] = true; // making everything readonly, but widgets set explicitly to false
$readonlys['alarm'] = $readonlys['button[cancel]'] = $readonlys['action'] =
$readonlys['before_after'] = $readonlys['button[add_alarm]'] = $readonlys['new_alarm[owner]'] =
$readonlys['new_alarm[days]'] = $readonlys['new_alarm[hours]'] = $readonlys['new_alarm[mins]'] = false;
$readonlys['new_alarm[options]'] = false;
$content['participants']['no_add'] = true;
@ -2143,8 +2144,8 @@ class calendar_uiforms extends calendar_ui
/**
* Export events as vCalendar version 2.0 files (iCal)
*
* @param int|array $content=0 numeric cal_id or submitted content from etempalte::exec
* @param boolean $return_error=false should an error-msg be returned or a regular page with it generated (default)
* @param int|array $content numeric cal_id or submitted content from etempalte::exec
* @param boolean $return_error should an error-msg be returned or a regular page with it generated (default)
* @return string error-msg if $return_error
*/
function export($content=0,$return_error=false)
@ -2209,7 +2210,7 @@ class calendar_uiforms extends calendar_ui
/**
* Import events as vCalendar version 2.0 files (iCal)
*
* @param array $content=null submitted content from etempalte::exec
* @param array $content submitted content from etempalte::exec
*/
function import($content=null)
{
@ -2250,7 +2251,7 @@ class calendar_uiforms extends calendar_ui
/**
* Edit category ACL (admin only)
*
* @param array $content=null
* @param array $content
*/
function cat_acl(array $content=null)
{
@ -2377,7 +2378,7 @@ class calendar_uiforms extends calendar_ui
/**
* moves an event to another date/time
*
* @param string $eventID id of the event which has to be moved
* @param string $eventId id of the event which has to be moved
* @param string $calendarOwner the owner of the calendar the event is in
* @param string $targetDateTime the datetime where the event should be moved to, format: YYYYMMDD
* @param string $targetOwner the owner of the target calendar

View File

@ -111,6 +111,7 @@ app.classes.calendar = AppJS.extend(
, [content.data['id'],content.data['lock_token']],null,true,null,null).sendRequest(true);
};
}
this.alarm_custom_date();
break;
case 'calendar.freetimesearch':
@ -1163,5 +1164,37 @@ app.classes.calendar = AppJS.extend(
// Stop the normal bubbling if this is called on click
return false;
},
/**
* Enable/Disable custom Date-time for set Alarm
*
* @param {egw object} _egw
* @param {widget object} _widget new_alarm[options] selectbox
*/
alarm_custom_date: function (_egw,_widget)
{
var alarm_date = this.et2.getWidgetById('new_alarm[date]');
var alarm_options = _widget || this.et2.getWidgetById('new_alarm[options]');
var start = this.et2.getWidgetById('start');
var date = 0;
if (alarm_date && alarm_options
&& start)
{
if (alarm_options.get_value() != '0')
{
alarm_date.set_class('calendar_alarm_date_display');
}
else
{
alarm_date.set_class('');
}
var startDate = start.get_value();
if (startDate)
{
date = startDate - parseInt(alarm_options.get_value());
alarm_date.set_value(date);
}
}
}
});

View File

@ -222,7 +222,11 @@ e.g. the div with class calendar_calTimeGrid is generated by the timeGridWidget
.calendar_calViewUserNameFirst:after {
content: ", ";
}
/* alarm_date widget disabled class
*/
.calendar_alarm_date_display {
display: none;
}
/* header of the time-grid, eg. for the weeks in the month-view (leftmost of the day-col-headers)
*/
.calendar_calGridHeader{

View File

@ -3,9 +3,9 @@
<overlay>
<template id="calendar.edit.details" template="" lang="" group="0" version="1.9.001">
<hbox options="0,0">
<grid height="250" width="500">
<grid height="250" width="445">
<columns>
<column width="85"/>
<column width="80px"/>
<column/>
</columns>
<rows>
@ -21,16 +21,71 @@
</row>
<row>
<description value="Options"/>
<checkbox statustext="A non blocking event will not conflict with other events" label="non blocking" id="non_blocking" options="1,0, ,disable"/>
<hbox>
<checkbox statustext="A non blocking event will not conflict with other events" label="non blocking" id="non_blocking" options="1,0, ,disable"/>
<checkbox label="Private" id="public" options="0,1"/>
</hbox>
</row>
<row>
<description/>
<checkbox label="Private" id="public" options="0,1"/>
<grid width="445" height="250">
<columns>
<column width="80px" height="30px"/>
<column/>
</columns>
<rows>
<row class="th" disabled="@view" height="28">
<description value="Add new alarm" span="all"/>
</row>
<row class="row add_alarm_action" height="50" disabled="@no_add_alarm">
<hbox span="all">
<description value="Set at"/>
<menulist>
<menupopup type="select-number" statustext="" id="new_alarm[options]" onchange="app.calendar.alarm_custom_date"/>
</menulist>
<date-time id="new_alarm[date]" class="calendar_alarm_date_display"/>
<menulist>
<menupopup statustext="Select who should get the alarm" label="for" id="new_alarm[owner]" no_lang="1"/>
</menulist>
<button label="Add" id="button[add_alarm]" image="add" background_image="1"/>
</hbox>
</row>
<row valign="top" disabled="!@alarm">
<grid id="alarm" width="100%" class="egwGridView_grid">
<columns>
<column/>
<column/>
<column/>
<column/>
<column/>
</columns>
<rows>
<row class="th">
<description value="Time"/>
<description value="before the event"/>
<description value="All participants"/>
<description value="Owner"/>
<description value="Action"/>
</row>
<row>
<date-time id="${row}[time]" readonly="true"/>
<description id="${row}[offset]" no_lang="1"/>
<checkbox align="center" id="${row}[all]" readonly="true"/>
<menulist>
<menupopup type="select-account" id="${row}[owner]" readonly="true"/>
</menulist>
<button align="center" statustext="Delete this alarm" label="Delete" id="delete_alarm[$row_cont[id]]" onclick="et2_dialog.confirm(widget,'Delete this alarm','Delete')" image="delete"/>
</row>
</rows>
</grid>
</row>
</rows>
</grid>
</row>
</rows>
</grid>
<vbox align="right" options="0,0" class="calendar_category_details">
<description height="25"/>
<description/>
<description for="category" value="Categories" class="row_on"/>
<listbox type="select-cat" id="category" rows="9" />
</vbox>
@ -186,72 +241,6 @@
</rows>
</grid>
</template>
<template id="calendar.edit.alarms" template="" lang="" group="0" version="1.9.001">
<grid width="100%" height="250" overflow="auto">
<columns>
<column width="120px" height="30px"/>
<column/>
</columns>
<rows>
<row class="th gray" disabled="@view" height="28">
<description value="Add new alarm" span="all"/>
</row>
<row class="row add_alarm_action" height="50" disabled="@no_add_alarm">
<menulist>
<menupopup label="%s the event" id="before_after"/>
</menulist>
<hbox>
<menulist>
<menupopup type="select-number" statustext="days" id="new_alarm[days]" options=",0,7"/>
</menulist>
<description for="new_alarm[days]" value="days"/>
<menulist>
<menupopup type="select-number" statustext="hours" id="new_alarm[hours]" options=",0,23"/>
</menulist>
<description for="new_alarm[hours]" value="hours"/>
<menulist>
<menupopup type="select-number" statustext="Minutes" id="new_alarm[mins]" options=",0,55,5"/>
</menulist>
<description for="new_alarm[mins]" value="Minutes"/>
<menulist>
<menupopup statustext="Select who should get the alarm" label="for" id="new_alarm[owner]" no_lang="1"/>
</menulist>
<button label="Add alarm" id="button[add_alarm]" image="add" background_image="1"/>
</hbox>
</row>
<row valign="top" disabled="!@alarm">
<description value="Alarms"/>
<grid id="alarm">
<columns>
<column/>
<column/>
<column/>
<column/>
<column/>
</columns>
<rows>
<row class="th">
<description value="Time"/>
<description value="before the event"/>
<description value="All participants"/>
<description value="Owner"/>
<description value="Action"/>
</row>
<row>
<date-time id="${row}[time]" readonly="true"/>
<description id="${row}[offset]" no_lang="1"/>
<checkbox align="center" id="${row}[all]" readonly="true"/>
<menulist>
<menupopup type="select-account" id="${row}[owner]" readonly="true"/>
</menulist>
<button align="center" statustext="Delete this alarm" label="Delete" id="delete_alarm[$row_cont[id]]" onclick="et2_dialog.confirm(widget,'Delete this alarm','Delete')" image="delete"/>
</row>
</rows>
</grid>
</row>
</rows>
</grid>
</template>
<template id="calendar.edit.history" template="" lang="" group="0" version="1.7.002">
<grid width="100%" height="250" overflow="auto">
<columns>
@ -319,7 +308,6 @@
<tab id="recurrence" label="Recurrence" statustext="Repeating Event Information"/>
<tab id="custom" label="Custom" statustext="Custom fields"/>
<tab id="links" label="Links" statustext="Links, Attachments"/>
<tab id="alarms" label="Alarms" statustext="Alarm management"/>
<tab id="history" label="History" statustext="Change history"/>
</tabs>
<tabpanels>
@ -329,7 +317,6 @@
<template id="calendar.edit.recurrence"/>
<template id="calendar.edit.custom"/>
<template id="calendar.edit.links"/>
<template id="calendar.edit.alarms"/>
<template id="calendar.edit.history"/>
</tabpanels>
</tabbox>

View File

@ -238,6 +238,11 @@ e.g. the div with class calendar_calTimeGrid is generated by the timeGridWidget
.calendar_calViewUserNameFirst:after {
content: ", ";
}
/* alarm_date widget disabled class
*/
.calendar_alarm_date_display {
display: none;
}
/* header of the time-grid, eg. for the weeks in the month-view (leftmost of the day-col-headers)
*/
.calendar_calGridHeader {
@ -1029,7 +1034,7 @@ div#calendar-edit #calendar-edit_calendar-edit-details {
div#calendar-edit #calendar-edit_calendar-edit-details table.et2_grid {
/*background-color: yellow;*/
line-height: 20px;
width: 60% !important;
width: 60%;
}
div#calendar-edit #calendar-edit_calendar-edit-details .calendar_category_details {
margin: 0 1em;

View File

@ -468,11 +468,9 @@ div#calendar-edit{
table.et2_grid{
/*background-color: yellow;*/
line-height: 20px;
width: 60% !important;
width: 60%;
}
}
// Kategorien