Lançado Adianti Framework 7.6!
Clique aqui para saber mais
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 completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


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