Changeset 5514 for trunk/prototype/modules/calendar
- Timestamp:
- 02/14/12 16:52:04 (12 years ago)
- Location:
- trunk/prototype/modules/calendar
- Files:
-
- 8 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/prototype/modules/calendar/constants.php
r5415 r5514 5 5 define('STATUS_CONFIRMED', 1); 6 6 define('STATUS_ACCEPTED', 1); 7 define('STATUS_TEN ATIVE', 2);7 define('STATUS_TENTATIVE', 2); 8 8 define('STATUS_DECLINED', 3); 9 9 define('STATUS_CANCELLED', 3); … … 29 29 define('ICAL_ACTION_NONE', 4); 30 30 define('ICAL_ACTION_REPLY', 5); 31 define('ICAL_ACTION_SUGGESTION', 6); 31 32 32 33 ?> -
trunk/prototype/modules/calendar/css/layout.css
r5417 r5514 211 211 } 212 212 213 .new-event-win fieldset.block-add-attendee-permissions { 214 width: 220px; 215 float:left; 216 margin: 105px 0 0 10px; 217 } 213 .new-event-win ul.attendee-permissions-list, li.attendee-permissions-list{text-align: left;} 214 215 li.attendee-permissions-list input{width: 20px !important; margin: 3px 0 0 0; !important} 216 217 p.request-update{display: inline; position: relative; top: 2px;} 218 219 220 p.request-update label{width: 150px !important;} 218 221 219 222 .new-event-win .menu-addevent { … … 221 224 } 222 225 223 fieldset.block-add-attendee .add-attendee-search { max-width: 2 00px; margin: 5px;}224 fieldset.block-add-attendee .add-attendee-search input { max-width: 170px;}226 fieldset.block-add-attendee .add-attendee-search { max-width: 250px; margin: 5px;} 227 fieldset.block-add-attendee .add-attendee-search input { max-width: 215px; width: 215px;} 225 228 fieldset.block-add-attendee .search-result-list { width: 255px; max-height: 215px; overflow: auto;} 226 229 fieldset.block-add-attendee .search-result-list .ui-widget-content { border: none;} … … 256 259 .attendees-list .me select.status { margin:10px 5px 5px 5px; } 257 260 .attendees-list .me .add-attendee-search { max-width: 155px; width:155px; display: inline; padding: 0; margin: 10px 0 5px 0;} 261 262 .attendees-list .me .add-attendee-options { max-height: 16px; height:16px; max-width: 50px; width:50px; display: inline; padding: 0; margin: 0 0 5px 0;} 263 .attendees-list .me .add-attendee-options-read { max-height: 16px; height:16px; max-width: 16px; width:16px; display: inline; padding: 0; margin: 0 0 5px 0;} 264 265 .attendees-list .me .add-attendee-options-button {position: absolute; top: 171px;} 266 .attendees-list .hover-attendee { background-color: #DFEFFC;} 267 /* 268 .attendees-list .attendee-options-button-edit { position: absolute; top:0; right:25px;} 269 .attendees-list .attendee-options-button-key { position: absolute; top:0; right:45px;} 270 .attendees-list .attendee-options-button-delegate { position: absolute; top:0; right:65px;} 271 */ 272 273 .attendee-options{ position: absolute; top: 0; left: 300px; background-color: white; z-index: 100; width: 90px; background-color: #FFF; padding: 0 5px 0 3px; text-align: right;} 274 .attendees-list .not-attendee { height:16px; } 275 276 .list-delegates{margin: 0 0 0 25px;} 277 278 .status-delegate{position: absolute; left:3px;} 279 258 280 .attendees-list .me .add-attendee-search input { max-width: 125px; } 259 .attendees-list li.organizer {margin-bottom: 3px;}281 .attendees-list li.organizer, .attendees-list li.me-delegated {margin-bottom: 3px;} 260 282 .attendees-list .organizer .button.swap { 261 283 float: right; 262 284 margin-top: -1.5em; 263 285 } 286 287 .name-status-delegated{text-decoration: line-through; padding: 0 0 0 18px;} 288 .name-status-delegated-delegated{text-decoration: line-through; padding: 0 0 0 12px;} 289 .name-status-delegated-none{ padding: 0 0 0 12;} 290 291 .name-status{padding: 0 0 0 18px;} 292 293 .name-special{padding: 0 0 0 33px;} 294 .name-special-delegated{text-decoration: line-through; padding: 0 0 0 33px;} 295 296 .open-delegate{position: absolute; left: 20px; display: block; cursor: hand;} 297 .space-status{position: absolute; left: 20px; display: block;} 298 .space-special{position: absolute; left: 35px; display: block;} 299 .space-special-delegated{position: absolute; left: 20px; display: block;} 300 301 .attendee-permissions-change{background-image: url(../../../plugins/jquery/images/ui-icons_f9bd01_256x240.png) !important;} 302 .attendee-permissions-change-button{border: 1px solid #79B7E7 !important; background: #F5F8F9 !important; font-weight: bold !important; color: #E17009 !important;} 303 304 .attendee-permissions-conflict{opacity: 0.5} 264 305 265 306 dd.attendee-list ul.attendee-list li { … … 275 316 dd.attendee-list ul.attendee-list li label.name, 276 317 dd.attendee-list ul.attendee-list li label.mail { 277 width: 6000px;278 min-width: 6000px;318 width: 99999px; 319 min-width: 99999px; 279 320 vertical-align: middle; 280 321 } 281 322 dd.attendee-list ul.attendee-list li label[title=''] { display:none } 323 /* 282 324 dd.attendee-list ul.attendee-list li .button.close { 283 325 position: absolute; 284 right: 0;326 right: 5px; 285 327 top: 0; 286 328 } 287 329 */ 288 330 /* 289 331 .attendees-list li .ui-icon-float-right { … … 482 524 } 483 525 526 .button.add.button-add-attachment{margin: -9px 0 0 8px;} 527 .button.upload{margin-bottom: 4px;} 528 div.fileupload-buttonbar{padding: 0.2em 0.5em } 529 .archive-error{color: #F00;} 530 531 .progress.in-progress{width: 100px; height: 12px;} 532 533 534 .lbl-archive-nome, .lbl-archive-size{font-weight: bold !important;} 535 .lbl-archive-nome{width:40px !important;} 536 .row.fileupload-buttonbar{margin-top: -14px; padding: 0.2em 0.7em;} 537 538 .archive-nome{width: 73px;} 539 .archive-nome label{display: block; position: absolute; left: 136px; top: 194px;} 540 .archive-size{min-width:100px; max-width:100px;} 541 542 484 543 .input-group.date-info input { 485 544 width: 100px; -
trunk/prototype/modules/calendar/css/style.css
r5511 r5514 90 90 91 91 .ui-dialog .ui-dialog-content { padding: 0; } 92 .new-event-win form.form-addevent { padding: 10px; } 92 .new-event-win div.div-addevent { padding: 0; width: 700px; border: 0;} 93 .new-event-win form.form-addevent { padding: 9px; } 93 94 94 95 .expresso-calendar-container input[type="text"] { height: 18px; } -
trunk/prototype/modules/calendar/export.php
r5399 r5514 31 31 $eventsIds[] = $eventLink['schedulable']; 32 32 33 $events = Controller::find(array('concept' => 'schedulable') , false , array('filter' => array('IN','id',$eventsIds) , 'deepness' => '2' )); 33 $events = Controller::find(array('concept' => 'schedulable') , false , array('filter' => array('IN','id',$eventsIds) , 'deepness' => '2' )); 34 34 $ics = Controller::format( array( 'service' => 'iCal' ) , $events , array('defaultTZI' => $calendar['timezone']) ); 35 35 … … 45 45 { 46 46 $event = Controller::read(array('concept' => 'schedulable' , 'id' => $params['event'])); 47 $attachmentRelation = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'schedulable' , $event['id']) )); 48 if(is_array($attachmentRelation)){ 49 $attachments = array(); 50 foreach($attachmentRelation as $key => $value) 51 if(isset($value['attachment']) || !!$value['attachment']) 52 $attachments[$key] = $value['attachment']; 53 //Pega os anexos sem source 54 $event['attachments'] = Controller::find( array( 'concept' => 'attachment' ) , false ,array( 'filter' => array('IN', 'id' , $attachments) )); 55 } 56 47 57 $ics = Controller::format( array( 'service' => 'iCal' ) , array($event) , array('defaultTZI' => $event['timezone']) ); 48 58 -
trunk/prototype/modules/calendar/interceptors/DBMapping.php
r5462 r5514 40 40 } 41 41 42 public function encodeCreateSuggestion( &$uri , &$params , &$criteria , $original ){ 43 $params['dtstamp'] = (isset($params['dtstamp'])) ? $params['dtstamp'] :time().'000'; 44 } 45 42 46 public function encodeUpdateAlarm( &$uri , &$params , &$criteria , $original ){ 43 47 if(isset($params['type'])) … … 46 50 47 51 public function encodeCreateAttachment( &$uri , &$params , &$criteria , $original ){ 48 $params['source'] = base64_encode( $params['source'] ); 52 53 if(!isset($params['source'])) return false; 54 55 if(isset($_FILES[$params['source']])) 56 if(isset($params['id'])) 57 $params = array_merge($_FILES[$params['source']], array('id' => $params['id'])); 58 else 59 $params = $_FILES[$params['source']]; 60 61 //$params['source'] = base64_encode( $params['source'] ); 62 49 63 } 64 50 65 /////////////////////////////////////////////////////////////////////////////////////////////////////////////// 51 66 … … 145 160 public function createCalendarToSchedulable( &$uri , &$result , &$criteria , $original ){ 146 161 147 Controller::create(array('concept' => 'calendarToSchedulable'), array('calendar' => $original['properties']['calendar'], 'schedulable' => $result['id'] )); 148 149 } 162 Controller::create(array('concept' => 'calendarToSchedulable'), array('calendar' => $original['properties']['calendar'], 'schedulable' => $result['id'] )); 163 164 } 165 166 public function createCreateSchedulableToAttachment( &$uri , &$params , &$criteria , $original ){ 167 if(array_key_exists('attachments', $original['properties'])) 168 foreach($original['properties']['attachments'] as $key => $value){ 169 if(isset($params['id'])) 170 Controller::create(array('concept' => 'schedulableToAttachment'), array('attachment' => $value['attachment'], 'schedulable' => $params['id'] )); 171 } 172 } 150 173 151 174 //TODO: Remover apos suporte a deepness na api … … 172 195 } 173 196 $result[$i]['participants'] = $participants; 174 } 197 198 $attachmentRelation = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'schedulable' , $v['id']) )); 199 if(is_array($attachmentRelation)){ 200 $attachments = array(); 201 foreach($attachmentRelation as $key => $value) 202 if(isset($value['attachment']) || !!$value['attachment']) 203 $attachments[$key] = $value['attachment']; 204 //Pega os anexos sem source 205 $result[$i]['attachments'] = Controller::find( array( 'concept' => 'attachment' ) , array('id', 'name', 'type', 'size') ,array( 'filter' => array('IN', 'id' , $attachments) )); 206 } 207 208 } 175 209 176 210 } … … 294 328 } 295 329 } 330 331 public function decodeFindAttachment( &$uri , &$result , &$criteria , $original ){ 332 if(isset($result)) 333 foreach($result as $key => &$value) 334 $value['source'] = base64_decode($value['source']); 335 } 336 296 337 297 338 public function decodeSignatureAlarmType( &$uri , &$result , &$criteria , $original ){ … … 389 430 } 390 431 391 } 432 } 433 434 public function deleteAttachmentDependences( &$uri , &$params , &$criteria , $original ){ 435 436 if(isset($original['URI']['id'])) 437 Controller::delete(array('concept' => 'schedulableToAttachment', null , array('filter' => array('=' , 'attachment' , $original['URI']['id'])))); 438 } 392 439 393 440 public function createDefaultSignature( &$uri , &$result , &$criteria , $original ){ -
trunk/prototype/modules/calendar/interceptors/Notifications.php
r5437 r5514 8 8 { 9 9 10 /** 10 public function formatNotification(&$uri , &$params , &$data , $original){ 11 switch ($params['type']) { 12 case 'suggestion': 13 self::formatSuggestion($params); 14 break; 15 case 'suggestionResponse': 16 self::formatSuggestionResponse($params); 17 break; 18 } 19 } 20 21 22 /** 11 23 * Analisa o commit do conceito participant e encaminha cada participant para seu devido metodo de notrificação 12 24 * … … 19 31 */ 20 32 public function commitParticipant(&$uri , &$result , &$data , $original) 21 { 33 { 22 34 if(Config::regGet('noAlarm') !== false) return; //Escapa notificações caso a flag de noAlarm esteja ativa. 23 35 24 36 $organizers = array(); //Cache Organizadores 25 37 $schedulables = array(); //Cache Schedulables 26 38 27 39 foreach ($data as $i => $concept) 28 40 { … … 39 51 foreach ($schedulables[ $concept['id'] ]['participants'] as $i => $v) //salva em $organizers as informações do organizador 40 52 if(($v['isOrganizer'] === '1') && ($organizers[$concept['id']] = $v) ) break; 41 } 53 }else if($concept['concept'] === 'schedulableToAttachment') 54 { 55 $relationAttachment = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'id' , $concept['id']))); 56 57 58 59 foreach($relationAttachment as $key => $value){ 60 if(!array_key_exists('attachments',$schedulables[$value['schedulable']])) 61 $schedulables[$value['schedulable']]['attachments'] = array(); 62 63 $temp = Controller::find( array( 'concept' => 'attachment' ) , false ,array( 'filter' => array('=', 'id' , $value['attachment']))); 64 array_push($schedulables[$value['schedulable']]['attachments'] , $temp[0]); 65 } 66 } 42 67 } 43 68 44 69 if( isset( $created ) ) 45 70 { 46 $psCreated = Controller::find(array('concept' => 'participant'), false , array('deepness' => '1' , 'filter' => array('IN', 'id' , $created ))); 47 71 $psCreated = Controller::find(array('concept' => 'participant'), false , array('deepness' => '1' , 'filter' => array('IN', 'id' , $created ))); 72 foreach ($psCreated as $i => $pCreated) 48 73 { 49 74 if($pCreated['isOrganizer'] == '1') continue; //escapa organizador … … 52 77 53 78 $organizer = isset( $organizers[$pCreated['schedulable']] ) ? $organizers[ $pCreated['schedulable'] ] : self::getOrganizer( $pCreated['schedulable'] ); 54 79 80 if($pCreated['delegatedFrom'] != 0){ 81 self::participantDelegated( $pCreated , $schedulable , $organizer); 82 continue; 83 } 84 55 85 switch ($pCreated['status']) 56 86 { … … 68 98 { 69 99 $psUpdated = Controller::find(array('concept' => 'participant'), false , array('deepness' => '1' , 'filter' => array('IN', 'id' , $updated ))); 70 71 { 100 foreach ($psUpdated as $i => $pUpdated) 101 { 72 102 if($pUpdated['isOrganizer'] == '1') continue; //escapa organizador 73 103 $schedulable = isset( $schedulables[$pUpdated['schedulable']] ) ? $schedulables[ $pUpdated['schedulable'] ] : Controller::read( array('concept' => 'schedulable', 'id' => $pUpdated['schedulable']) , false , array('deepness' => '2')); … … 77 107 if(($v['isOrganizer'] === '1') && ($organizer = $v) ) break; 78 108 79 80 if( $pUpdated['status'] != STATUS_UNANSWERED) 81 self::participantStatusChange( $pUpdated['id'] , $schedulable , $organizer , $pUpdated['status'] ); 109 if($pUpdated['delegatedFrom'] != 0){ 110 self::participantDelegatedStatusChange( $pUpdated , $schedulable , $organizer , $pUpdated['status'] ); 111 }else if( $pUpdated['status'] != STATUS_UNANSWERED && $pUpdated['status'] != STATUS_DELEGATED) 112 self::participantStatusChange( $pUpdated['id'] , $schedulable , $organizer , $pUpdated['status'] ); 82 113 } 83 114 } 84 115 } 85 86 87 /** 88 * Monta o email de convite que sera enviado ao participant 89 * 90 * @license http://www.gnu.org/copyleft/gpl.html GPL 91 * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) 92 * @sponsor Caixa Econômica Federal 93 * @author Cristiano Corrêa Schmidt 94 * @return void 95 * @access public 96 */ 97 public static function participantCreated( &$partID , &$schedulable ) 98 { 116 117 public function formatSuggestion(&$params){ 118 119 $schedulable = Controller::read( array( 'concept' => 'schedulable' , 'id' => $params['schedulable'] ) , null , array('deepness' => '2') ) ; 120 121 foreach ($schedulable['participants'] as $i => $v) //salva em $organizer as informações do organizador 122 if(($v['isOrganizer'] === '1') && ($organizer = $v) ) break; 123 124 $method = 'COUNTER'; 125 $notificationType = 'Sugestão de horário'; 126 $part = 'other'; 127 128 $schedulableReference = $schedulable; 129 130 $referenceSuggestion = array( 'startTime' => $params['startTime'], 131 'endTime' => $params['endTime'], 132 'allDay' => $params['allDay'] 133 ); 134 $schedulable = array_merge($schedulable, $referenceSuggestion); 135 136 self::mountStruture(false, $schedulable, false , $data, $subject, $ical, $part, $method, $notificationType); 137 138 139 $timezone = new DateTimeZone('UTC'); 140 $sTime = new DateTime( '@'.(int)($schedulableReference['startTime'] / 1000) , $timezone ); 141 $eTime = new DateTime( '@'.(int)($schedulableReference['endTime'] / 1000) , $timezone ); 142 143 if(isset($schedulableReference['timezone'])) 144 { 145 $sTime->setTimezone(new DateTimeZone($schedulableReference['timezone'])); 146 $eTime->setTimezone(new DateTimeZone($schedulableReference['timezone'])); 147 } 148 149 $data['nowStartDate'] = date_format( $sTime , 'd/m/Y'); 150 $data['nowStartTime'] = ($schedulableReference['allDay']) ? '' : date_format( $sTime , 'H:i'); 151 $data['nowEndDate'] = date_format( $eTime , 'd/m/Y'); 152 $data['nowEndTime'] = ($schedulableReference['allDay']) ? '' : date_format( $eTime , 'H:i'); 153 $data['userRequest'] = Config::me('uid'); 154 155 $params['attachments'][] = $ical; 156 $params['isHtml'] = true; 157 $params['body'] = parseTPL::load_tpl( $data ,ROOTPATH.'/modules/calendar/templates/notify_suggestion_body.tpl'); 158 $params['subject'] = parseTPL::load_tpl( $subject ,ROOTPATH.'/modules/calendar/templates/notify_subject.tpl');; 159 $params['from'] = Config::me('mail'); 160 $params['to'] = $organizer['user']['mail']; 161 162 } 163 164 public function formatSuggestionResponse(&$params){ 165 $schedulable = $params['schedulable']; 166 foreach ($schedulable['participants'] as $i => $v) {//salva em $organizer as informações do organizador 167 if($v['isOrganizer'] === '1') $organizer = $v; 168 if($v['user']['mail'] == Config::me('mail')) $me = $v; 169 } 170 $method = 'DECLINECOUNTER'; 171 $notificationType = 'Sugestão de horário'; 172 $part = 'other'; 173 174 $schedulable['participants'] = array(); 175 array_push($schedulable['participants'], $me, $organizer); 176 177 self::mountStruture(false, $schedulable, false , $data, $subject, $ical, $part, $method, $notificationType); 178 179 if($params['status'] == 'DECLINECOUNTER') 180 $data['status'] = 'não pode ser aceito'; 181 182 $params['attachments'][] = $ical; 183 $params['isHtml'] = true; 184 $params['body'] = parseTPL::load_tpl( $data ,ROOTPATH.'/modules/calendar/templates/notify_suggestion_response_body.tpl'); 185 $params['subject'] = parseTPL::load_tpl( $subject ,ROOTPATH.'/modules/calendar/templates/notify_subject.tpl');; 186 $params['to'] = $params['from']; 187 $params['from'] = Config::me('mail'); 188 } 189 190 191 public static function _getAttendeeById($attendeId, $schedulable){ 192 foreach ($schedulable['participants'] as $id => $dv) 193 if($dv['id'] == $attendeId ) 194 return $dv; 195 } 196 197 /** 198 * Prepara para criação de email de delegação 199 * 200 * @license http://www.gnu.org/copyleft/gpl.html GPL 201 * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) 202 * @sponsor Caixa Econômica Federal 203 * @author Adriano Coutinho da Silva 204 * @return void 205 * @access public 206 */ 207 public static function participantDelegated( &$partID , &$schedulable , &$organizer){ 208 209 $delegatedParams = array(); 210 211 $delegatedFrom = self::_getAttendeeById($partID['delegatedFrom'], $schedulable); 212 $delegatedParams['delegatedFrom'] = $delegatedFrom['user']['uid']; 213 214 self::participantCreated( $partID['id'] , $schedulable , STATUS_DELEGATED, $delegatedParams ); 215 216 $delegatedTo = self::_getAttendeeById($partID['id'], $schedulable); 217 $delegatedParams['delegated'] = $delegatedTo['user']['uid']; 218 219 self::participantStatusChange( $partID['delegatedFrom'] , $schedulable , $organizer , STATUS_DELEGATED, $delegatedParams ); 220 } 221 222 /** 223 * Monta o email de resposta que sera enviado ao delegatedFrom 224 * 225 * @license http://www.gnu.org/copyleft/gpl.html GPL 226 * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) 227 * @sponsor Caixa Econômica Federal 228 * @author Cristiano Corrêa Schmidt 229 * @return void 230 * @access public 231 */ 232 public static function participantDelegatedStatusChange( &$partID , &$schedulable, $organizer, &$type = false){ 233 234 $delegatedParams = array(); 235 236 $delegated = self::_getAttendeeById($partID['id'], $schedulable); 237 $delegatedParams['delegated'] = $delegated['user']['uid']; 238 239 switch($partID['status']){ 240 case STATUS_ACCEPTED: 241 $delegatedParams['status'] = 'aceitou'; 242 break; 243 case STATUS_TENTATIVE: 244 $delegatedParams['status'] = 'marcou como tentativa'; 245 break; 246 case STATUS_CANCELLED: 247 $delegatedParams['status'] = 'rejeitou'; 248 break; 249 case STATUS_DELEGATED: 250 $delegatedParams['status'] = 'delegou para um novo participante'; 251 break; 252 } 253 //notifica o organizador a resposta do delegado 254 self::participantStatusChange( $partID['delegatedFrom'] , $schedulable , $organizer , $type, $delegatedParams ); 255 256 $method = 'REQUEST'; 257 $notificationType = 'Resposta Delegação'; 258 $part = 'attendees'; 259 self::mountStruture($partID['delegatedFrom'], $schedulable, $type , $data, $subject, $ical, $part, $method, $notificationType ); 260 261 $data = array_merge($data, $delegatedParams); 262 263 self::sendMail($data, $ical , $part['user']['mail'] , $subject , 'notify_response_delegated_status_body'); 264 265 } 266 267 public static function mountStruture( $partID , &$schedulable, $type = false, &$data, &$subject, &$ical, &$part = false, &$method, &$notificationType, $regSet = false) { 268 269 if( (Config::regGet('ical://'.$schedulable['id'].'/'.$method) === false) || ($method == 'CANCEL') ) //Verifica se o ical ja não esta no reg 270 { 271 $schedulable['URI']['concept'] = 'schedulable'; 272 $ical['source'] = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('method' => $method) ); 273 $ical['type'] = 'text/calendar'; 274 $ical['name'] = 'calendar.ics'; 275 if($regSet) 276 Config::regSet('ical://'.$schedulable['id'].'/'.$method, $ical); 277 } 278 else 279 $ical = Config::regGet('ical://'.$schedulable['id'].'/'.$method); 99 280 100 $part = false; 101 if( Config::regGet('ical://'.$schedulable['id'].'/REQUEST') === false ) //Verifica se o ical ja não esta no reg 102 { 103 $schedulable['URI']['concept'] = 'schedulable'; 104 $ical['source'] = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('method' => 'REQUEST') ); 105 $ical['type'] = 'text/calendar'; 106 $ical['name'] = 'calendar.ics'; 107 Config::regSet('ical://'.$schedulable['id'].'/REQUEST', $ical); 108 } 109 else 110 $ical = Config::regGet('ical://'.$schedulable['id'].'/REQUEST'); 111 112 $timezone = new DateTimeZone('UTC'); 113 $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timezone ); 114 $eTime = new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timezone ); 281 $timezone = new DateTimeZone('UTC'); 282 $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timezone ); 283 $eTime = new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timezone ); 115 284 116 117 118 119 120 285 if(isset($schedulable['timezone'])) 286 { 287 $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 288 $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 289 } 121 290 122 $attList = '<UL> '; 123 foreach ($schedulable['participants'] as $i => $v) 124 { 125 if($part === false && $v['id'] == $partID) 126 $part = $v; 127 128 $attList .= ' <LI> '. (isset($v['user']['name']) ? $v['user']['name'] : $v['user']['mail']) ; 129 } 130 $attList .= '</UL>'; 131 132 $data = array( 'startDate' => date_format( $sTime , 'd/m/Y') , 291 $data = array( 'startDate' => date_format( $sTime , 'd/m/Y') , 133 292 'startTime' => ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i') , 134 293 'endDate' => date_format( $eTime , 'd/m/Y') , … … 136 295 'eventTitle' => $schedulable['summary'], 137 296 'eventLocation' => $schedulable['location'], 138 'timezone' => ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC' , 139 'participants' => $attList); 140 141 $subject['notificationType'] = 'Convite de Calendario'; 142 $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 143 $subject['startDate'] = date_format( $sTime , 'd/m/Y'); 144 $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i'); 145 $subject['endDate'] = date_format( $eTime , 'd/m/Y'); 146 $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i'); 147 $subject['participant'] = Config::me('uid'); 148 149 self::sendMail($data, $ical , $part['user']['mail'] , $subject , 'notify_create_body'); 297 'timezone' => ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC'); 298 $temp = $part; 299 $part = false; 300 switch($temp){ 301 case 'attendees': 302 $attList = '<UL> '; 303 foreach ($schedulable['participants'] as $i => $v) 304 { 305 if($part === false && $v['id'] == $partID) 306 $part = $v; 307 308 $attList .= ' <LI> '. (isset($v['user']['name']) ? $v['user']['name'] : $v['user']['mail']) ; 309 } 310 $attList .= '</UL>'; 311 $data['participants'] = $attList; 312 break; 313 case 'me': 314 $part = self::_getAttendeeById($partID, $schedulable); 315 $data['participant'] = isset($part['user']['name']) ? $part['user']['name'] : $part['user']['mail']; 316 break; 317 case 'othersAttendees': 318 $data['participants'] = '<UL> '; 319 foreach ($schedulable['participants'] as $ii => $participant){ 320 if(Config::me('mail') !== $participant['user']['mail']) 321 $part[] = $participant['user']['mail']; 322 323 $data['participants'] .= ' <LI> '. (isset($participant['user']['name']) ? $participant['user']['name'] : $participant['user']['mail']) ; 324 } 325 break; 326 } 327 $subject['notificationType'] = $notificationType; 328 $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 329 $subject['startDate'] = date_format( $sTime , 'd/m/Y'); 330 $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i'); 331 $subject['endDate'] = date_format( $eTime , 'd/m/Y'); 332 $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i'); 333 $subject['participant'] = Config::me('uid'); 334 } 335 336 337 /** 338 * Monta o email de convite que sera enviado ao participant 339 * 340 * @license http://www.gnu.org/copyleft/gpl.html GPL 341 * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) 342 * @sponsor Caixa Econômica Federal 343 * @author Cristiano Corrêa Schmidt 344 * @return void 345 * @access public 346 */ 347 public static function participantCreated( &$partID , &$schedulable, $type = false, $delegatedParams = false) 348 { 349 $method = 'REQUEST'; 350 $notificationType = 'Convite de Calendario'; 351 $part = 'attendees'; 352 self::mountStruture($partID, $schedulable, $type , $data, $subject, $ical, $part, $method, $notificationType, true); 353 354 if($delegatedParams) 355 $data = array_merge($data, $delegatedParams); 356 357 self::sendMail($data, $ical , $part['user']['mail'] , $subject , !$delegatedParams ? 'notify_create_body' : 'notify_create_delegated_body' ); 150 358 151 359 } … … 161 369 * @access public 162 370 */ 163 public static function participantStatusChange( &$partID , &$schedulable , &$organizer , $type ) 164 { 165 $part = false; 166 167 foreach ($schedulable['participants'] as $i => $v) //salva em $part as informações do participant a ser notificado 168 if(($v['id'] == $partID) && ($part = $v) ) break; 169 170 if( Config::regGet('ical://'.$schedulable['id'].'/REPLY') === false ) //Verifica se o ical ja não esta no reg 171 { 172 $schedulable['URI']['concept'] = 'schedulable'; 173 $ical['source'] = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('method' => 'REPLY' , 'participant' => $partID) ); 174 $ical['type'] = 'text/calendar'; 175 $ical['name'] = 'calendar.ics'; 176 Config::regSet('ical://'.$schedulable['id'].'/REPLY', $ical); 177 } 178 else 179 $ical = Config::regGet('ical://'.$schedulable['id'].'/REPLY'); 180 181 182 $timezone = new DateTimeZone('UTC'); 183 $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timezone ); 184 $eTime = new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timezone ); 185 186 if(isset($schedulable['timezone'])) 187 { 188 $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 189 $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 190 } 191 192 $data = array('startDate' => date_format( $sTime , 'd/m/Y') , 193 'startTime' => ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i') , 194 'endDate' => date_format( $eTime , 'd/m/Y') , 195 'endTime' => ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i') , 196 'eventTitle' => $schedulable['summary'], 197 'eventLocation' => $schedulable['location'], 198 'timezone' => ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC' , 199 'participant' => (isset($part['user']['name']) ? $part['user']['name'] : $part['user']['mail']) ); 200 201 $subject['notificationType'] = 'Convite Aceito'; 202 $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 203 $subject['startDate'] = date_format( $sTime , 'd/m/Y'); 204 $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i'); 205 $subject['endDate'] = date_format( $eTime , 'd/m/Y'); 206 $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i'); 207 $subject['participant'] = Config::me('uid'); 208 371 public static function participantStatusChange( &$partID , &$schedulable , &$organizer , $type, $delegatedParams = false ) 372 { 373 $method = 'REPLY'; 374 $notificationType = 'Convite Aceito'; 375 $part = 'me'; 376 377 self::mountStruture($partID, $schedulable, $type , $data, $subject, $ical, $part, $method, $notificationType, true ); 378 379 if($delegatedParams){ 380 $data = array_merge($data, $delegatedParams); 381 $tplDelegated = 'notify_delegated_status_body'; 382 } 383 209 384 switch($type) 210 385 { 211 386 case STATUS_ACCEPTED: 212 $tpl = 'notify_accept_body';387 $tpl = !$delegatedParams ? 'notify_accept_body' : $tplDelegated; 213 388 $subject['notificationType'] = 'Convite Aceito'; 214 389 break; 215 case STATUS_TEN ATIVE:216 $tpl = 'notify_attempt_body';390 case STATUS_TENTATIVE: 391 $tpl = !$delegatedParams ? 'notify_attempt_body' : $tplDelegated; 217 392 $subject['notificationType'] = 'Convite aceito provisoriamente'; 218 393 break; 219 394 case STATUS_CANCELLED: 220 $tpl = 'notify_reject_body';395 $tpl = !$delegatedParams ? 'notify_reject_body' : $tplDelegated; 221 396 $subject['notificationType'] = 'Convite rejeitado'; 397 break; 398 case STATUS_DELEGATED: 399 if($delegatedParams) 400 $data = array_merge($data, $delegatedParams); 401 $tpl = 'notify_delegated_body'; 402 $subject['notificationType'] = 'Convite delegado'; 222 403 break; 223 404 … … 264 445 if((Config::regGet('noAlarm') === false) && (self::futureEvent( $schedulable['startTime'] , $schedulable['rangeEnd']))) 265 446 { 266 $schedulable['URI']['concept'] = 'schedulable'; 267 $timezone = new DateTimeZone('UTC'); 268 $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timezone ); 269 $eTime = new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timezone ); 270 271 if(isset($schedulable['timezone'])) 272 { 273 $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 274 $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 275 } 276 277 $data = array('startDate' => date_format( $sTime , 'd/m/Y') , 278 'startTime' => ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i') , 279 'endDate' => date_format( $eTime , 'd/m/Y') , 280 'endTime' => ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i') , 281 'eventTitle' => $schedulable['summary'], 282 'eventLocation' => $schedulable['location'], 283 'timezone' => ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC'); 284 285 286 $ical['source'] = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('method' => 'CANCEL')); 287 $ical['type'] = 'text/calendar'; 288 $ical['name'] = 'calendar.ics'; 289 290 foreach ($schedulable['participants'] as $ii => $participant) 291 if(Config::me('mail') !== $participant['user']['mail']) 292 $to[] = $participant['user']['mail']; 293 294 $subject['notificationType'] = 'Cancelamento de Calendario'; 295 $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 296 $subject['startDate'] = date_format( $sTime , 'd/m/Y'); 297 $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i'); 298 $subject['endDate'] = date_format( $eTime , 'd/m/Y'); 299 $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i'); 300 $subject['participant'] = Config::me('uid'); 447 $method = 'CANCEL'; 448 $notificationType = 'Cancelamento de Calendario'; 449 $part = 'othersAttendees'; 450 self::mountStruture($uri['id'], $schedulable, false , $data, $subject, $ical, $part, $method, $notificationType ); 301 451 302 if(count($ to) > 0)303 self::sendMail($data, $ical , implode(',' , $ to) ,$subject, 'notify_cancel_body');452 if(count($part) > 0) 453 self::sendMail($data, $ical , implode(',' , $part) ,$subject, 'notify_cancel_body'); 304 454 } 305 455 } … … 323 473 if((Config::regGet('noAlarm') === false) && (self::futureEvent( $schedulable['startTime'] , $schedulable['rangeEnd']))) 324 474 { 325 $schedulable['URI']['concept'] = 'schedulable'; 326 $timezone = new DateTimeZone('UTC'); 327 $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timezone ); 328 $eTime = new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timezone ); 329 330 if(isset($schedulable['timezone'])) 331 { 332 $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 333 $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 334 } 335 336 $data = array('startDate' => date_format( $sTime , 'd/m/Y') , 337 'startTime' => ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i') , 338 'endDate' => date_format( $eTime , 'd/m/Y') , 339 'endTime' => ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i') , 340 'eventTitle' => $schedulable['summary'], 341 'eventLocation' => $schedulable['location'], 342 'timezone' => ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC'); 343 344 $ical['source'] = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('method' => 'CANCEL')); 345 $ical['type'] = 'text/calendar'; 346 $ical['name'] = 'calendar.ics'; 347 348 $subject['notificationType'] = 'Cancelamento de Calendario'; 349 $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 350 $subject['startDate'] = date_format( $sTime , 'd/m/Y'); 351 $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format( $sTime , 'H:i'); 352 $subject['endDate'] = date_format( $eTime , 'd/m/Y'); 353 $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format( $eTime , 'H:i'); 354 $subject['participant'] = Config::me('uid'); 355 356 self::sendMail($data, $ical , $participant['user']['mail'] , $subject , 'notify_cancel_body'); 475 $method = 'CANCEL'; 476 $notificationType = 'Cancelamento de Calendario'; 477 $part = 'others'; 478 self::mountStruture(false, $schedulable, false , $data, $subject, $ical, $part, $method, $notificationType ); 479 480 self::sendMail($data, $ical , $participant['user']['mail'] , $subject , 'notify_cancel_body'); 357 481 } 358 482 } … … 369 493 */ 370 494 public function updateEvent( &$uri , &$params , &$criteria , $original ) 371 { 372 373 $schedulableOld = Controller::read( array( 'concept' => 'schedulable' , 'id' => $uri['id'] ) , null , array('deepness' => '2') ) ; 495 { 496 $schedulableOld = Controller::find( array( 'concept' => 'schedulable' , 'id' => $uri['id'] ) , null , array('deepness' => '2') ) ; 374 497 $schedulable = $schedulableOld; 375 498 $alt = false; 376 377 499 378 500 foreach ($params as $i => $v) //Verifica se ouve alteração no evento 379 501 if( isset( $schedulableOld[$i] ) && $schedulableOld[$i] != $v && $i != 'participants') … … 384 506 385 507 if ( ($alt === true) && (Config::regGet('noAlarm') === false) && (self::futureEvent($schedulable['startTime'], $schedulable['rangeEnd'])) ) 386 { 387 $schedulable['URI']['concept'] = 'schedulable'; 388 $ical['source'] = Controller::format(array('service' => 'iCal'), array($schedulable), array('method' => 'REQUEST')); 389 $ical['type'] = 'text/calendar'; 390 $ical['name'] = 'calendar.ics'; 391 392 $timezone = new DateTimeZone('UTC'); 393 $sTime = new DateTime('@' . (int) ($schedulable['startTime'] / 1000), $timezone); 394 $eTime = new DateTime('@' . (int) ($schedulable['endTime'] / 1000), $timezone); 395 396 if (isset($schedulable['timezone'])) { 397 $sTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 398 $eTime->setTimezone(new DateTimeZone($schedulable['timezone'])); 399 } 400 ///Montando lista de participantes 401 $attList = '<UL> '; 402 foreach ($schedulable['participants'] as $ii => $participant) 403 $attList .= ' <LI> ' . (isset($participant['user']['name']) ? $participant['user']['name'] : $participant['user']['mail']); 404 $attList .= ' </UL>'; 405 ///////////////////////// 406 407 $data = array('startDate' => date_format($sTime, 'd/m/Y'), 408 'startTime' => ($schedulable['allDay']) ? '' : date_format($sTime, 'H:i'), 409 'endDate' => date_format($eTime, 'd/m/Y'), 410 'endTime' => ($schedulable['allDay']) ? '' : date_format($eTime, 'H:i'), 411 'eventTitle' => $schedulable['summary'], 412 'eventLocation' => $schedulable['location'], 413 'timezone' => ($schedulable['timezone']) ? $schedulable['timezone'] : 'UTC', 414 'participants' => $attList 415 ); 416 417 418 foreach ($schedulable['participants'] as $ii => $participant) 419 if (Config::me('mail') !== $participant['user']['mail']) 420 $to[] = $participant['user']['mail']; 421 422 $subject['notificationType'] = 'Modificação de Calendario'; 423 $subject['eventTitle'] = mb_convert_encoding($schedulable['summary'],'ISO-8859-1','ISO-8859-1,UTF-8'); 424 $subject['startDate'] = date_format($sTime, 'd/m/Y'); 425 $subject['startTime'] = ($schedulable['allDay']) ? '' : date_format($sTime, 'H:i'); 426 $subject['endDate'] = date_format($eTime, 'd/m/Y'); 427 $subject['endTime'] = ($schedulable['allDay']) ? '' : date_format($eTime, 'H:i'); 428 $subject['participant'] = Config::me('uid'); 429 430 if ( isset($to) && count($to) > 0) 431 self::sendMail($data, $ical, implode(',', $to), $subject, 'notify_modify_body'); 508 { 509 $method = 'REQUEST'; 510 $notificationType = 'Modificação de Calendario'; 511 $part = 'othersAttendees'; 512 self::mountStruture($partID, $schedulable, $type , $data, $subject, $ical, $part, $method, $notificationType); 513 514 if ( isset($part) && count($part) > 0) 515 self::sendMail($data, $ical, implode(',', $part), $subject, 'notify_modify_body'); 432 516 } 433 517 } -
trunk/prototype/modules/calendar/js/calendar.codecs.js
r5468 r5514 29 29 this.preferenceIds = pref.ids; 30 30 } 31 } 32 33 constantsParticipant = { 34 'o' : 'organization', 35 'w' : 'write', 36 'p' : 'participationRequired', 37 'i' : 'inviteGuests', 38 'r' : 'read' 31 39 } 32 40 … … 333 341 }); 334 342 343 DataLayer.codec( "suggestion", "duration", { 344 345 decoder: function( evtObj ){ 346 if( notArray = $.type(evtObj) !== "array" ) 347 evtObj = [ evtObj ]; 348 349 350 351 var meAttendee = function(attendees){ 352 for(var i = 0; i < attendees.length; i++) 353 if(DataLayer.get('participant', attendees[i]).user == User.me.id) 354 return attendee; 355 }; 356 357 var res = $.map(evtObj, function( form ){ 358 return { 359 participant : meAttendee(form.attendee), 360 startTime: Timezone.getDateUTC(Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ), tzId).getTime(), 361 endTime: parseInt(Timezone.getDateUTC(Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ), tzId).getTime()) + (!!form.allDay ? 86400000 : 0) , 362 allDay: ( !!form.allDay ? 1 : 0 ), 363 schedulable: form.idEvent 364 } 365 }); 366 367 368 return notArray ? res[0] : res; 369 }, 370 371 encoder: function( evtObj ){} 372 373 }); 374 375 DataLayer.codec( "attachment", "detail", { 376 377 decoder: function(evtObj){ 378 379 if( notArray = $.type(evtObj) !== "array" ) 380 evtObj = [ evtObj ]; 381 382 var res = $.map(evtObj, function( form){ 383 return [$.map(form.files , function( files){ 384 return { source: files }; 385 })]; 386 }); 387 return notArray ? res[0] : res; 388 }, 389 390 encoder: function(){} 391 392 393 }); 394 335 395 DataLayer.codec( "schedulable", "preview", { 336 396 … … 348 408 id: form.idEvent, 349 409 calendar: form.calendar, 350 participants : [{ 351 user: User.me.id, 352 status: form.status, 353 id: form.meId, 354 isOrganizer: 0, 355 alarms: typeof(form.alarmTime) != 'undefined' ? 356 $.map( form.alarmTime || [], function( alarmTime, i ){ 357 358 if( alarmTime === "" ) 359 return( null ); 360 361 return !!form.alarmId[i] ? 362 { type: form.alarmType[i], unit: form.alarmUnit[i], time: form.alarmTime[i], id: form.alarmId[i] } : 363 { type: form.alarmType[i],unit: form.alarmUnit[i], time: form.alarmTime[i] }; 364 }) : [] 365 }] 410 participants : $.map(form.attendee, function( attendee, i ){ 411 if(isNaN(attendee)){ 412 return{ 413 id: attendee, 414 acl: form.attendeeAcl[i], 415 delegatedFrom: !!form.delegatedFrom[i] ? form.delegatedFrom[i] : 0, 416 isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ), 417 isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0, 418 acl: form.attendeeAcl[i].replace('o', '') 419 }; 420 }else{ 421 if(DataLayer.get('participant', attendee).user == User.me.id){ 422 var me = { 423 user: User.me.id, 424 status: form.status, 425 id: attendee, 426 isOrganizer: 0, 427 receiveNotification : (!!form.receiveNotification ? 1 : 0), 428 alarms: typeof(form.alarmTime) != 'undefined' ? 429 $.map( form.alarmTime || [], function( alarmTime, i ){ 430 431 if( alarmTime === "" ) 432 return( null ); 433 434 return !!form.alarmId[i] ? 435 { type: form.alarmType[i], unit: form.alarmUnit[i], time: form.alarmTime[i], id: form.alarmId[i] } : 436 { type: form.alarmType[i],unit: form.alarmUnit[i], time: form.alarmTime[i] }; 437 }) : [] 438 }; 439 440 if(form.startDate){ 441 var tzId = DataLayer.get('schedulable', form.idEvent).timezone || User.preferences.timezone, 442 formatString = ( typeof form.allDay !== "undefined" && !!form.allDay )? pref.dateFormat+" HH:mm" : pref.dateFormat + " " + pref.hourFormat; 443 444 DataLayer.put('notification', { 445 participant: me.id, 446 type: 'suggestion', 447 startTime: Timezone.getDateUTC(Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ), tzId).getTime(), 448 endTime: parseInt(Timezone.getDateUTC(Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ), tzId).getTime()) + (!!form.allDay ? 86400000 : 0) , 449 allDay: ( !!form.allDay ? 1 : 0 ), 450 schedulable: form.idEvent 451 }); 452 453 } 454 return me; 455 }else return(null); 456 }; 457 }) 366 458 } 367 459 }); 368 369 460 return notArray ? res[0] : res; 370 461 }, … … 381 472 statusLabels = [ '', 'accepted', 'tentative', 'cancelled', 'unanswered', 'delegated' ]; 382 473 474 var delegateAttendee = {}; 475 383 476 for( var i = 0; i < statusLabels.length; i++ ) 384 477 statusParticipants[ statusLabels[i] ] = 0; 385 386 var isOrganizer = 1;387 478 388 479 var res = $.map(evtObj, function( objEvent ){ 389 480 390 var participantInfo = {}, me = DataLayer.copy(User.me); 481 var participantInfo = {}, delegatedFrom = {}, me = DataLayer.copy(User.me); 482 483 var constantAcl = function(acl){ 484 var returns = {}; 485 for (var i in constantsParticipant){ 486 returns[constantsParticipant[i]] = acl.indexOf(i) >= 0 ? true : false 487 } 488 return returns; 489 }; 391 490 392 491 return { … … 406 505 endHour: dateCalendar.formatDate(Timezone.setDateTimezone(new Date(parseInt(objEvent.endTime)), objEvent.timezone, objEvent.calendar), User.preferences.hourFormat), 407 506 allDay: !!parseInt( objEvent.allDay ), 408 // attachments: this.decode( "attachment:detail", form ), 507 attachments: $.map(objEvent.attachments || [], function( attachment, i ){ 508 var attach = DataLayer.get('schedulableToAttachment', attachment, false); 509 attach.name = attach.name.length < 10 ? attach.name : ( attach.name.substr(0, 6) + attach.name.substr( attach.name.length-4, attach.name.length)); 510 511 return attach; 512 }), 409 513 attendee: $.map(objEvent.participants || [], function( participant, i ){ 514 515 if(delegateAttendee[participant]) 516 return(null); 410 517 411 518 var attend = DataLayer.get('participant', participant); … … 416 523 if( attend.user.id === me.id ){ 417 524 participantInfo.user = { 525 id: attend.id, 418 526 status : attend.status, 527 delegatedFrom: attend.delegatedFrom, 528 acl: attend.acl, 529 receiveNotification : attend.receiveNotification, 419 530 alarms : $.map(attend.alarms || [], function( alarm ){ 420 531 return DataLayer.get('alarm', alarm); … … 422 533 }; 423 534 me.id = attend.id; 424 535 return(null); 425 536 }; 426 537 … … 429 540 name: attend.user.name != 'false' ? attend.user.name : '', 430 541 mail: attend.user.mail, 431 isExternal: attend.isExternal 542 status : attend.status, 543 isExternal: attend.isExternal, 544 acl: attend.acl, 545 delegatedFrom: attend.delegatedFrom 432 546 }; 433 547 548 if(!!parseInt(attend.delegatedFrom)){ 549 delegatedFrom[attend.delegatedFrom] = DataLayer.copy(person); 550 return(null); 551 } 552 434 553 if( !!parseInt(attend.isOrganizer )){ 435 isOrganizer = ((attend.user.id == User.me.id) || (!!!attend.user)) ? 1 : 0;436 554 participantInfo.organizer = DataLayer.copy(person); 437 555 return(null); … … 441 559 }), 442 560 organizer: participantInfo.organizer || me, 443 alarms: !!participantInfo.user ? participantInfo.user.alarms : [], 444 status: !!participantInfo.user ? participantInfo.user.status : 1, 445 me: me, 446 isOrganizer: isOrganizer, 561 alarms: !!participantInfo.user ? participantInfo.user.alarms : [], 562 status: !!participantInfo.user ? participantInfo.user.status : 1, 563 acl: !!participantInfo.user ? constantAcl(participantInfo.user.acl) : constantAcl('rowi'), 564 me: !!participantInfo.user ? DataLayer.merge(participantInfo.user, me) : DataLayer.merge(me, {acl: 'rowi', delegatedFrom: 0, receiveNotification: 1}), 565 delegatedFrom: delegatedFrom, 447 566 statusParticipants: statusParticipants 448 567 }; 449 }); 450 568 }); 451 569 return notArray ? res[0] : res; 452 570 } … … 485 603 description: form.description, 486 604 timezone: tzId, 605 attachments: $.map(form.attachment || [], function( attachment, i ){ 606 return {attachment: attachment} 607 }), 487 608 participants: $.map( form.attendee || [], function( attendee, i ){ 488 609 … … 495 616 if( participant.user === User.me.id ){ 496 617 return DataLayer.merge({ 497 isOrganizer: ( !i ? 1 : 0 ), 618 id: attendee, 619 isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ), 620 acl: form.attendee_organizer == attendee ? (form.attendeeAcl[i].indexOf('o') < 0 ? form.attendeeAcl[i]+'o' : form.attendeeAcl[i]) : form.attendeeAcl[i].replace('o', ''), 498 621 alarms: participant.alarms = $.map( form.alarmTime || [], function( alarmTime, i ){ 499 622 if( alarmTime === "" ) … … 502 625 { type: form.alarmType[i],unit: form.alarmUnit[i], time: form.alarmTime[i] }; 503 626 }), 504 status: form.status505 }, !!form.idEvent ? {id: attendee} : {user: participant.user});627 status: !!form.status ? form.status : 3 628 }, form.delegatedFrom[i] != '0' ? {delegatedFrom: form.delegatedFrom[i]} : {}); 506 629 }else{ 507 return {630 return DataLayer.merge({ 508 631 id: attendee, 509 isOrganizer: ( !i ? 1 : 0 ), 510 isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0 511 }; 632 acl: form.attendeeAcl[i], 633 isOrganizer: (form.attendee_organizer == attendee ? 1 : 0 ), 634 isExternal: !!parseInt(form.attendeeType[i]) ? 1 : 0, 635 acl: form.attendee_organizer == attendee ? (form.attendeeAcl[i].indexOf('o') < 0 ? form.attendeeAcl[i]+'o' : form.attendeeAcl[i]) : form.attendeeAcl[i].replace('o', '') 636 }, form.delegatedFrom[i] != '0' ? {delegatedFrom: form.delegatedFrom[i]} : {}); 512 637 }; 513 638 }) … … 719 844 for(var i = 0; i < evt.participants.length; i++){ 720 845 attendee = DataLayer.get('participant', evt.participants[i]); 721 if(!!parseInt(attendee.isOrganizer))722 846 if(attendee.user == User.me.id) 723 return true; 724 else 725 return false; 847 return (attendee.acl.indexOf('w') >= 0 || attendee.acl.indexOf('o') >= 0 ) ? true : false; 726 848 } 727 849 } -
trunk/prototype/modules/calendar/js/helpers.js
r5510 r5514 45 45 } 46 46 */ 47 47 48 function eventDetails( objEvent, decoded, path) 48 49 { … … 69 70 */ 70 71 zebraDiscardEventDialog = false; 72 73 /** 74 ACLs do participant 75 */ 76 acl_names = { 77 'w': 'acl-white', 78 'i': 'acl-invite-guests', 79 'p': 'acl-participation-required' 80 }; 81 /** 82 * callback de participantes generico 83 */ 84 var callbackAttendee = function(){ 85 //Cria qtip de permissões pelo click do checkbox 86 var checked = false; 87 blkAddAtendee.find("li.not-attendee").addClass('hidden'); 88 89 blkAddAtendee.find("li .button").filter(".close.new").button({ 90 icons: { 91 primary: "ui-icon-close" 92 }, 93 text: false 94 }).click(function () { 95 DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val()); 96 $(this).parents('li').remove(); 97 if(blkAddAtendee.find(".attendee-list li").length == 1) 98 blkAddAtendee.find("li.not-attendee").removeClass('hidden'); 99 }) 100 .addClass('tiny disable ui-button-disabled ui-state-disabled') 101 .removeClass('new').end() 102 103 .filter(".delegate.new").button({ 104 icons: { 105 primary: "ui-icon-transferthick-e-w" 106 }, 107 text: false 108 }).click(function () { 109 110 if($(this).hasClass('attendee-permissions-change-button')){ 111 $(this).removeClass('attendee-permissions-change-button') 112 .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end(); 113 114 $(this).parents('li').find('input[name="delegatedFrom[]"]').val(''); 115 116 blkAddAtendee.find('.request-update').addClass('hidden'); 117 blkAddAtendee.find('.status option').toggleClass('hidden'); 118 119 120 blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change'); 121 122 }else{ 123 blkAddAtendee.find('.delegate').removeClass('attendee-permissions-change-button'); 124 blkAddAtendee.find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change'); 125 126 $(this).addClass('attendee-permissions-change-button') 127 .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end(); 128 $(this).parents('li').find('input[name="delegatedFrom[]"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val()); 129 130 blkAddAtendee.find('.request-update').removeClass('hidden'); 131 if(blkAddAtendee.find('.status option.hidden').length == 1) 132 blkAddAtendee.find('.status option').toggleClass('hidden'); 133 134 blkAddAtendee.find('option[value=5]').attr('selected','selected').trigger('change'); 135 } 136 }) 137 .addClass('tiny disable ui-button-disabled ui-state-disabled') 138 .removeClass('new').end() 139 140 .filter(".edit.new").button({ 141 icons: { 142 primary: "ui-icon-key" 143 }, 144 text: false 145 }).click(function() { 146 147 if(!!!checked) 148 $(this).parents('li').find('[type=checkbox]').attr('checked', (!$(this).parent().find('[type=checkbox]').is(':checked'))).end(); 149 150 var aclsParticipant = $(this).parents('li').find('input[name="attendeeAcl[]"]').val(); 151 checked = false; 152 153 if( $('.qtip.qtip-blue.qtip-active').val() !== ''){ 154 blkAddAtendee.find('dd.attendee-list').qtip({ 155 show: {ready: true, solo: true, when: {event: 'click'}}, 156 hide: false, 157 content: { 158 text: $('<div></div>').html( DataLayer.render( 'templates/attendee_permissions.ejs', {} ) ), 159 title: { 160 text:'Permissões', 161 button: '<a class="button close" href="#">close</a>' 162 } 163 }, 164 style: {name: 'blue', tip: {corner: 'leftMiddle'}, border: {width: 4, radius: 8}, width: {min: 230, max:230}}, 165 position: { 166 corner: { 167 target: 'rightMiddle', 168 tooltip: 'leftMiddle' 169 }, 170 adjust: {x:0, y:0} 171 } 172 }) 173 .qtip("api").onShow = function(arg0) { 174 $('.qtip-active .button.close').button({ 175 icons: {primary: "ui-icon-close"}, 176 text: false 177 }) 178 .click(function(){ 179 blkAddAtendee.find('dd.attendee-list').qtip('destroy'); 180 }); 181 182 $('.qtip-active .button.save').button().click(function(){ 183 184 var acl = ''; 185 $('.qtip-active').find('[type=checkbox]:checked').each(function(i, obj) { 186 acl+= obj.value; 187 }); 188 189 blkAddAtendee.find('dd.attendee-list [type=checkbox]:checked').siblings('input[name="attendeeAcl[]"]').each(function(i, obj) { 190 obj.value = 'r'+acl; 191 }).parents('li').find('.button.edit').addClass('attendee-permissions-change-button') 192 .find('.ui-icon-key').addClass('attendee-permissions-change'); 193 194 blkAddAtendee.find('dd.attendee-list [type=checkbox]').attr('checked', false); 195 196 blkAddAtendee.find('dd.attendee-list').qtip('destroy'); 197 198 }); 199 $('.qtip-active .button.cancel').button().click(function(){ 200 blkAddAtendee.find('dd.attendee-list [type=checkbox]').attr('checked', false); 201 blkAddAtendee.find('dd.attendee-list').qtip('destroy'); 202 }); 203 204 if(aclsParticipant) 205 for(var i = 1; i < aclsParticipant.length; i++){ 206 $('.qtip-active').find('input[name="'+acl_names[aclsParticipant.charAt(i)]+'"]').attr('checked', true); 207 } 208 209 210 $('.button').button(); 211 212 }; 213 }else{ 214 if(!$('.new-event-win dd.attendee-list').find('[type=checkbox]:checked').length){ 215 blkAddAtendee.find('dd.attendee-list').qtip('destroy'); 216 }else{ 217 $('.qtip-active .button.save .ui-button-text').html('Aplicar a todos') 218 } 219 220 }; 221 }) 222 .addClass('tiny disable ui-button-disabled ui-state-disabled') 223 .removeClass('new').end() 224 225 .filter(".open-delegate.new").click(function(){ 226 if($(this).hasClass('ui-icon-triangle-1-e')){ 227 $(this).removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s'); 228 $(this).parents('li').find('.list-delegates').removeClass('hidden'); 229 }else{ 230 $(this).removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e'); 231 $(this).parents('li').find('.list-delegates').addClass('hidden'); 232 } 233 234 }).removeClass('new'); 235 236 237 blkAddAtendee.find("li input[type=checkbox].new").click(function(){ 238 if(!$('.new-event-win dd.attendee-list').find('[type=checkbox]:checked').length){ 239 blkAddAtendee.find('dd.attendee-list').qtip('destroy'); 240 }else{ 241 checked = true; 242 $(this).parents('li').find('.button.edit').click(); 243 //$('.qtip-active .button.save .ui-button-text').html('Aplicar a todos') 244 } 245 246 checked = true; 247 $(this).parents('li').find('.button.edit').click(); 248 }).removeClass('new'); 249 250 UI.dialogs.addEvent.find('.attendees-list li').hover( 251 function () { 252 $(this).addClass("hover-attendee"); 253 $(this).find('.button').removeClass('disable ui-button-disabled ui-state-disabled').end() 254 .find('.attendee-options').addClass('hover-attendee'); 255 }, 256 function () { 257 $(this).removeClass("hover-attendee"); 258 $(this).find('.button').addClass('disable ui-button-disabled ui-state-disabled').end() 259 .find('.attendee-options').removeClass('hover-attendee');; 260 } 261 ); 262 263 264 } 71 265 72 266 var html = DataLayer.render( path+'templates/event_add.ejs', {event:objEvent}); … … 99 293 if(clicked == 'Descartar alterações') { 100 294 canDiscardEventDialog = true; 295 /** 296 *Remoção dos anexos do eventos caso seja cancelado a edição 297 */ 298 var ids = []; 299 $.each($('.attachment-list input'), function (i, input) { ids.push(input.value); }); 300 if(ids.length > 0) 301 DataLayer.remove('attachment', {filter: ['IN', 'id', ids]}); 302 101 303 UI.dialogs.addEvent.dialog('close'); 102 304 }else{ … … 256 458 canDiscardEventDialog = true; 257 459 258 UI.dialogs.addEvent.children( ".form-addevent").submit();460 UI.dialogs.addEvent.children().find('form.form-addevent').submit(); 259 461 UI.dialogs.addEvent.dialog("close"); 260 462 }).end() 261 463 262 464 .children(".export").click(function(){ 263 UI.dialogs.addEvent.children( ".form-export").submit();465 UI.dialogs.addEvent.children().find(".form-export").submit(); 264 466 }); 265 467 … … 293 495 }); 294 496 295 // UI.dialogs.addEvent.find('.button-add-attachment').click(function(){ 296 // var li_attach = 297 // '<li class="input_label">' + 298 // '<input type="file" name="attachments[]"" />' + 299 // '</li>'; 300 // jQuery('.attachments-list').append(li_attach); 301 // }); 302 303 var attendeeHtml = DataLayer.render( path+'templates/attendee_add.ejs', {event:objEvent}); 497 498 UI.dialogs.addEvent.find('.button.suggestion-hours').button({ 499 icons: { 500 primary: "ui-icon-clock" 501 }, 502 text: 'Sugerir horário' 503 }).click(function () { 504 $(this).siblings('input').removeAttr('disabled') 505 .end().parents().find('input[name="allDay"]').removeAttr('disabled'); 506 }); 507 508 if(objEvent.me.id == User.me.id){ 509 objEvent.me.id = DataLayer.put('participant', {user: objEvent.me.id, mail: objEvent.me.mail }); 510 objEvent.organizer.id = objEvent.me.id; 511 } 512 513 var attendeeHtml = DataLayer.render( path+'templates/attendee_add.ejs', {event:objEvent}); 304 514 305 515 // load template of attendees 306 516 var blkAddAtendee = UI.dialogs.addEvent.find('#calendar_addevent_details6').append(attendeeHtml); 307 308 blkAddAtendee.find('li.attendee .button').addClass('small '+ (objEvent.isOrganizer == 1 ? '' : 'hidden')).button({text:false, icons: {primary:'ui-icon-close'}}).click(function () { 309 DataLayer.remove('participant', $(this).parent().find('[type=checkbox]').val()); 310 $(this).parent().remove(); 311 }); 517 if(objEvent.attendee.length) 518 callbackAttendee(); 519 /** 520 Opções de delegação do participante/organizer 521 */ 522 blkAddAtendee.find(".button.participant-delegate").button({ 523 icons: { 524 primary: "ui-icon-transferthick-e-w" 525 }, 526 text: false 527 }).click(function () { 528 if($(this).hasClass('attendee-permissions-change-button')){ 529 if(!$(this).hasClass('disable')){ 530 $(this).removeClass('attendee-permissions-change-button') 531 .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end(); 532 blkAddAtendee.find('.block-add-attendee.search').addClass('hidden'); 533 blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos'); 534 } 535 }else{ 536 $(this).addClass('attendee-permissions-change-button') 537 .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end(); 538 blkAddAtendee.find('.block-add-attendee.search dt').html('Delegar participação para'); 539 blkAddAtendee.find('.block-add-attendee.search').removeClass('hidden'); 540 blkAddAtendee.find('.block-add-attendee.search input.search').focus(); 541 } 542 }) 543 .addClass('tiny'); 544 312 545 //show or hidden permissions attendees 313 546 //blkAddAtendee.find('.block-attendee-list #attendees-users li').click(show_permissions_attendees); … … 481 714 user[0].id = DataLayer.put('participant', {user: user[0].id, isExternal: isExternal}); 482 715 blkAddAtendee.find('dd.attendee-list ul.attendee-list').append( 483 DataLayer.render(path+'templates/participants_add_itemlist.ejs', user)716 DataLayer.render(path+'templates/participants_add_itemlist.ejs', {user:user, acl: objEvent.acl}) 484 717 ) 485 .find('.button.close').addClass('small').button({text:false, icons:{primary:'ui-icon-close'}}).click(function() {486 DataLayer.remove('participant', $(this).parent().find('[type=checkbox]').val());487 $(this).parent().remove();488 }).end()489 718 .scrollTo('max'); 719 callbackAttendee(); 490 720 } 491 721 … … 503 733 504 734 blkAddAtendee.find('dd.attendee-list ul.attendee-list').append( 505 DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{id:newAttendeeId, name: newAttendeeName, mail: newAttendeeEmail, isExternal: 1}]) 506 ).find('.button.close').addClass('small').button({text:false, icons:{primary:'ui-icon-close'}}).click(function() { 507 DataLayer.remove('participant', $(this).parent().find('[type=checkbox]').val()); 508 $(this).parent().remove(); 509 }).end() 510 .scrollTo('max'); 511 735 DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{id:newAttendeeId, name: newAttendeeName, mail: newAttendeeEmail, isExternal: 1, acl: objEvent.acl}]) 736 ).scrollTo('max'); 737 callbackAttendee(); 512 738 513 739 /** … … 573 799 newAttendeeId = DataLayer.put('participant', {user: old_item.find('.id').html(), isExternal: 0}); 574 800 blkAddAtendee.find('dd.attendee-list ul.attendee-list') 575 .append(DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{id: newAttendeeId, name: old_item.find('.name').html(), mail: old_item.find('.mail').html(), isExternal: 0}])) 576 .find('.button').addClass('small').button({text:false, icons: {primary:'ui-icon-close'}}).click(function () { 577 $(this).parent().remove(); 578 }).end() 801 .append(DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{id: newAttendeeId, name: old_item.find('.name').html(), mail: old_item.find('.mail').html(), isExternal: 0, acl: objEvent.acl}])) 579 802 .scrollTo('max'); 580 581 old_item.remove(); 803 /** 804 * Delegação de participação de um participante com permissão apenas de leitura 805 * 806 */ 807 if(!objEvent.acl.organization && !objEvent.acl.write && !objEvent.acl.inviteGuests && objEvent.acl.read ){ 808 809 blkAddAtendee.find('.block-add-attendee.search').addClass('hidden'); 810 blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos'); 811 812 blkAddAtendee.find('.status option').toggleClass('hidden'); 813 blkAddAtendee.find('option[value=5]').attr('selected','selected').trigger('change'); 814 blkAddAtendee.find('.request-update').removeClass('hidden'); 815 816 blkAddAtendee.find('dd.attendee-list ul.attendee-list li .button.close').parents('li').find('input[name="delegatedFrom[]"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val()); 817 818 blkAddAtendee.find('.me .participant-delegate').addClass('disable ui-button-disabled ui-state-disabled'); 819 blkAddAtendee.find(".button.close").button({ 820 icons: { 821 primary: "ui-icon-close" 822 }, 823 text: false 824 }).click(function () { 825 826 $(this).parents('li').find('input[name="delegatedFrom[]"]').val(''); 827 blkAddAtendee.find('.request-update').addClass('hidden'); 828 blkAddAtendee.find('.status option').toggleClass('hidden'); 829 blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change'); 830 blkAddAtendee.find('.me .participant-delegate').removeClass('disable ui-button-disabled ui-state-disabled attendee-permissions-change-button') 831 .find('.ui-icon-person').removeClass('attendee-permissions-change').end(); 832 833 DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val()); 834 $(this).parents('li').remove(); 835 }) 836 .addClass('tiny'); 837 }else{ 838 callbackAttendee(); 839 old_item.remove(); 840 } 582 841 } 583 842 }); … … 586 845 } 587 846 }); 588 589 /* 590 UI.dialogs.addEvent.find('.attendees-list li').hover( 591 function () { 592 $(this).addClass("hover"); 593 }, 594 function () { 595 $(this).removeClass("hover"); 847 //$('.block-add-attendee .search-result-list').selectable(); 848 849 UI.dialogs.addEvent.find('.row.fileupload-buttonbar .button').filter('.delete').button({ 850 icons: { 851 primary: "ui-icon-close" 852 }, 853 text: 'Excluir' 854 }).click(function () { 855 $('.row.fileupload-buttonbar .attachments-list p').remove(); 856 857 var ids = []; 858 $.each($('.attachment-list input'), function (i, input) { ids.push(input.value); }); 859 if(ids.length > 0){ 860 DataLayer.remove('attachment', {filter: ['IN', 'id', ids]}); 861 $('.attachment-list input').remove(); 596 862 } 597 ); 598 */ 599 //$('.block-add-attendee .search-result-list').selectable(); 600 601 UI.dialogs.addEvent.find('.block-attendee-list select.status').change(function(){ 602 if ($(this).val() == 'another') { 603 // jQuery('.block-attendee-list .add-attendee-search').removeClass('hidden'); 604 $(this).qtip({ 605 show: {ready: true}, 606 hide: false, 607 content: { 608 text: $('.block-attendee-list .add-attendee-search').clone().removeClass('hidden'), 609 title: { 610 text:'Indique o participante', 611 button: '<a class="button close" href="#">close</a>' 612 } 613 }, 614 style: {name: 'blue', tip: {corner: 'leftMiddle'}, border: {width: 4, radius: 8}, width: {min: 250, max:250}}, 615 position: { 616 corner: { 617 target: 'rightMiddle', 618 tooltip: 'leftMiddle' 619 }, 620 adjust: {x:0, y:0} 621 } 622 }) 623 $(this).qtip.onShow = function() { 624 $('.qtip .button.close').button({ 625 icons: {primary: "ui-icon-close"}, 626 text: false 627 }); 628 } 629 } else { 630 // jQuery('.block-attendee-list .add-attendee-search').addClass('hidden'); 631 } 632 }); 633 UI.dialogs.addEvent.find(':input').change(function(event){ 634 if (event.keyCode != '27' && event.keyCode != '13') 635 canDiscardEventDialog = false; 636 }).keydown(function(event){ 637 if (event.keyCode != '27' && event.keyCode != '13') 638 canDiscardEventDialog = false; 863 }).end() 864 .filter('.close').button({ 865 icons: { 866 primary: "ui-icon-close" 867 }, 868 text: false 869 }).click(function () { 870 DataLayer.remove('attachment', $(this).parents('p').find('input[name="fileId[]"]').val()); 871 $(this).parents('p').remove(); 872 }).end() 873 .filter('.downlaod-archive').button({ 874 icons: { 875 primary: "ui-icon-arrowthickstop-1-s" 876 }, 877 text: false 639 878 }); 879 880 $('#fileupload').fileupload({ 881 sequentialUploads: true, 882 add: function (e, data) { 883 if(data.files[0].size < 30000000) 884 data.submit(); 885 }, 886 change: function (e, data) { 887 $.each(data.files, function (index, file) { 888 var attach = {}; 889 attach.fileName = file.name; 890 if(file.name.length > 10) 891 attach.fileName = file.name.substr(0, 6) + file.name.substr(file.name.length-4, file.name.length); 892 attach.fileSize = file.size; 893 if(file.size > 30000000) 894 attach.error = 'Tamanho de arquivo nao permitido!!' 895 896 $('.attachments-list').append(DataLayer.render(path+'templates/attachment_add_itemlist.ejs', {file : attach})); 897 898 if(file.size < 30000000){ 899 $('.fileinput-button.new').append(data.fileInput[0]).removeClass('new'); 900 $('.attachments-list').find('[type=file]').addClass('hidden'); 901 902 }else 903 $('.fileinput-button.new').removeClass('new'); 904 905 906 $('.attachments-list').find('.button.close').button({ 907 icons: { 908 primary: "ui-icon-close" 909 }, 910 text: false 911 }).click(function(){ 912 var idAttach = $(this).parent().find('input[name="fileId[]"]').val(); 913 $('.attachment-list').find('input[value="'+idAttach+'"]') 914 $(this).parent().remove(); 915 }); 916 917 })}, 918 progress: function(e, data){ 919 var value = parseInt(data.loaded / data.total * 100, 10); 920 $('.progress.in-progress:first').removeClass('hidden') 921 $('.progress.in-progress:first').progressbar({ 922 value: value 923 }); 924 925 if(value == 100){ 926 $('.progress.in-progress:first').removeClass('in-progress').addClass('on-complete').fadeOut('slow'); 927 } 928 929 }, 930 done: function(e, data){ 931 if(!!data.result && data.result != "[]"){ 932 var newAttach = jQuery.parseJSON(data.result); 933 $('.attachment-list').append('<input tyepe="hidden" name="attachment[]" value="'+newAttach['attachment'][0][0].id+'"/>'); 934 $('.progress.on-complete:first').removeClass('on-complete').parents('p') 935 .append('<input type="hidden" name="fileId[]" value="'+newAttach['attachment'][0][0].id+'"/>') 936 .find('.status-upload').addClass('ui-icon ui-icon-check'); 937 }else 938 $('.progress.on-complete:first').removeClass('on-complete').parents('p').find('.status-upload').addClass('ui-icon ui-icon-cancel'); 939 940 console.log("oi doen"); 941 } 942 }); 943 $('.attachments-list .button').button(); 944 945 946 947 $('#fileupload').bind('fileuploadstart', function () { 948 var widget = $(this), 949 progressElement = $('#fileupload-progress').fadeIn(), 950 interval = 500, 951 total = 0, 952 loaded = 0, 953 loadedBefore = 0, 954 progressTimer, 955 progressHandler = function (e, data) { 956 loaded = data.loaded; 957 total = data.total; 958 }, 959 stopHandler = function () { 960 widget 961 .unbind('fileuploadprogressall', progressHandler) 962 .unbind('fileuploadstop', stopHandler); 963 window.clearInterval(progressTimer); 964 progressElement.fadeOut(function () { 965 progressElement.html(''); 966 }); 967 }, 968 formatTime = function (seconds) { 969 var date = new Date(seconds * 1000); 970 return ('0' + date.getUTCHours()).slice(-2) + ':' + 971 ('0' + date.getUTCMinutes()).slice(-2) + ':' + 972 ('0' + date.getUTCSeconds()).slice(-2); 973 }, 974 formatBytes = function (bytes) { 975 if (bytes >= 1000000000) { 976 return (bytes / 1000000000).toFixed(2) + ' GB'; 977 } 978 if (bytes >= 1000000) { 979 return (bytes / 1000000).toFixed(2) + ' MB'; 980 } 981 if (bytes >= 1000) { 982 return (bytes / 1000).toFixed(2) + ' KB'; 983 } 984 return bytes + ' B'; 985 }, 986 formatPercentage = function (floatValue) { 987 return (floatValue * 100).toFixed(2) + ' %'; 988 }, 989 updateProgressElement = function (loaded, total, bps) { 990 progressElement.html( 991 formatBytes(bps) + 'ps | ' + 992 formatTime((total - loaded) / bps) + ' | ' + 993 formatPercentage(loaded / total) + ' | ' + 994 formatBytes(loaded) + ' / ' + formatBytes(total) 995 ); 996 }, 997 intervalHandler = function () { 998 var diff = loaded - loadedBefore; 999 if (!diff) { 1000 return; 1001 } 1002 loadedBefore = loaded; 1003 updateProgressElement( 1004 loaded, 1005 total, 1006 diff * (1000 / interval) 1007 ); 1008 }; 1009 widget 1010 .bind('fileuploadprogressall', progressHandler) 1011 .bind('fileuploadstop', stopHandler); 1012 progressTimer = window.setInterval(intervalHandler, interval); 1013 }); 1014 1015 UI.dialogs.addEvent.find(':input').change(function(event){ 1016 if (event.keyCode != '27' && event.keyCode != '13') 1017 canDiscardEventDialog = false; 1018 }).keydown(function(event){ 1019 if (event.keyCode != '27' && event.keyCode != '13') 1020 canDiscardEventDialog = false; 1021 }); 1022 640 1023 641 1024 UI.dialogs.addEvent.dialog('open'); -
trunk/prototype/modules/calendar/templates/alarms_add_itemlist.ejs
r5376 r5514 17 17 <input type="hidden" name="isDefaultAlarm[]" value="<%=data.alarm.useAlarmDefault ? 1 : 0%>" /> 18 18 <label> antes de cada evento.</label> 19 <a class="button remove small"></a>19 <a class="button remove tiny"></a> 20 20 </li> 21 21 <%} … … 36 36 <input type="hidden" name="alarmId[]" value="" /> 37 37 <label> antes de cada evento.</label> 38 <a class="button remove small"></a>38 <a class="button remove tiny"></a> 39 39 </li> 40 40 <%}%> -
trunk/prototype/modules/calendar/templates/attendee_add.ejs
r5437 r5514 1 <%var iconStatus = ['','ui-icon-check', 'ui-icon-radio-off', 'ui-icon-close', 'ui-icon-help', 'ui-icon-transferthick-e-w', 'ui-icon-contact'] 2 var legendStatus = ['','Confirmado','Tentativa','Cancelado','Sem Resposta','Delegado', 'Participante'] 3 %> 1 4 <dl class="block-attendee-list attendees-list"> 2 5 <dt class="me"><%= data.event.me.name %></dt> 3 6 <dd class="me"> 4 7 <select class="status" name="status"> 5 <option value="1" <%= data.event.status=='1' ? 'selected="selected"':'' %>>Eu vou</option> 6 <option value="3" <%= data.event.status=='3' ? 'selected="selected"':'' %>>Eu não vou</option> 7 <option value="2" <%= data.event.status=='2' ? 'selected="selected"':'' %>>Talvez</option> 8 <!-- <option value="another">Outra pessoa vai</option>--> 8 <%if(!data.event.delegatedFrom[data.event.me.id]){%> 9 <option value="1" <%= data.event.status=='1' ? 'selected="selected"':'' %>>Eu vou</option> 10 <%if(!data.event.acl.participationRequired){%> 11 <option value="3" <%= data.event.status=='3' ? 'selected="selected"':'' %>>Eu não vou</option> 12 <option value="2" <%= data.event.status=='2' ? 'selected="selected"':'' %>>Talvez</option> 13 <option class="hidden" value="5">Delegado</option> 14 <%}%> 15 <%}else{%> 16 <option value="5" 'selected="selected"'>Delegado</option> 17 <%}%> 9 18 </select> 10 <%if(data.event.organizer.id != data.event.me.id){%> 11 <input type="hidden" name="meId" value="<%=data.event.me.id%>"> 12 <%}%> 13 <fieldset class="add-attendee-search search-field ui-corner-all hidden"> 14 <span class="ui-icon ui-icon-search"></span> 15 <input class="search" type="text" /> 16 </fieldset> 19 <% if (!data.event.acl.organization && !data.event.acl.write && !data.event.acl.inviteGuests && !data.event.acl.participationRequired && !data.event.delegatedFrom[data.event.me.id] ) { %> 20 <fieldset class="add-attendee-options-read"> 21 <a href="#" class="button participant-delegate add-attendee-options-button">Delegar participação a um novo participante</a> 22 </fieldset> 23 <% } %> 24 25 <p class="input-group request-update <%=data.event.delegatedFrom[data.event.me.id] ? '' : "hidden"%>"> 26 <input type="checkbox" name="receiveNotification" value="true" <%=data.event.me.receiveNotification=='1' ? 'checked="checked"' : ''%>/> 27 <label for="request-update">Receber atualizações</label> 28 </p> 29 30 <input type="hidden" name="delegatedFrom[]" value="<%=data.event.me.delegatedFrom%>"> 31 32 <input type="hidden" name="attendee[]" value="<%=data.event.me.id%>"> 33 <input type="hidden" name="attendeeType[]" value="0"> 34 <input type="hidden" name="attendeeAcl[]" value="<%=data.event.me.acl%>"> 35 17 36 </dd> 18 37 … … 20 39 <dd class="attendee-list"> 21 40 <ul class="attendee-list"> 22 <li class="organizer <%= data.event.organizer.id == data.event.me.id ? "hidden" : ''%>">41 <li class="organizer <%= (data.event.acl.organization) ? "hidden" : "" %>"> 23 42 <div style="overflow:hidden; width:100%; display:table;"> 24 <input type="checkbox" value="<%= data.event.organizer.id %>" disabled="disabled"> 25 <input type="hidden" name="attendee[]" value="<%=data.event.organizer.id%>"> 26 <input type="hidden" name="attendeeType[]" value="0"> 27 <input type="hidden" name="attendee_organizer[]" value="<%=data.event.organizer.id%>"> 28 <label for="attendee_organizer" title="<%= data.event.organizer.name ? data.event.organizer.name: '' %>" class="name"><%= data.event.organizer.name ? data.event.organizer.name : '' %></label> 29 <label for="attendee_organizer" title="<%= data.event.organizer.mail ? data.event.organizer.mail: '' %>" class="mail"><%= data.event.organizer.mail ? data.event.organizer.mail : '' %></label> 30 <% if (data.event.me.id == data.event.organizer.id && false) { %> 31 <span class="button small swap">Mudar organizador</span> 32 <% } %> 43 <span class="space-status ui-icon <%=iconStatus[data.event.organizer.status]%>" title="<%=legendStatus[data.event.organizer.status]%>"></span> 44 <span class="space-special ui-icon ui-icon-person" title="Organizador"></span> 45 <% if (!data.event.acl.organization && (data.event.organizer.id != data.event.me.id )) { %> 46 <input type="checkbox" value="<%= data.event.organizer.id %>" disabled="disabled"> 47 <input type="hidden" name="attendee[]" value="<%=data.event.organizer.id%>"> 48 <input type="hidden" name="attendeeType[]" value="0"> 49 <input type="hidden" name="attendeeAcl[]" value="<%=data.event.organizer.acl%>"> 50 <input type="hidden" name="delegatedFrom[]" value="<%=data.event.organizer.delegatedFrom%>"> 51 <%}%> 52 <input type="hidden" name="attendee_organizer" value="<%=data.event.organizer.id%>"> 53 <label for="attendee_organizer" title="<%= data.event.organizer.name ? data.event.organizer.name: '' %>" class="name name-special"><%= data.event.organizer.name ? data.event.organizer.name : '' %></label> 54 <label for="attendee_organizer" title="<%= data.event.organizer.mail ? data.event.organizer.mail: '' %>" class="mail name-special"><%= data.event.organizer.mail ? data.event.organizer.mail : '' %></label> 33 55 </div> 34 </li> 35 36 <% if (data.event && data.event.attendee) { 37 for (var i=0; i< data.event.attendee.length; i++) { 38 %> 39 <li class="attendee"> 56 </li> 57 <%if(!!data.event.delegatedFrom[data.event.me.id]){ 58 var delegated_me = data.event.delegatedFrom[data.event.me.id]%> 59 <li class="me-delegated"> 40 60 <div style="overflow:hidden; width:100%; display:table;"> 41 <input type="checkbox" value="<%= data.event.attendee[i].id %>" disabled="disabled"> 42 <input type="hidden" name="attendee[]" value="<%=data.event.attendee[i].id%>"> 43 <input type="hidden" name="attendeeType[]" value="<%=data.event.attendee[i].isExternal%>"> 44 <label title="<%= data.event.attendee[i].name ? data.event.attendee[i].name: '' %>" class="name"><%= data.event.attendee[i].name ? data.event.attendee[i].name : '' %></label> 45 <label title="<%= data.event.attendee[i].mail ? data.event.attendee[i].mail : '' %>" class="mail"><%= data.event.attendee[i].mail ? data.event.attendee[i].mail : '' %></label> 46 <span class="ui-icon ui-icon-close ui-corner-all ui-icon-float-right"></span> 47 </div> 48 <a class="button close">X</a> 61 <span class="space-status ui-icon <%=iconStatus[delegated_me.status]%>" title="<%=legendStatus[delegated_me.status]%>"></span> 62 <span class="space-special ui-icon <%=iconStatus[5]%>" title="Delegado para"></span> 63 <input type="checkbox" value="<%= delegated_me.id%>" disabled="disabled"> 64 <label for="me-delegated" title="<%= delegated_me.name ? delegated_me.name: '' %>" class="name name-special"><%= delegated_me.name ? delegated_me.name : '' %></label> 65 <label for="me-delegated" title="<%= delegated_me.mail ? delegated_me.mail: '' %>" class="mail name-special"><%= delegated_me.mail ? delegated_me.mail : '' %></label> 66 </div> 49 67 </li> 50 51 52 53 <% 54 } 55 } else { %> 56 <li>Não há outros participantes.</li> 68 <%}%> 69 <% if (data.event && data.event.attendee.length > 0) { 70 for (var i=0; i< data.event.attendee.length; i++) {%> 71 <li class="attendee"> 72 <div style="overflow:hidden; width:100%; display:table;"> 73 <%if(data.event.delegatedFrom[data.event.attendee[i].id]){%> 74 <span class="open-delegate new ui-icon ui-icon-triangle-1-e"></span> 75 <%}else{%> 76 <span class="space-status ui-icon <%=iconStatus[data.event.attendee[i].status]%>" title="<%=legendStatus[data.event.attendee[i].status]%>"></span> 77 <%}%> 78 <span class="space-special ui-icon <%= !!data.event.delegatedFrom[data.event.attendee[i].id] ? iconStatus[5] : iconStatus[6]%>" title="<%=!!data.event.delegatedFrom[data.event.attendee[i].id] ? legendStatus[5] : legendStatus[6]%>"></span> 79 <%if(data.event.acl.organization || data.event.acl.write){%> 80 <input type="checkbox" value="<%= data.event.attendee[i].id %>"> 81 <%}else{%> 82 <input type="checkbox" value="<%= data.event.attendee[i].id%>" disabled="disabled"> 83 <%}%> 84 <input type="hidden" name="attendee[]" value="<%=data.event.attendee[i].id%>"> 85 <input type="hidden" name="attendeeType[]" value="<%=data.event.attendee[i].isExternal%>"> 86 <input type="hidden" name="attendeeAcl[]" value="<%=data.event.attendee[i].acl%>"> 87 <input type="hidden" name="delegatedFrom[]" value="<%=data.event.attendee[i].delegatedFrom%>"> 88 <label title="<%= data.event.attendee[i].name ? data.event.attendee[i].name: '' %>" class="name <%= !!data.event.delegatedFrom[data.event.attendee[i].id] ? "name-special-delegated" : "name-special" %>"><%= data.event.attendee[i].name ? data.event.attendee[i].name : '' %></label> 89 <label title="<%= data.event.attendee[i].mail ? data.event.attendee[i].mail : ''%>" class="mail <%= !!data.event.delegatedFrom[data.event.attendee[i].id] ? "name-special-delegated" : "name-special"%>"><%= data.event.attendee[i].mail ? data.event.attendee[i].mail : '' %></label> 90 <span class="ui-icon ui-icon-close ui-corner-all ui-icon-float-right"></span> 91 </div> 92 <div class="attendee-options"> 93 <%if(data.event.acl.organization || data.event.acl.write){%> 94 <a class="button edit attendee-options-button-edit new">Editar permissões</a> 95 <a class="button close new">Remover</a> 96 <%}%> 97 </div> 98 99 100 <%if(!!data.event.delegatedFrom[data.event.attendee[i].id]){%> 101 <%var attendee = data.event.delegatedFrom[data.event.attendee[i].id]%> 102 <% while(attendee != 0){%> 103 <div class="list-delegates hidden"> 104 <div style="overflow:hidden; width:100%; display:table;"> 105 <span class="status-delegate ui-icon <%=iconStatus[attendee.status]%>" title="<%=legendStatus[attendee.status]%>"></span> 106 <span class="space-special-delegated ui-icon <%= !!data.event.delegatedFrom[attendee.id] ? iconStatus[5] : iconStatus[6]%>" title="<%=!!data.event.delegatedFrom[attendee.id] ? legendStatus[5] : legendStatus[6]%>"></span> 107 <input type="hidden" name="attendee[]" value="<%=attendee.id%>"> 108 <input type="hidden" name="attendeeType[]" value="<%=attendee.isExternal%>"> 109 <input type="hidden" name="attendeeAcl[]" value="<%=attendee.acl%>"> 110 <input type="hidden" name="delegatedFrom[]" value="<%=attendee.delegatedFrom%>"> 111 <label title="<%= attendee.name ? attendee.name : '' %>" class="name <%=attendee.status == 5 ? "name-status-delegated-delegated" : "name-status-delegated-none"%>"><%= attendee.name ? attendee.name : '' %></label> 112 <label title="<%= attendee.mail ? attendee.mail : '' %>" class="mail <%=attendee.status == 5 ? "name-status-delegated-none" : "name-status-delegated-none"%>"><%= attendee.mail ? attendee.mail : '' %></label> 113 <span class="ui-icon ui-icon-close ui-corner-all ui-icon-float-right"></span> 114 </div> 115 </div> 116 <%attendee = !!data.event.delegatedFrom[attendee.id] ? data.event.delegatedFrom[attendee.id] : 0%> 117 <%}%> 118 <%}%> 119 120 121 </li> 122 <%} 123 } else if(data.event.me.id == data.event.organizer.id && !(data.event.attendee.length > 0) ) { %> 124 <li class="not-attendee">Não há outros participantes.</li> 57 125 <% } %> 58 126 </ul> … … 86 154 87 155 </dl> 88 <% if (data.event.isOrganizer == 1) {%>89 <dl class="block-add-attendee">90 <dt class="add-attendee">Adicionarconvidados</dt>91 92 93 94 95 96 97 156 <% var isSearch = (data.event.acl.organization || data.event.acl.write || data.event.acl.inviteGuests) ? '' : 'hidden' %> 157 <dl class="block-add-attendee search <%=isSearch%>"> 158 <dt class="add-attendee search">Adicionar outros convidados</dt> 159 <dd class="add-attendee"> 160 <fieldset class="block-add-attendee" title="Participantes"> 161 <fieldset class="add-attendee-search search-field ui-corner-all"> 162 <span class="ui-icon ui-icon-search"></span> 163 <input class="search" type="text" /> 164 </fieldset> 165 <ul class="search-result-list ui-corner-all"> 98 166 99 167 </ul> 100 168 101 </fieldset> 169 </fieldset> 170 </dd> 171 </dl> 102 172 103 <fieldset class="block-add-attendee-permissions ui-corner-all hidden">104 <legend>Convidados podem:</legend>105 <ul class="add-attendee-permissions-list">106 <li><input type="checkbox" name="attendee-mod-event"><label for="attendee-mod-event">Modificar evento </label></li>107 <li><input type="checkbox" name="attendee-invite-others"><label for="attendee-invite-others">Convidar outros</label></li>108 <li><input type="checkbox" name="attendee-view-list-invited"><label for="attendee-view-list-invited">Ver lista de convidados</label></li>109 <li><input type="checkbox" name="attendee-optional"><label for="attendee-optional">Participação opcional</label></li>110 </ul>111 </fieldset>112 </dd>113 </dl>114 <% } %> -
trunk/prototype/modules/calendar/templates/event_add.ejs
r5511 r5514 1 < !--<div title="Criar Evento" class="new-event-win active"> -->2 <form method="POST" action="<%=( (data.event.isOrganizer == 0) && (data.event.id)) ? "schedulable:preview" : "schedulable:detail"%>" class="form-addevent content">1 <div title="Criar Evento" class="div-addevent content"> 2 <form method="POST" action="<%=(data.event.acl.organization || data.event.acl.write) ? "schedulable:detail" : "schedulable:preview"%>" class="form-addevent content"> 3 3 4 4 <fieldset id="calendar_addevent_details1"> 5 5 <legend class="hidden">Detalhes do evento</legend> 6 6 <p class="input-group"> 7 <input type="text" class="h1" name="summary" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> value="<%= (data.event.summary) ? data.event.summary : '' %>"/>7 <input type="text" class="h1" name="summary" <%=(data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> value="<%= (data.event.summary) ? data.event.summary : '' %>"/> 8 8 <% if( data.event.id ){ %> 9 9 <input type="hidden" class="id-event" name="idEvent" value="<%= data.event.id %>"/> … … 11 11 </p> 12 12 <p class="input-group date-info"> 13 <input type="text" class="date start-date" value="<%= (data.event.startDate) ? data.event.startDate : '' %>" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> name="startDate" />14 <input type="text" class="time start-time<%= (data.event.allDay) ? ' hidden' : '' %>" value="<%= (data.event.startHour) ? data.event.startHour : '' %>" <%= (data.event. isOrganizer == 0) ? 'disabled="disabled"' : '' %> name="startHour" />13 <input type="text" class="date start-date" value="<%= (data.event.startDate) ? data.event.startDate : '' %>" <%=(data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> name="startDate" /> 14 <input type="text" class="time start-time<%= (data.event.allDay) ? ' hidden' : '' %>" value="<%= (data.event.startHour) ? data.event.startHour : '' %>" <%= (data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> name="startHour" /> 15 15 <span>até</span> 16 <input type="text" class="date end-date" value="<%= (data.event.endDate) ? data.event.endDate : '' %>" <%= (data.event. isOrganizer == 0) ? 'disabled="disabled"' : '' %> name="endDate" />17 <input type="text" class="time end-time<%= (data.event.allDay) ? ' hidden' : '' %>" value="<%= (data.event.endHour) ? data.event.endHour : '' %>" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> name="endHour" />18 19 <a href="#" class="calendar_addevent_details_lnk_timezone ">Fuso horário</a>16 <input type="text" class="date end-date" value="<%= (data.event.endDate) ? data.event.endDate : '' %>" <%= (data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> name="endDate" /> 17 <input type="text" class="time end-time<%= (data.event.allDay) ? ' hidden' : '' %>" value="<%= (data.event.endHour) ? data.event.endHour : '' %>" <%=(data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> name="endHour" /> 18 19 <a href="#" class="calendar_addevent_details_lnk_timezone <%=((!data.event.acl.organization || !data.event.acl.write) && (data.event.id)) ? "hidden" : '' %>">Fuso horário</a> 20 20 <!-- <input type="text" name="timezone" style="display: none;" />--> 21 21 <select name="timezone" class="hidden calendar-addevent-details-txt-timezone"> … … 25 25 <% } %> 26 26 </select> 27 </p> 28 27 28 <a class="button suggestion-hours small <%=(data.event.acl.organization || data.event.acl.write) ? "hidden" : '' %>" href="#">Sugerir horário</a> 29 30 </p> 31 29 32 <div class="ui-widget messages-validation hidden"> 30 33 <div style="padding: 0.2em 0.7em;" class="ui-state-error ui-corner-all"> … … 37 40 38 41 <p class="input-group event-type"> 39 <input type="checkbox" name="allDay" value="true" <%= (data.event. isOrganizer == 0) ? 'disabled="disabled"' : '' %> <%= (data.event.allDay) ? 'checked="checked"' : '' %>/>42 <input type="checkbox" name="allDay" value="true" <%= (data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> <%= (data.event.allDay) ? 'checked="checked"' : '' %>/> 40 43 <label for="allDay">Dia inteiro</label> 41 44 <!-- … … 48 51 <!-- <li><a href="#calendar_addevent_details3">Repetir</a></li>--> 49 52 <li><a href="#calendar_addevent_details4">Lembretes</a></li> 50 <!-- <li><a href="#calendar_addevent_details4" style="color:#BBB;">Anexos</a></li>-->53 <li><a href="#calendar_addevent_details5">Anexos</a></li> 51 54 <li><a href="#calendar_addevent_details6">Participantes</a></li> 52 55 </ul> … … 55 58 <p class="input-group event-info"> 56 59 <label for="calendar_addevent_details_txt_local">Onde</label> 57 <input type="text" name="location" <%= (data.event.isOrganizer == 0) ? 'disabled="disabled"' : '' %> value="<%= (data.event) ? data.event.location : '' %>"/>60 <input type="text" name="location" <%=(data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> value="<%= (data.event) ? data.event.location : '' %>"/> 58 61 </p> 59 62 60 63 <p class="input-group"> 61 64 <label for="calendar_addevent_details_txtarea_description" class="for-textarea" >Descrição</label> 62 <textarea name="description" <%= (data.event. isOrganizer == 0) ? 'disabled="disabled"' : '' %> ><%=(data.event) ? data.event.description : '' %></textarea>65 <textarea name="description" <%= (data.event.acl.organization || data.event.acl.write) ? '' : 'disabled="disabled"' %> ><%=(data.event) ? data.event.description : '' %></textarea> 63 66 </p> 64 67 … … 144 147 <fieldset id="calendar_addevent_details6" class="tab-level2" title="Participantes"> 145 148 </fieldset> 149 150 151 <fieldset class="attachment-list hidden"> 152 </fieldset> 146 153 </form> 147 <form action="../../../../upload.php" method="POST">148 <!-- 154 155 149 156 <fieldset id="calendar_addevent_details5" class="tab-level2"> 150 <span class="input_label">Anexos</span> 151 <ul class="attachments-list"> 152 <% if (data.event && data.event.attachments) { 153 for (var i=0; i< data.event.attachments.length; i++) { 154 %> 155 <li> 156 <a href="<%= data.event.attachments[i].src %>" > 157 <input type="checkbox" name="attachments['<%= data.event.attachments[i].name %>']" checked="checked" /> 158 <label for="calendar_addevent_details_attach_<%=i%>"><%= data.event.attachments[i].name %></label> 159 </a> 160 </li> 161 <% } 162 } 163 %> 164 165 </ul> 166 <span class="button add button-add-attachment">Adicionar anexo</span> 167 168 <div id="fileupload"> 169 <div title="form:upload.php"> 170 <div class="fileupload-buttonbar"> 171 <label class="fileinput-button"> 172 <span>Add files...</span> 173 <input type="file" name="files[]" multiple> 174 </label> 175 <button type="submit" class="start">Start upload</button> 176 <button type="reset" class="cancel">Cancel upload</button> 177 <button type="button" class="delete">Delete files</button> 178 </div> 179 </div> 180 <div class="fileupload-content"> 181 <table class="files"></table> 182 <div class="fileupload-progressbar"></div> 183 </div> 184 </div> 157 <form id="fileupload" action="attachment:detail" method="POST"> 158 <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload --> 159 <div class="row fileupload-buttonbar"> 160 <div class="button-files-upload"> 161 <!-- The fileinput-button span is used to style the file input field as button --> 162 <span class="button btn-success fileinput-button"> 163 <span><i class="icon-plus icon-white"></i> Adicionar</span> 164 <input type="file" name="files[]" multiple> 165 </span> 166 <%if(data.event.acl.organization || data.event.acl.write){%> 167 <button type="button" class="button btn-danger delete"> 168 <i class="icon-trash icon-white"></i> Remover Todos 169 </button> 170 <%}%> 171 </div> 172 <div id="fileupload-progress"></div> 173 <div class="files-list"> 174 <ul class="attachments-list"> 175 <%if(data.event && data.event.attachments){ 176 for (var i=0; i< data.event.attachments.length; i++) { 177 %> 178 <p class="input-group arquive-info"> 179 <label class="lbl-archive-nome">Nome:</label> 180 <span class="archive-nome"><%=data.event.attachments[i].name%></span> 181 182 <label class="lbl-archive-size">Tamanho:</label> 183 <span class="archive-size"><%=data.event.attachments[i].size%> kb</span> 184 <a href="../prototype/getArchive.php?attachment=<%=data.event.attachments[i].id%>" class="button tiny upload downlaod-archive">Download</a> 185 <%if(data.event.acl.organization || data.event.acl.write){%> 186 <span class="button close tiny upload delete-upload" title="Deletar">Deletar</span> 187 <%}%> 188 <input type="hidden" name="fileId[]" value="<%=data.event.attachments[i].id%>"/> 189 </p> 190 <%} 191 }%> 192 193 194 </ul> 195 </div> 196 </div> 197 <br> 198 199 </form> 200 201 </fieldset> 185 202 186 203 </fieldset> … … 194 211 <div class="menu-container footer-container menu-addevent"> 195 212 <% if (data.event.id) { %> 196 <a class="button export" href="#">Exportar</a>197 213 <a class="button export" href="#">Exportar</a> 214 <a class="button delete" href="#">Excluir</a> 198 215 <% } %> 199 216 <a class="button cancel" href="#">Cancelar</a> 200 217 <a class="button save" href="#">Salvar</a> 201 218 </div> 202 < !--</div>-->219 </div> 203 220 <!--<script src="application.js"></script>--> 221 <!--<script src="application.js"></script>--> -
trunk/prototype/modules/calendar/templates/index.ejs
r5468 r5514 40 40 <script type='text/javascript' src='<?= PLUGINSURL ?>/store/jquery.store.js'></script> 41 41 <script type='text/javascript' src='<?= PLUGINSURL ?>/fileupload/jquery.fileupload.js'></script> 42 < script type='text/javascript' src='<?= PLUGINSURL ?>/fileupload/jquery.fileupload-ui.js'></script>42 <!--<script type='text/javascript' src='<?= PLUGINSURL ?>/fileupload/jquery.fileupload-ui.js'></script>--> 43 43 <script type='text/javascript' src='<?= PLUGINSURL ?>/fileupload/jquery.iframe-transport.js'></script> 44 44 <script type='text/javascript' src='<?= PLUGINSURL ?>/store/jquery.store.js'></script> -
trunk/prototype/modules/calendar/templates/participants_add_itemlist.ejs
r5360 r5514 1 1 <li class="attendee"> 2 2 <div style="overflow:hidden; width:100%; display:table;"> 3 <input type="checkbox" value="<%= data[0].id %>" disabled="disabled"> 3 <div class="attendee-options"> 4 <%if(data[0].acl.organization || data[0].acl.write || data[0].acl.inviteGuests){%> 5 <a href="#" class="button delegate attendee-options-button-delegate new">Delegar participação a este participante</a> 6 <%}%> 7 <%if(data[0].acl.organization || data[0].acl.write){%> 8 <a class="button edit attendee-options-button-edit new">Editar permissões</a> 9 <%}%> 10 <a class="button close new">Close</a> 11 </div> 12 13 <input class="new" type="checkbox" value="<%= data[0].id %>"> 4 14 <input type="hidden" name="attendee[]" value="<%= data[0].id %>"> 5 15 <input type="hidden" name="attendeeType[]" value="<%=data[0].isExternal%>"> 16 <input type="hidden" name="attendeeAcl[]" value="r"> 17 <input type="hidden" name="delegatedFrom[]" value="0"> 6 18 <label title="<%= data[0].name ? data[0].name : '' %>" class="name"><%= data[0].name ? data[0].name : '' %></label> 7 <label title="<%= data[0].mail ? data[0].mail : '' %>" class="mail"><%= data[0].mail ? data[0].mail : '' %></label> 8 </div> 9 <a class="button close">Close</a> 19 <label title="<%= data[0].mail ? data[0].mail : '' %>" class="mail <%= data[0].name ? 'hidden' : ''%>"><%= data[0].mail ? data[0].mail : '' %></label> 20 21 </div> 22 10 23 </li>
Note: See TracChangeset
for help on using the changeset viewer.