Schedule - Agenda web

Pessoal,
preciso desenvolver uma agenda semelhande a do google, onde eu possa persistir na minha base os dados.
cheguei a usar o schedule do tomahawk, ele funciona perfeitamente, mas falta apenas um detalhe que
é o mais relevante, eu preciso que as tarefas agendadas fiquem “pintadas” de cores diferentes(igual do google).
ex:
se for cadastrado uma tarefa que vai de segunda a sexta, visualizando no calendario mensal, tera que ter uma linha
ligando os 5 dias, isso tem no tomahawk, mas somente se eu clicar em cima da tarefa, ela fica azul…

se alguem souber uma solução para meu problema ou conheça outra ferramenta que possa resolver isso.

Obrigado

Olá helton87,

É possível fazer isso como o schedule do Tomahawk sim.
Você precisa estender a classe ScheduleEntryRenderer para mudar as cores de acordo com seu gosto.

Esses 2 links podem te ajudar:

http://www.docjar.com/html/api/org/apache/myfaces/custom/schedule/renderer/DefaultScheduleEntryRenderer.java.html

[]'s

Opa,

vlw dansouza, na verdade eu tenho que sobrescrever os metodos do tomahawk?
vc nao tem uma classe sua que vc usou esse esquema de cores so para eu ver como vc fez?

[]

Exatamente, vc tem que criar uma classe customizada que implemente as cores.

Crie uma classe que estenda DefaultScheduleEntry, adicionando o método um atributo color(get/set)

public class SchedulerEntryExtended extends DefaultScheduleEntry {

	private static final long serialVersionUID = 2131962103765021189L;

	private String color;

	public SchedulerEntryExtended() {
		super();
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}
}

Depois… Você estende a classe DefaultScheduleEntryRenderer, tratando o set da cor!
Note que eu implementei um método getColor que usa o o valor que vc seta no entry da classe anterior!

public class ScheduleEntryRenderer extends DefaultScheduleEntryRenderer {

	private static final long serialVersionUID = 769149814442282103L;

	public String getColor(FacesContext context, HtmlSchedule schedule,
			ScheduleEntry entry, boolean selected) {

		SchedulerEntryExtended extEntry = (SchedulerEntryExtended) entry;
		return extEntry.getColor();
	}

	protected void renderDetailedContentText(
			javax.faces.context.FacesContext context,
			javax.faces.context.ResponseWriter writer, HtmlSchedule schedule,
			ScheduleDay day, ScheduleEntry entry, boolean selected)
			throws IOException {

		StringBuffer entryStyle = new StringBuffer();

		// Add entry style
		entryStyle.append("height: 100%; width: 100%;");
		String entryColor = getColor(context, schedule, entry, selected);
		if (entryColor != null) { // Se foi setada uma cor no objeto entry, ele customiza, senão mantém o padrão
			entryStyle.append("background-color: "); 
			entryStyle.append(entryColor); // Aqui está a sacada! Vc seta a cor do background via CSS com a cor setada para a entry!
			entryStyle.append(";");
		}

		// Put entry inside of html DIV element
		writer.startElement(HTML.DIV_ELEM, null);
		writer.writeAttribute(HTML.STYLE_ATTR, entryStyle.toString(), null);

		// Write the title of the entry
		if (entry.getTitle() != null) {
			writer.startElement(HTML.SPAN_ELEM, schedule);
			writer.writeAttribute(HTML.CLASS_ATTR, getStyleClass(schedule,
					"title"), null);
			writer.writeText(entry.getTitle(), null);
			writer.endElement(HTML.SPAN_ELEM);
		}

		// Write the sub-title of the entry
		if (entry.getSubtitle() != null) {
			writer.startElement("br", schedule);
			writer.endElement("br");
			writer.startElement(HTML.SPAN_ELEM, schedule);
			writer.writeAttribute(HTML.CLASS_ATTR, getStyleClass(schedule,
					"subtitle"), null);
			writer.writeText(entry.getSubtitle(), null);
			writer.endElement(HTML.SPAN_ELEM);
		}

		writer.endElement(HTML.DIV_ELEM);
	}
}

Finalmente, na sua página use

entryRenderer="#{scheduleEntryRenderer}"

Não esqueça de declarar o ScheduleEntryRenderer no faces-config.xml. Eu declarei como request!

Espero ter ajudado!

Bom dia,

Uma duvida, eu não estou conseguindo sobreescrever o metodo: renderDetailedContentText da classe: ScheduleEntryRenderer

ele simplesmente não chama, não sei que valor é esse: compact, ele vem sempre true,

if (compact)
{
renderCompactContent(context, writer, schedule, day, entry, selected);
} else
{
if (selected)
{
StringBuffer entryStyle = new StringBuffer();
entryStyle.append(“height: 100%; width: 100%;”);
//the left border of a selected entry should have the same
//color as the entry border
String entryColor = getColor(context, schedule, entry, selected);
if (entryColor != null) {
entryStyle.append(“border-color: “);
entryStyle.append(entryColor);
entryStyle.append(”;”);
}
// draw the contents of the selected entry
writer.startElement(HTML.DIV_ELEM, null);
writer.writeAttribute(HTML.CLASS_ATTR, getStyleClass(schedule,
“text”), null);
writer.writeAttribute(HTML.STYLE_ATTR,entryStyle.toString(), null);

            renderDetailedContentText(context, writer, schedule, day, entry, selected);
            
            writer.endElement(HTML.DIV_ELEM);
        } else
        {
            renderDetailedContentText(context, writer, schedule, day, entry, selected);
        }
    }

ai não chega a chamar o meu método que eu sobrescrevi

Hum, mas onde vc está chamando o método?
Ele é chamado automaticamente, eu não precisei fazer nenhuma chamada explicita no código para ele ser executado.
Afinal, ele é um renderer do Schedule.

Voce chegou a colocar

 entryRenderer="#{scheduleEntryRenderer}"

na sua página, no componente?

coloquei,

sabe qual o problema, é que eu estou iniciando o meu model assim:

Integer mdl = new Integer(ScheduleModel.MONTH);
model.setMode(mdl);

como Month, alterei para day e ele funcionou,
vou ter que rescrever o metodo que faz essa chamada tambem?
ao contrario se eu for visualizar mensalmente nunca irá chamar o meu método que sobreescrevi.

Hum, você pode iniciar como MONTH sim.
Só atente para qual método o renderer chama quando sua página é solicitada.
No meu caso, como para mim apenas importa o dia (ScheduleModel.DAY), só reescrevi o renderDetailedContentText.

Faça o seguinte…
Subreescreva todos os métodos… E seta um breakpoint neles… Assim vc saberá qual deles é chamado, aí faça o que vc necessita!
Pq como eu não precisei usar o modo MONTH, não sei qual o comportamento do mesmo…

Consegui fazer :slight_smile: ficou legal…

so mais uma duvida, sera que tem como mostrar ele anual? ou ele nao
suporta anual?

Que bom que deu certo!

Respondendo a sua dúvida…
Segundo a API (http://myfaces.apache.org/tomahawk-project/tomahawk12/apidocs/index.html), não é possível trabalhar com o ano.

Valores possíveis: DAY, WORKWEEK, WEEK, MONTH.

[]'s

Obrigado pelas dicas, me ajuram mt.

so mais uma duvida, rs, estou tentando editar um evento ja cadastrado,
mas não está funcionando, eu primeiro recupero os valores do model com o:
model.getSelectedEntry()

ai depois quando o usuario clicar em salvar novamente eu seto o entry com os novos
valores e por ultimo eu faço:

model.setSelectedEntry(entry);
model.refresh();

mas ele simplesmente não atualiza meu model com os novos valores.
se souber como editar corretamente.

vlw

O método model.setSelectedEntry(entry) serve apenas para indicar no modelo qual o entry selecionado, não para atualiza-lo.
Acho que vc terá remover o entry antigo e inserir o atualizado!

[]'s

vc conseguiu utilizar algum tipo de evento ajax em cima da t:schedule ?
estou tentando abrir um modalPanel quando clicar em cima de uma tarefa agendada,
mas nao consigo utilizar nenhum evento…

se souber de alguma maneira.

vlw