Full Calendar com opção de LISTA (agenda) Caros, Atualmente esta ferramenta maravilhosa que é o Adianti nos proporciona diversas atividades no campo da Web. Um recurso muito legal do Adianti é o Full Calendar. Porém um dos meus clientes sentiu a necessidade de ver mais organizada a lista de agendamento dele: com isso fui verificar os tipos de Views que o Adianti nos liberou e são estas: Mês, Semana, e Dia. Porém em todas ela...
IM
Full Calendar com opção de LISTA (agenda)  
Caros,

Atualmente esta ferramenta maravilhosa que é o Adianti nos proporciona diversas atividades no campo da Web.
Um recurso muito legal do Adianti é o Full Calendar.
Porém um dos meus clientes sentiu a necessidade de ver mais organizada a lista de agendamento dele: com isso fui verificar os tipos de Views que o Adianti nos liberou e são estas:
Mês, Semana, e Dia.
Porém em todas elas se houver muito registros, a visão fica um pouco gastante!
Com isso, existe um recurso interessante do componente Calendar que é a LISTA, uma especie de listagem de tudo que foi agendando .. facilitando a visualização.
Fui até a documentação oficial do Full Calendar : https://fullcalendar.io
E numa leitura breve, pude adicionar ao Adianti este tipo de visualização;
Porém tive de mudar algumas coisas no fonte do Adianti e sobre isto que peço a colaboração dos desenvolvedores deste framework, para que isso possa ser disponibilizado nas próximas versões:

ALTERAÇÕES : components.min.js
>>> right:"month,agendaWeek,agendaDay,listWeek"} <<<< acrescentei listWeek para que o button apareça no DOM;

>>> tive que desabilitar popover e colocar um title qualquer para funcionar <<<<< não sei como resolver isso.

Vou colocar duas imagens para visualização do feito final.
Grato







Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (20)


ER

Muito Bom Menezes, parabéns!

Super interessante isso, uma outra coisa que meus clientes reclamam muito é sobre as horas, que apresenta somente em hora em hora, tem cliente que queria que mostrasse de 50, 45 minutos, então seria muito bom também se agente pudesse programar a apresentação do horário no calendário!
ER

Muito Bom Menezes, parabéns!

Super interessante isso, uma outra coisa que meus clientes reclamam muito é sobre as horas, que apresenta somente em hora em hora, tem cliente que queria que mostrasse de 50, 45 minutos, então seria muito bom também se agente pudesse programar a apresentação do horário no calendário!
IM

Eu implementei uma tabela que da opção de escolher quanto minutos o cliente quer ! Atualmente eles usam de 15 minutos ! Entoa o agendamento ficou a cada 15 minutos
ER


Foi ai que me chamou a atenção,

Pois foi isso que vi, estou sendo pressionado e sem saber como resolver, o pessoal do adianti até falou em um post meu que iria incluir esse recurso no Adianti Builder em versões futuras, mas até hoje nada, uma solução que fiz foi criar uma tabela de horarios para um funcionário, que quando por exemplo clicar em 8:00 no calendário, o sistema faz um leitura na tabela do funcionário para pegar o horário mais próximo e jogar no formulário de edição, mas isso não fica elegante e também visualmente para identificar seria melhor mostrando dinamicamente direto no calendário!

Se puder compartilhar essa mudança de horários, agradecemos muito meu irmão!
FT

Nossa que legal que ficou! com ctz deveria ser adicionado às próximas versões. Obg por compartilhar!
CJ

Bom dia,

Como desabilitar o popover nesse caso?
IM

Não entendi a pergunta
IM

Não entendi a pergunta
BA

Olá!!
Conseguiu resolver a questão do Popover?
Habilitei o listweek como você e estou com o mesmo problema, que quando não faço a alteração, ao carregar a list ele traz toda sintaxe html...

Estou quebrando a cabeça tentando achar uma solução, para que em uma visualização fique a popover, mas na lista traga uma informação diferente.
BA

Consegui resolver o meu problema, não sei se mais alguém vai ter ele... mas era o seguinte:

Quando habilitei a ListWeek, o popover funcionava na tela Dia/Semana/Mês, porém quando eu entrava na list, aparecia o texto com as tags html, porque estavam usando html escape.
Eu procurei de onde vinha o parâmetro que importava aquela linha, e encontrei ele no arquivo independent-plugins.min.js (A partir da linha 506, coluna 74), alterei a seguinte sintaxe:

<td class="fc-list-item-title '+view.widgetContentClass+'">'+"<a"+seg.event.title+"</a>"+"</td> <<<<<<<<<<<< Deixei ela assim

a partir daí passou a funcionar corretamente, apresentando os dados como eu queria que eles fossem apresentados.
Desculpe se alguém achar isso inutil ou muito simples, mas me tomou dois dias por eu não estar familiarizado ao framework, e ter começado a aprender desenvolvimento web há pouco tempo...
IM

Top !
Depois posto outra modificação que fiz
CR

Pessoal, bom dia.

Queria definir o calendário de 4 slots de 15 minutos.

Verifiquei nas opções do fullcalendar e existe a opção, mas não encontrei no framework.

Para dividir o período de uma hora em 4 slots de 15 minutos, utilize a propriedade slotDuration.

Exemplo: slotDuration: '00:15:00',
ER

Olá Ico Menezes e Carlos Alberto, Alguma Novidade sobre mudar os horários do calendário!?
IM

Vou verificar isso amanhã !
IM

Segue foto com slots de 15 minutos ...
IM

https://ibb.co/X70sDxT
CR

Ico Menezes, boa tarde.

Como você configurou slot de 15 minutos?

Estou precisando muito desta configuração para ajustar no meu projeto.

Att.
IM

entra no grupo do zap ...
https://chat.whatsapp.com/2xVOhQC0GebCJKBGw4qi3z
RI

Existe opção para imprimir no fullcalendar a lista de agendamento?
RI

Problema (2) Usando o Fullcalendar, estou chamando a classe abaixo (form cortina) para cadastrar o agendamento.
Acrescentei campos a mais, tb_medicos_id, tb_convenios_id, tb_procedimentos_id.
Esta gravando certo no DB os código selecionados, mas depois que salvo

Não fica no formulário os valores que busquei nas tabelas primárias; (nome do médico, nome do convenio, e procedimento).

Ao tentar editar também não mostra os valores dos campos relacionados...

Segue Código abaixo, quem puder ajudar... pois já consultei o fórum, livro e exemplos do Tutor e não consegui identificar onde estou falhando.

 
  1. <?php
  2. /**
  3. * calendarEventForm
  4. */
  5. class CalendarEventFormAM extends TPage
  6. {
  7. protected $form_cad;
  8. protected $loaded;
  9. public function __construct()
  10. {
  11. parent::__construct();
  12. parent::setTargetContainer('adianti_right_panel');
  13. //parent::setSize(640, null);
  14. //parent::setTitle('Procedimentos Agendados');
  15. //parent::removePadding();
  16. //parent::setProperty('class', 'window_modal');
  17. // creates the form
  18. $this->form_cad = new BootstrapFormBuilder('form_event');
  19. $this->form_cad->setFormTitle('Agendamento');
  20. $this->form_cad->setProperty('style', 'margin-bottom:0;box-shadow:none;');
  21. $this->form_cad->setClientValidation(true);
  22. $hours = array();
  23. $minutes = array();
  24. for ($n=0; $n<24; $n++) {
  25. $hours[$n] = str_pad($n, 2, '0', STR_PAD_LEFT);
  26. }
  27. for ($n=0; $n<=55; $n+=5) {
  28. $minutes[$n] = str_pad($n, 2, '0', STR_PAD_LEFT);
  29. }
  30. // create the form fields
  31. $view = new THidden('view');
  32. $id = new TEntry('id');
  33. $color = new TColor('color');
  34. $start_date = new TDate('start_date');
  35. $start_hour = new TCombo('start_hour');
  36. $start_minute = new TCombo('start_minute');
  37. $end_date = new TDate('end_date');
  38. $end_hour = new TCombo('end_hour');
  39. $end_minute = new TCombo('end_minute');
  40. $title = new TEntry('title');
  41. $tb_medicos_id = new TDBCombo('tb_medicos_id', 'cedipi', 'TbMedicos', 'id', 'nome');
  42. //$tb_medicos_id = new TDBUniqueSearch('tb_medicos_id', 'cedipi', 'TbMedicos', 'id', 'nome');
  43. //$tb_medicos_id->setMask('({id}) <b>{nome}</b>');
  44. $tb_procedimentos_id = new TDBCombo('tb_procedimentos_id', 'cedipi', 'TbProcedimento', 'id', 'descricao');
  45. $tb_convenios_id = new TDBCombo('tb_convenios_id', 'cedipi', 'TbConvenio', 'id', 'descricao');
  46. $description = new TText('description');
  47. $color->setValue('#3a87ad');
  48. // define the sizes
  49. $id->setSize(40);
  50. $color->setSize(100);
  51. $start_date->setSize(120);
  52. $end_date->setSize(120);
  53. $start_hour->setSize(70);
  54. $end_hour->setSize(70);
  55. $start_minute->setSize(70);
  56. $end_minute->setSize(70);
  57. $title->setSize(400);
  58. $tb_medicos_id->setSize('100%');
  59. $tb_procedimentos_id->setSize('100%');
  60. $tb_convenios_id->setSize('100%');
  61. $description->setSize(400, 50);
  62. // custom
  63. $id->setEditable(FALSE);
  64. $start_date->setMask('dd/mm/yyyy');
  65. $start_date->setDatabaseMask('yyyy-mm-dd');
  66. $end_date->setMask('dd/mm/yyyy');
  67. $end_date->setDatabaseMask('yyyy-mm-dd');
  68. $title->addValidation('Titulo', new TRequiredValidator );
  69. $start_hour->addItems($hours);
  70. $start_minute->addItems($minutes);
  71. $end_hour->addItems($hours);
  72. $end_minute->addItems($minutes);
  73. $start_hour->setChangeAction(new TAction(array($this, 'onChangeStartHour')));
  74. $end_hour->setChangeAction(new TAction(array($this, 'onChangeEndHour')));
  75. $start_date->setExitAction(new TAction(array($this, 'onChangeStartDate')));
  76. $end_date->setExitAction(new TAction(array($this, 'onChangeEndDate')));
  77. $tb_medicos_id->addValidation('medicos_id', new TRequiredValidator);
  78. $tb_procedimentos_id->addValidation('procedimentos_id', new TRequiredValidator);
  79. $tb_convenios_id->addValidation('convenios_id', new TRequiredValidator);
  80. // add one row for each form field
  81. $this->form_cad->addFields( [$view] );
  82. $this->form_cad->addFields( [new TLabel('ID:')], [$id] );
  83. $this->form_cad->addFields( [new TLabel('Cor')], [$color] );
  84. $this->form_cad->addFields( [new TLabel('Hr início')], [$start_date, $start_hour, ':', $start_minute] );
  85. $this->form_cad->addFields( [new TLabel('Hr término')], [$end_date, $end_hour, ':', $end_minute] );
  86. $this->form_cad->addFields( [new TLabel('Título')], [$title] );
  87. $this->form_cad->addFields( [new TLabel('Médico')], [$tb_medicos_id]);
  88. $this->form_cad->addFields( [new TLabel('Procedimento')], [$tb_procedimentos_id]);
  89. $this->form_cad->addFields( [new TLabel('Convênio')], [$tb_convenios_id]);
  90. $this->form_cad->addFields( [new TLabel('Descrição')], [$description] );
  91. //botoes
  92. $this->form_cad->addAction( _t('Save'), new TAction(array($this, 'onSave')), 'fa:save green');
  93. $this->form_cad->addAction( _t('Clear'), new TAction(array($this, 'onEdit')), 'fa:eraser orange');
  94. $this->form_cad->addAction( _t('Delete'), new TAction(array($this, 'onDelete')), 'fa:trash-o red');
  95. $this->form_cad->addHeaderActionLink( _t('Close'), new TAction(array($this, 'onClose')), 'fa:times red');
  96. parent::add($this->form_cad);
  97. }
  98. public static function onClose($param)
  99. {
  100. TScript::create("Template.closeRightPanel()");
  101. }
  102. /**
  103. * Executed when user leaves start hour field
  104. */
  105. public static function onChangeStartHour($param=NULL)
  106. {
  107. $obj = new stdClass;
  108. if (empty($param['start_minute']))
  109. {
  110. $obj->start_minute = '0';
  111. TForm::sendData('form_event', $obj);
  112. }
  113. if (empty($param['end_hour']) AND empty($param['end_minute']))
  114. {
  115. $obj->end_hour = $param['start_hour'] +1;
  116. $obj->end_minute = '0';
  117. TForm::sendData('form_event', $obj);
  118. }
  119. }
  120. /**
  121. * Executed when user leaves end hour field
  122. */
  123. public static function onChangeEndHour($param=NULL)
  124. {
  125. if (empty($param['end_minute']))
  126. {
  127. $obj = new stdClass;
  128. $obj->end_minute = '0';
  129. TForm::sendData('form_event', $obj);
  130. }
  131. }
  132. /**
  133. * Executed when user leaves start date field
  134. */
  135. public static function onChangeStartDate($param=NULL)
  136. {
  137. if (empty($param['end_date']) AND !empty($param['start_date']))
  138. {
  139. $obj = new stdClass;
  140. $obj->end_date = $param['start_date'];
  141. TForm::sendData('form_event', $obj);
  142. }
  143. }
  144. /**
  145. * Executed when user leaves end date field
  146. */
  147. public static function onChangeEndDate($param=NULL)
  148. {
  149. if (empty($param['end_hour']) AND empty($param['end_minute']) AND !empty($param['start_hour']))
  150. {
  151. $obj = new stdClass;
  152. $obj->end_hour = min($param['start_hour'],22) +1;
  153. $obj->end_minute = '0';
  154. TForm::sendData('form_event', $obj);
  155. }
  156. }
  157. /**
  158. * method onSave()
  159. * Executed whenever the user clicks at the save button
  160. */
  161. public function onSave()
  162. {
  163. try
  164. {
  165. TTransaction::open('cedipi');
  166. $this->form_cad->validate();
  167. $data = $this->form_cad->getData();
  168. $object = new TbMedAgenda;
  169. $object->color = $data->color;
  170. $object->id = $data->id;
  171. $object->title = $data->title;
  172. $object->description = $data->description;
  173. $object->start_time = $data->start_date . ' ' . str_pad($data->start_hour, 2, '0', STR_PAD_LEFT) . ':' . str_pad($data->start_minute, 2, '0', STR_PAD_LEFT) . ':00';
  174. $object->end_time = $data->end_date . ' ' . str_pad($data->end_hour, 2, '0', STR_PAD_LEFT) . ':' . str_pad($data->end_minute, 2, '0', STR_PAD_LEFT) . ':00';
  175. $object->user_id = TSession::getValue('userid');
  176. $object->profile_id = TSession::getValue('profileid');
  177. $object->tb_medicos_id = $data->tb_medicos_id;
  178. $object->tb_procedimentos_id = $data->tb_procedimentos_id;
  179. $object->tb_convenios_id = $data->tb_convenios_id;
  180. $object->store();
  181. $data->id = $object->id;
  182. $this->form_cad->setData($data);
  183. TTransaction::close();
  184. $posAction = new TAction(array('FullCalendarAgMed', 'onReload'));
  185. $posAction->setParameter('view', $data->view);
  186. $posAction->setParameter('date', $data->start_date);
  187. // shows the success message
  188. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'), $posAction);
  189. //TScript::create("Template.closeRightPanel()");
  190. }
  191. catch (Exception $e)
  192. {
  193. new TMessage('error', $e->getMessage());
  194. $this->form_cad->setData( $this->form_cad->getData() );
  195. TTransaction::rollback();
  196. }
  197. }
  198. /**
  199. * method onEdit()
  200. * Executed whenever the user clicks at the edit button da datagrid
  201. */
  202. public function onEdit($param)
  203. {
  204. try
  205. {
  206. if (isset($param['key']))
  207. {
  208. // get the parameter $key
  209. $key=$param['key'];
  210. // open a transaction with database _DATABASE_
  211. TTransaction::open('cedipi');
  212. // instantiates object TbMedAgenda
  213. $object = new TbMedAgenda($key);
  214. $data = new stdClass;
  215. $data->id = $object->id;
  216. $data->color = $object->color;
  217. $data->title = $object->title;
  218. $data->description = $object->description;
  219. $data->start_date = substr($object->start_time,0,10);
  220. $data->start_hour = substr($object->start_time,11,2);
  221. $data->start_minute = substr($object->start_time,14,2);
  222. $data->end_date = substr($object->end_time,0,10);
  223. $data->end_hour = substr($object->end_time,11,2);
  224. $data->end_minute = substr($object->end_time,14,2);
  225. $data->view = $param['view'];
  226. // fill the form with the active record data
  227. $this->form_cad->setData($data);
  228. // close the transaction
  229. TTransaction::close();
  230. }
  231. else
  232. {
  233. $this->form_cad->clear();
  234. }
  235. }
  236. catch (Exception $e) // in case of exception
  237. {
  238. // shows the exception error message
  239. new TMessage('error', $e->getMessage());
  240. // undo all pending operations
  241. TTransaction::rollback();
  242. }
  243. }
  244. /**
  245. * Delete event
  246. */
  247. public static function onDelete($param)
  248. {
  249. // define the delete action
  250. $action = new TAction(array('CalendarEventFormAM', 'Delete'));
  251. $action->setParameters($param); // pass the key parameter ahead
  252. TSession::setValue('dt_posicionada', $param['start_date']);
  253. // shows a dialog to the user
  254. new TQuestion(AdiantiCoreTranslator::translate('Do you really want to delete ?'), $action);
  255. }
  256. /**
  257. * Delete a record
  258. */
  259. public static function Delete($param)
  260. {
  261. try
  262. {
  263. // get the parameter $key
  264. $key = $param['id'];
  265. // open a transaction with database
  266. TTransaction::open('cedipi');
  267. // instantiates object
  268. $object = new TbMedAgenda($key, FALSE);
  269. // deletes the object from the database
  270. $object->delete();
  271. // close the transaction
  272. TTransaction::close();
  273. $posAction = new TAction(['FullCalendarAgMed', 'onReload']);
  274. $posAction->setParameter('view', $param['view']);
  275. //$posAction->setParameter('date', substr($param['start_date'],0,10));
  276. $posAction->setParameter('date', $param['start_date']);
  277. // shows the success message
  278. new TMessage('info', AdiantiCoreTranslator::translate('Record deleted'), $posAction);
  279. }
  280. catch (Exception $e) // in case of exception
  281. {
  282. // shows the exception error message
  283. new TMessage('error', $e->getMessage());
  284. // undo all pending operations
  285. TTransaction::rollback();
  286. }
  287. }
  288. /**
  289. * Fill form from the user selected time
  290. */
  291. public function onStartEdit($param)
  292. {
  293. $this->form_cad->clear();
  294. $data = new stdClass;
  295. $data->view = $param['view']; // calendar view
  296. $data->color = '#3a87ad';
  297. if ($param['date'])
  298. {
  299. if (strlen($param['date']) == 10)
  300. {
  301. $data->start_date = $param['date'];
  302. $data->end_date = $param['date'];
  303. }
  304. if (strlen($param['date']) == 19)
  305. {
  306. $data->start_date = substr($param['date'],0,10);
  307. $data->start_hour = substr($param['date'],11,2);
  308. $data->start_minute = substr($param['date'],14,2);
  309. $data->end_date = substr($param['date'],0,10);
  310. $data->end_hour = substr($param['date'],11,2); //+ 1 padrao
  311. $data->end_minute = substr($param['date'],14,2);
  312. }
  313. $this->form_cad->setData( $data );
  314. }
  315. }
  316. /**
  317. * Update event. Result of the drag and drop or resize.
  318. */
  319. public static function onUpdateEvent($param)
  320. {
  321. try
  322. {
  323. if (isset($param['id']))
  324. {
  325. $key=$param['id'];
  326. TTransaction::open('cedipi');
  327. $object = new TbMedAgenda($key);
  328. $object->start_time = str_replace('T', ' ', $param['start_time']);
  329. $object->end_time = str_replace('T', ' ', $param['end_time']);
  330. $object->store();
  331. TTransaction::close();
  332. }
  333. }
  334. catch (Exception $e)
  335. {
  336. new TMessage('error', $e->getMessage());
  337. TTransaction::rollback();
  338. }
  339. }
  340. }