Autor Zpráva
mackopu
Profil
Rád bych dvěma kolegům v práci trochu usnadnil plánování volného a pracovního času. Střídají se v turnusech -

Honza:
Po - St > ranní
Čt, Pá > odpolední
So, Ne > volno

Jirka:
Po - St > odpolední
Čt, Pá > ranní
So, Ne > práce

Výsledkem by měla být stránka, která pomocí JS obrazí např. měsíční kalendář, pod nímž se po kliknutí na datum zobrazí text třeba "Honza ranní, Jirka odpolední" nebo "Honza volno, Jirka práce". Sám jsem spíše PHP a možná bych to v potu myši zvládl napsat, ale zdá se mi zbytečné se kvůli provedení skriptu připojovat na server. JS by to jako klientský skript jistě zvládl elegantněji, rychleji a bez znovunačítání stránky. Neznáte (nemáte) někdo podobný skript?
Oswald
Profil
Zrovna pracuju na jednom vetším AJAX kalendáři, tak jsem z toho použil nejaké části a udělal kostru, na kterou můžeš navázat zobrazování infa o tom, kdo má pracovat. Stači implementovat fci whoWorks(), která se volá po clicku na den a nastylovat si to. Tady je fukční ukázka, mělo by to fungovat všude.



<script type="text/javascript">
var DAYS_IN_MONTHS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var DAYS = ['neděle','pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'];
var MONTHS = ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září' , 'říjen', 'listopad', 'prosinec'];
var calBody;
var month = new Date;

function whoWorks() {
// this.date je ojekt Date, ktery reprezentuje datum bunky, na kterou se kliklo,
// takze this.date.getCzDayNumber() vrati cislo dne - 0 = pondeli, 6 = nedele,
// podle toho muzes zjisti, kdo maka :) a nejak to zobrazit
// (metoda getCzDayNumber je tady ve scriptu definovana, neni to standardni metoda
// ojektu Date)
alert(this.date);
}

function cell(text) {
var cell = document.createElement('td');
cell.appendChild(document.createTextNode(text));
return cell;
}

function renderCalendar() {
var tr, helpDate, startDay, day;

helpDate = month.clone();
helpDate.setDate(1);
startDay = helpDate.getCzDayNumber();
numDays = DAYS_IN_MONTHS[month.getMonth()];

while(calHeader.hasChildNodes()) {
calHeader.removeChild(calHeader.firstChild);
}
calHeader.appendChild(document.createTextNode(MONTHS[month.getMonth() ] + ', ' + month.getFullYear()));
while(calBody.hasChildNodes()) {
calBody.removeChild(calBody.firstChild);
}

tr = document.createElement('tr');
// doplneni prazdny dnu na zacatku
for (var i = 0; i < startDay; i++) {
tr.appendChild(cell('-'));
}
// vlozeni existujicich dnu
for (var i = 0; i < numDays; i++) {
helpDate.setDate(i + 1);
day = cell(i+1);
day.date = helpDate.clone();
day.onclick = whoWorks;
tr.appendChild(day);
if (helpDate.isSunday()) {
calBody.appendChild(tr);
tr = document.createElement('tr');
}
}
calBody.appendChild(tr);
// zbyvajici prazdne dny
endDay = helpDate.getCzDayNumber();
if (endDay < 6) {
for (var i = 0; 0 < (6 - endDay - i); i++) {
tr.appendChild(cell('-'));
}
}
}
function changeMonth(goBack) {
var oldMonth, oldYear, newMonth, newYear;
oldMonth = newMonth = month.getMonth();
oldYear = newYear = month.getFullYear();
if (goBack) {
if (oldMonth == 0) {
newYear--;
newMonth = 11;
} else {
newMonth--;
}
} else {
if (oldMonth == 11) {
newYear++;
newMonth = 0;
} else {
newMonth++;
}
}
//alert(MONTHS[oldMonth] + ', ' + oldYear + '\n' + MONTHS[newMonth] + ', ' + newYear);
month.setMonth(newMonth);
month.setFullYear(newYear);
renderCalendar();
}
Date.prototype.getCzDayNumber = function() {
var day = this.getDay();
if (day === 0) {
return 6;
} else {
return day - 1;
}
}
Date.prototype.clone = function() {
return new Date(this.getTime());
}
Date.prototype.isSunday = function() {
return this.getDay() === 0;
}

window.onload = function() {
calBody = document.getElementsByTagName('tbody')[0];
calHeader = document.getElementsByTagName('caption')[0];
renderCalendar();
}
</script>

<p><button onclick="changeMonth(true);">&lt;</button><button onclick="changeMonth(false);">&gt;</button></p>
<table>
<caption></caption>
<thead>
<tr>
<th>po</th>
<th>út</th>
<th>st</th>
<th>čt</th>
<th>pá</th>
<th>so</th>
<th>ne</th>
</tr>
</thead>
<tbody>
</tbody>
</table>


UPDATE: Ještě dodám, že tam není ošetřený přestupný rok, k tomu jsem se nějak nedostal :)
mackopu
Profil
Oswald
Dobré.
Jen musím konstatovat, že problém nemám s kalendářem, nýbrž s výpočtem toho turnusu.
Kalendář není v zásadě problém implementovat, např. http://www.dynarch.com/projects/calendar/. Onclickem už snad nějak ošetřím volání funkce, která mi např. přes document write nebo innerhtml vypíše kýžený verdikt
Přesto díky za reakci, protože to podle poměru zobrazení a odpovědí vypadá, že je to sakra tvrdý oříšek. I když jak se to vezme - v podstatě by stačilo třeba zjistit, zda je víkend sudý nebo lichý a přes zjištění angl. názvu dne konstatovat, že ten či onen člověk má právě tu a tu šichtu, přičemž někde na začátku skriptu by muselo být definováno, od koho se to začíná počítat.
Já si to vlastně umím představit, jen to nedokážu převést do JS...
mackopu
Profil
Tak jsem to jakžtakž rozchodil a výsledek je k nahlédnutí zde.
Jen nemohu přijít na to, jak zajistit, aby nebylo nutné před přechodem na jiný měsíc stránku refrešovat. Pravděpodobně tam někde dochází ke kolizi se samotným výpisem turnusu. Poradíte?
Fred
Profil
Blbne to na tý funkci whoWorks() , když nastavíš do toho renderování day.onclick=alertoid; a funkce alertoid je nějaké získání času, přestane to chodit např. function alertoid(){alert(this.date.getWeek())}
pokud je to normální alert, funguje to normálně. Ta funkce přepisuje čas tomu renderování, je to dost dlouhý script na dohledání přesné příčiny chyby, zkouším to :-(
Fred
Profil
Hodně jsem tam toho přepisoval, takže si to stáhni http://xy.wz.cz/mackopu.htm a já to smáznu, budeš si muset převést zpátky na utf-8 nějak mi to tu blbne :-(
Fred
Profil
Hm, měl jsem tam blbou chybu, už je to v utf :-)
mackopu
Profil
Zatím velice děkuji, později budu studovat rozdíly v mé a tvojí verzi.
Výborná práce ;-)
Fred
Profil
NZ, potřebuju se učit na příkladech, staženo ;-)
Fred
Profil
mackopu To si taky mohl říct, že tam stejně byla chyba, renderovalo to vždy aktuální měsíc, takže opravená verze http://xy.wz.cz/mackopu.htm
Fred
Profil
Ale stejně tam je něco shnilého co nemůžu najít, totálně mi to sestřeluje IE5. Možná jestli sem nakoukne ještě jednou Oswald, nebo Leo.
mackopu
Profil
Frede, té chyby jsem si nestačil všimnout, promiň. Jinak koukám, že ses do toho tedy pěkně pustil ;-) nádhera. Tam už fakt chybí k dokonalosti jenom to, aby byl aktuální den nějak zvýrazněný.
Já mám v práci IE6 a FF, na těch je to v pohodě.
Fred
Profil
V Opeře taky, ten dnešek tam zkouším přidat, jen se mi nedaří ho odebrat pro jiné měsíce, teď to označuje každého osmého, nedaří se mi dodat tomu info co máme za měsíc :(
mackopu
Profil
Já už jsem to právě dodělal - do fce renderCalendar (na konec) jsem přidal:
// zvýrazní dnešní den

dnes = new Date();
mesic = dnes.getMonth();
denVMesici = dnes.getDate();
if((i+1) == denVMesici && month.getMonth() == mesic){
day.style.background='#ffc';
day.onmouseover=green;
day.onmouseout=barva;
}

a chodí to. jen jsem si ještě nadefinoval day.onmouseover=green.
Fred
Profil
Super, tak já to tam stáhnu, až na tu IE5 to šlape pěkně, tam pokud chci přejít na další měsíc tak zavolá doktora Watsona a jde do kopru.
mackopu
Profil
Hele Frede, když už jsme se tak hezky rozepsali, co kdyby to umělo ještě vypsat DNEŠNÍ datum a turnus, pokud nevyberu den? Tzn. že se to tam bude vypisovat při vstupu i při prostém listování kalendářem ;-)
Zkouším to a zatím nic.
Fred
Profil
Zkouším to, ale musím teď za drahou polovičkou, nebo bude sekec mazec ;-)
Fred
Profil
Přidal jsem tam tlačítko dnes, ale chtělo by to zkrátit a vyčistit, hodně věcí se tam zbytečně opakuje, nicméně to funguje.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0