Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 671

Přidáno uživatelem Michal Kliment před asi 14 roky(ů)

Miliony zmen:
1. Nejvice prace provedeny na procesu schvalovani praci a obecneho schvalovani (vykazu, pozadavku). Bohuzel zatim stale nedodelane, protoze jsem na navrh zbyl sam :-/ Proto nenasazovat na ostry server!!!
2. Opraveno strankovani (sorry, moje chyba :-))
3. Pridan novy js radic tabulek u gridu (vyhodne pouzivat u mensich gridu - vypis seznamu rozhrani u zarizeni, atd.)
.4. Pridan novy typ sloupce do gridu - form_field - nyni je mozne v gridu mit formular.
Na dalsi zmeny si uz nevzpominam, sorry :-)

Zobrazit rozdíly:

freenetis/trunk/kohana/media/css/style.css
font-weight:normal;
padding-bottom:5px;
}
#menu li.account, #menu li.transfer, #menu li.users, #menu li.networks, #menu li.administration, #menu li.redirection, #menu li.backup, #menu li.help {
#menu li.account, #menu li.transfer, #menu li.users, #menu li.approval, #menu li.networks, #menu li.administration, #menu li.redirection, #menu li.backup, #menu li.help {
padding-left:45px;
padding-top:10px;
list-style-type:none;
......
#menu li.users {
background: #FFFFFF url(../images/menu/kuser.png) 5px 5px no-repeat;
}
#menu li.approval {
background: #FFFFFF url(../images/menu/approval.png) 5px 5px no-repeat;
}
#menu li.networks {
background: #FFFFFF url(../images/menu/gnome-fs-network.png) 5px 5px no-repeat;
}
......
.ico_add {
margin-left: 5px;
}
.grid_table tr td .textarea {
width: 200px;
}
th.header {
cursor: pointer;
}
freenetis/trunk/kohana/media/js/jquery.tablesorter.min.js
(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'.',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}var rows=table.tBodies[0].rows;if(table.tBodies[0].rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,cells[i]);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,node){var l=parsers.length;for(var i=1;i<l;i++){if(parsers[i].is($.trim(getElementText(table.config,node)),table,node)){return parsers[i];}}return parsers[0];}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=table.tBodies[0].rows[i],cols=[];cache.row.push($(c));for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j]));}cols.push(i);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){if(!node)return"";var t="";if(config.textExtraction=="simple"){if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){t=node.childNodes[0].innerHTML;}else{t=node.innerHTML;}}else{if(typeof(config.textExtraction)=="function"){t=config.textExtraction(node);}else{t=$(node).text();}}return t;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){rows.push(r[n[i][checkCell]]);if(!table.config.appender){var o=r[n[i][checkCell]];var l=o.length;for(var j=0;j<l;j++){tableBody[0].appendChild(o[j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false,tableHeadersRows=[];for(var i=0;i<table.tHead.rows.length;i++){tableHeadersRows[i]=0;};$tableHeaders=$("thead th",table);$tableHeaders.each(function(index){this.count=0;this.column=index;this.order=formatSortingOrder(table.config.sortInitialOrder);if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(!this.sortDisabled){$(this).addClass(table.config.cssHeader);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){i=(v.toLowerCase()=="desc")?1:0;}else{i=(v==(0||1))?v:0;}return i;}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(getCachedSortType(table.config.parsers,c)=="text")?((order==0)?"sortText":"sortTextDesc"):((order==0)?"sortNumeric":"sortNumericDesc");var e="e"+i;dynamicExp+="var "+e+" = "+s+"(a["+c+"],b["+c+"]); ";dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function sortText(a,b){return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){$this.trigger("sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){var $cell=$(this);var i=this.column;this.order=this.count++%2;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){var DECIMAL='\\'+config.decimal;var exp='/(^[+]?0('+DECIMAL+'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)'+DECIMAL+'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*'+DECIMAL+'0+$)/';return RegExp(exp).test($.trim(s));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}$("tr:visible",table.tBodies[0]).filter(':even').removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]).end().filter(':odd').removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery);
freenetis/trunk/kohana/media/js/js.js
}
function add_work_row(i, keys)
{
i++;
var add_work_row_tr = document.getElementById("add_work_row_tr");
var table = document.getElementById("form_table");
var tbody = table.children[0];
var new_work_group_tr = document.createElement("tr");
new_work_group_tr.setAttribute("id", "work_group_"+i);
var new_work_group_th = document.createElement("th");
new_work_group_th.setAttribute("colspan", "3");
new_work_group_th.setAttribute("class", "group");
var new_work_group_text = document.createTextNode(keys[0]+" (");
var new_work_delete_link = document.createElement("a");
new_work_delete_link.setAttribute("href", "#");
new_work_delete_link.setAttribute("onclick", "return delete_work_row("+i+")");
var new_work_delete_link_text = document.createTextNode("Smazat");
new_work_delete_link.appendChild(new_work_delete_link_text);
new_work_group_th.appendChild(new_work_group_text);
var new_work_group_text = document.createTextNode(") ");
new_work_group_th.appendChild(new_work_delete_link);
new_work_group_th.appendChild(new_work_group_text);
new_work_group_tr.appendChild(new_work_group_th);
tbody.insertBefore(new_work_group_tr, add_work_row_tr);
var new_work_description_tr = document.createElement("tr");
new_work_description_tr.setAttribute("id", "work_description_"+i);
var new_work_description_th = document.createElement("th");
new_work_description_th.setAttribute("class", "work_description["+i+"]");
var new_work_description_label = document.createElement("label");
new_work_description_label.setAttribute("for", "work_description["+i+"]");
var new_work_description_label_text = document.createTextNode(keys[1]+": *");
new_work_description_label.appendChild(new_work_description_label_text);
new_work_description_th.appendChild(new_work_description_label);
new_work_description_tr.appendChild(new_work_description_th);
var new_work_description_input_td = document.createElement("td");
var new_work_description_input_td_textarea = document.createElement("textarea");
new_work_description_input_td_textarea.setAttribute("name", "work_description["+i+"]");
new_work_description_input_td_textarea.setAttribute("class", "textarea required");
new_work_description_input_td.appendChild(new_work_description_input_td_textarea);
new_work_description_tr.appendChild(new_work_description_input_td);
var new_work_description_help_td = document.createElement("td");
new_work_description_tr.appendChild(new_work_description_help_td);
tbody.insertBefore(new_work_description_tr, add_work_row_tr);
var new_work_date_tr = document.createElement("tr");
new_work_date_tr.setAttribute("id", "work_date_"+i);
var new_work_date_th = document.createElement("th");
new_work_date_th.setAttribute("class", "work_date["+i+"]");
var new_work_date_label = document.createElement("label");
new_work_date_label.setAttribute("for", "work_date["+i+"]");
var new_work_date_label_text = document.createTextNode(keys[2]+": *");
new_work_date_label.appendChild(new_work_date_label_text);
new_work_date_th.appendChild(new_work_date_label);
new_work_date_tr.appendChild(new_work_date_th);
var new_work_date_input_td = document.createElement("td");
var date = new Date();
var new_work_date_input_td_select_day = document.createElement("select");
new_work_date_input_td_select_day.setAttribute("name", "work_date["+i+"][day]");
new_work_date_input_td_select_day.setAttribute("class", "dropdown required");
var option = new Array();
var option_text = new Array();
var day = date.getDate();
for(j=1;j<=31;j++)
{
option[j] = document.createElement("option");
option_text[j] = document.createTextNode(j);
option[j].appendChild(option_text[j]);
option[j].setAttribute("value", j);
if (j == day)
option[j].setAttribute('selected', '');
new_work_date_input_td_select_day.appendChild(option[j]);
}
new_work_date_input_td.appendChild(new_work_date_input_td_select_day);
var new_work_date_input_td_select_month = document.createElement("select");
new_work_date_input_td_select_month.setAttribute("name", "work_date["+i+"][month]");
new_work_date_input_td_select_month.setAttribute("class", "dropdown required");
var option = new Array();
var option_text = new Array();
var month = date.getMonth()+1;
for(j=1;j<=12;j++)
{
option[j] = document.createElement("option");
option_text[j] = document.createTextNode(j);
option[j].appendChild(option_text[j]);
option[j].setAttribute("value", j);
if (j == month)
option[j].setAttribute('selected', '');
new_work_date_input_td_select_month.appendChild(option[j]);
}
new_work_date_input_td.appendChild(new_work_date_input_td_select_month);
var new_work_date_input_td_select_year = document.createElement("select");
new_work_date_input_td_select_year.setAttribute("name", "work_date["+i+"][year]");
new_work_date_input_td_select_year.setAttribute("class", "dropdown required");
var option = new Array();
var option_text = new Array();
var year = date.getFullYear();
for(j=(year-10);j<=year;j++)
{
option[j] = document.createElement("option");
option_text[j] = document.createTextNode(j);
option[j].appendChild(option_text[j]);
option[j].setAttribute("value", j);
if (j == year)
option[j].setAttribute('selected', '');
new_work_date_input_td_select_year.appendChild(option[j]);
}
new_work_date_input_td.appendChild(new_work_date_input_td_select_year);
new_work_date_tr.appendChild(new_work_date_input_td);
var new_work_date_help_td = document.createElement("td");
new_work_date_tr.appendChild(new_work_date_help_td);
tbody.insertBefore(new_work_date_tr, add_work_row_tr);
var new_work_hours_tr = document.createElement("tr");
new_work_hours_tr.setAttribute("id", "work_hours_"+i);
var new_work_hours_th = document.createElement("th");
new_work_hours_th.setAttribute("class", "work_hours["+i+"]");
var new_work_hours_label = document.createElement("label");
new_work_hours_label.setAttribute("for", "work_hours["+i+"]");
var new_work_hours_label_text = document.createTextNode(keys[3]+": *");
new_work_hours_label.appendChild(new_work_hours_label_text);
new_work_hours_th.appendChild(new_work_hours_label);
new_work_hours_tr.appendChild(new_work_hours_th);
var new_work_hours_input_td = document.createElement("td");
new_work_hours_input_td.setAttribute("class", "work_hours["+i+"]");
var new_work_hours_input_td_input = document.createElement("input");
new_work_hours_input_td_input.setAttribute("type", "text");
new_work_hours_input_td_input.setAttribute("name", "work_hours["+i+"]");
new_work_hours_input_td_input.setAttribute("maxlength", "250");
new_work_hours_input_td_input.setAttribute("class", "textbox required number");
new_work_hours_input_td.appendChild(new_work_hours_input_td_input);
new_work_hours_tr.appendChild(new_work_hours_input_td);
var new_work_hours_help_td = document.createElement("td");
new_work_hours_tr.appendChild(new_work_hours_help_td);
tbody.insertBefore(new_work_hours_tr, add_work_row_tr);
var new_work_km_tr = document.createElement("tr");
new_work_km_tr.setAttribute("id", "work_km_"+i);
var new_work_km_th = document.createElement("th");
new_work_km_th.setAttribute("class", "work_km["+i+"]");
var new_work_km_label = document.createElement("label");
new_work_km_label.setAttribute("for", "work_km["+i+"]");
var new_work_km_label_text = document.createTextNode(keys[4]+": *");
new_work_km_label.appendChild(new_work_km_label_text);
new_work_km_th.appendChild(new_work_km_label);
new_work_km_tr.appendChild(new_work_km_th);
var new_work_km_input_td = document.createElement("td");
new_work_km_input_td.setAttribute("class", "work_km["+i+"]");
var new_work_km_input_td_input = document.createElement("input");
new_work_km_input_td_input.setAttribute("type", "text");
new_work_km_input_td_input.setAttribute("name", "work_km["+i+"]");
new_work_km_input_td_input.setAttribute("maxlength", "250");
new_work_km_input_td_input.setAttribute("class", "textbox number");
new_work_km_input_td.appendChild(new_work_km_input_td_input);
new_work_km_tr.appendChild(new_work_km_input_td);
var new_work_km_help_td = document.createElement("td");
new_work_km_tr.appendChild(new_work_km_help_td);
tbody.insertBefore(new_work_km_tr, add_work_row_tr);
var new_work_suggest_amount_tr = document.createElement("tr");
new_work_suggest_amount_tr.setAttribute("id", "work_suggest_amount_"+i);
var new_work_suggest_amount_th = document.createElement("th");
new_work_suggest_amount_th.setAttribute("class", "work_suggest_amount["+i+"]");
var new_work_suggest_amount_label = document.createElement("label");
new_work_suggest_amount_label.setAttribute("for", "work_suggest_amount["+i+"]");
var new_work_suggest_amount_label_text = document.createTextNode(keys[5]+": *");
new_work_suggest_amount_label.appendChild(new_work_suggest_amount_label_text);
new_work_suggest_amount_th.appendChild(new_work_suggest_amount_label);
new_work_suggest_amount_tr.appendChild(new_work_suggest_amount_th);
var new_work_suggest_amount_input_td = document.createElement("td");
new_work_suggest_amount_input_td.setAttribute("class", "work_suggest_amount["+i+"]");
var new_work_suggest_amount_input_td_input = document.createElement("input");
new_work_suggest_amount_input_td_input.setAttribute("type", "text");
new_work_suggest_amount_input_td_input.setAttribute("name", "work_suggest_amount["+i+"]");
new_work_suggest_amount_input_td_input.setAttribute("maxlength", "250");
new_work_suggest_amount_input_td_input.setAttribute("class", "textbox required number");
new_work_suggest_amount_input_td.appendChild(new_work_suggest_amount_input_td_input);
new_work_suggest_amount_tr.appendChild(new_work_suggest_amount_input_td);
var new_work_suggest_amount_help_td = document.createElement("td");
new_work_suggest_amount_tr.appendChild(new_work_suggest_amount_help_td);
tbody.insertBefore(new_work_suggest_amount_tr, add_work_row_tr);
keys_str = implode("','", keys);
var add_work_row_link = document.getElementById('add_work_row_link');
add_work_row_link.setAttribute("onclick", "return add_work_row("+i+", new Array('"+keys_str+"'));");
return false;
}
function delete_work_row(i)
{
var table = document.getElementById("form_table");
var tbody = table.children[0];
var work_group = document.getElementById("work_group_"+i);
var work_description = document.getElementById("work_description_"+i);
var work_date = document.getElementById("work_date_"+i);
var work_hours = document.getElementById("work_hours_"+i);
var work_km = document.getElementById("work_km_"+i);
var work_suggest_amount = document.getElementById("work_suggest_amount_"+i);
tbody.removeChild(work_group);
tbody.removeChild(work_description);
tbody.removeChild(work_date);
tbody.removeChild(work_hours);
tbody.removeChild(work_km);
tbody.removeChild(work_suggest_amount);
return false;
}
function set_class(select, id)
{
var text = select.options[select.selectedIndex].text;
freenetis/trunk/kohana/media/js/jquery.metadata.js
/*
* Metadata - jQuery plugin for parsing metadata from elements
*
* Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* Revision: $Id$
*
*/
/**
* Sets the type of metadata to use. Metadata is encoded in JSON, and each property
* in the JSON will become a property of the element itself.
*
* There are three supported types of metadata storage:
*
* attr: Inside an attribute. The name parameter indicates *which* attribute.
*
* class: Inside the class attribute, wrapped in curly braces: { }
*
* elem: Inside a child element (e.g. a script tag). The
* name parameter indicates *which* element.
*
* The metadata for an element is loaded the first time the element is accessed via jQuery.
*
* As a result, you can define the metadata type, use $(expr) to load the metadata into the elements
* matched by expr, then redefine the metadata type and run another $(expr) for other elements.
*
* @name $.metadata.setType
*
* @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p>
* @before $.metadata.setType("class")
* @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
* @desc Reads metadata from the class attribute
*
* @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p>
* @before $.metadata.setType("attr", "data")
* @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
* @desc Reads metadata from a "data" attribute
*
* @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p>
* @before $.metadata.setType("elem", "script")
* @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
* @desc Reads metadata from a nested script element
*
* @param String type The encoding type
* @param String name The name of the attribute to be used to get metadata (optional)
* @cat Plugins/Metadata
* @descr Sets the type of encoding to be used when loading metadata for the first time
* @type undefined
* @see metadata()
*/
(function($) {
$.extend({
metadata : {
defaults : {
type: 'class',
name: 'metadata',
cre: /({.*})/,
single: 'metadata'
},
setType: function( type, name ){
this.defaults.type = type;
this.defaults.name = name;
},
get: function( elem, opts ){
var settings = $.extend({},this.defaults,opts);
// check for empty string in single property
if ( !settings.single.length ) settings.single = 'metadata';
var data = $.data(elem, settings.single);
// returned cached data if it already exists
if ( data ) return data;
data = "{}";
if ( settings.type == "class" ) {
var m = settings.cre.exec( elem.className );
if ( m )
data = m[1];
} else if ( settings.type == "elem" ) {
if( !elem.getElementsByTagName )
return undefined;
var e = elem.getElementsByTagName(settings.name);
if ( e.length )
data = $.trim(e[0].innerHTML);
} else if ( elem.getAttribute != undefined ) {
var attr = elem.getAttribute( settings.name );
if ( attr )
data = attr;
}
if ( data.indexOf( '{' ) <0 )
data = "{" + data + "}";
data = eval("(" + data + ")");
$.data( elem, settings.single, data );
return data;
}
}
});
/**
* Returns the metadata object for the first member of the jQuery object.
*
* @name metadata
* @descr Returns element's metadata object
* @param Object opts An object contianing settings to override the defaults
* @type jQuery
* @cat Plugins/Metadata
*/
$.fn.metadata = function( opts ){
return $.metadata.get( this[0], opts );
};
})(jQuery);
freenetis/trunk/kohana/application/i18n/cs_CZ/texts.php
<?php defined('SYSPATH') or die('No direct access allowed.');
<?php defined('SYSPATH') or die('No direct access allowed.');
$lang = array
(
'0 means unlimited limit' => '0 znamená neomezený limit.',
'99% chance you won\'t need to change this value' => '99% šance, že nebudete chtít měnit tuto hodnotu.',
'abstain' => 'Zdržet se',
'about sms' => 'Informace o SMS',
'access rights' => 'Přístupová práva',
'access to system' => 'Přístup do systému',
......
'add new whole device' => 'Přidat nové celé zařízení',
'add new whole device for user' => 'Přidat nové celé zařízení pro uživatele',
'add new work' => 'Přidat novou práci',
'add new work report' => 'Přidat nový pracovní výkaz',
'add smokeping menu item' => 'Přidat položku menu smokepingu',
'add smokeping record' => 'Přidat záznam smokepingu',
'add voip account' => 'Přidat VoIP účet',
'add vote' => 'Přidat hlas',
'add vote about work' => 'Přidat hlas o práci',
'add wireless setting' => 'Přidat bezdrátové nastavení',
'added by' => 'Přidal',
'additional_contacts_infotext' => 'Další kontaktní informace',
......
'advanced information' => 'Pokročilé informace',
'after you\'ve done that, click login' => 'Poté, co to dokončíte, klikněte na "Přihlásit".',
'after you\'ve done that, you can continue' => 'Poté, co tak učiníte, můžete pokračovat.',
'agree' => 'Souhlas',
'all' => 'Všichni',
'all redirected' => 'Všichni přesměrovaní',
'all transfers' => 'Všechny převody',
......
'answer to this message' => 'Odpovědet na tuto zprávu',
'applicant' => 'Čekatel na členství',
'application password' => 'Aplikační heslo',
'approval' => 'Hlasování',
'approved' => 'Schváleno',
'approved works' => 'Schválené práce',
'april' => 'Duben',
'are you really sure that this database server is working fine?' => 'Jste si opravdu jistí, že tento databázový server funguje správně?',
'are you really sure that you entered correct address database server?' => 'Jste si opravdu jisti, že jste zadali správnou adresu databázového serveru?',
......
'back to interfaces list' => 'Zpět na seznam rozhraní',
'back to ip address' => 'Zpět na IP adresu',
'back to ip addresses list' => 'Zpět na seznam IP adres',
'back to list' => 'Zpět na seznam',
'back to list of all address points' => 'Zpět na seznam všech adresních bodů',
'back to list of routerboard backups' => 'Zpět na seznam záloh routerboardů',
'back to list of all confirmed works' => 'Zpět na seznam všech potvrzených prací',
'back to list of all devices' => 'Zpět na seznam všech zařízení',
'back to list of all fees' => 'Zpět na seznam všech poplatků',
'back to list of all invoices' => 'Zpět na seznam všech faktur',
'back to list of all members' => 'Zpět na seznam všech členů',
'back to list of all pending works' => 'Zpět na seznam všech nerozhodnutých prací',
'back to list of all streets' => 'Zpět na seznam všech ulic',
'back to list of all towns' => 'Zpět na seznam všech měst',
'back to list of all unconfirmed works' => 'Zpět na seznam všech nepotvrzených prací',
'back to list of all users works' => 'Zpět na seznam všech prací uživatele',
'back to list of enum types' => 'Zpět na seznam všech výčtů',
'back to list of groups' => 'Zpět na seznam skupin',
'back to list of members' => 'Zpět na seznam členů',
'back to list of routerboard backups' => 'Zpět na seznam záloh routerboardů',
'back to list of translations' => 'Zpět na seznam překladů',
'back to list of works of user' => 'Zpět na seznam prací uživatele',
'back to login' => 'Zpět na přihlášení',
......
'back to the subnet' => 'Zpět na podsíť',
'back to the user' => 'Zpět na uživatele',
'back to the work' => 'Zpět k práci',
'back to the work report' => 'Zpět k pracovnímu výkazu',
'back to this account' => 'Zpět na tento účet',
'back to this user' => 'Zpět na tohoto uživatele',
'back to transfers of member' => 'Zpět na převody člena',
......
'dhcp configuration file was successfully generated' => 'Konfigurační soubor pro DHCP byl úspěšně vygenerován',
'directory upload for file uploading is not writable' => 'Do adresáře upload pro nahrávání souborů nelze zapisovat.',
'disabled' => 'Vypnuto',
'disagree' => 'Nesouhlas',
'display member' => 'Zobraz člena',
'display user' => 'Zobraz uživatele',
'dns configuration' => 'Konfigurace DNS',
'dns configuration files were successfully generated' => 'Konfigurační soubory pro DNS byly úspěšně vygenerovány',
'do transfer' => 'Proveď transakci',
'do you really want to delete this record' => 'Chcete opravdu smazat tento záznam',
'do you want to cancel this redirection' => 'Chcete zrušit toto přesměrování',
'do you want to cancel this backup' => 'Chcete zrušit toto zálohování',
'do you want to delete this address point' => 'Chcete smazat tento adresní bod',
......
'edit vlan interface' => 'Úprava VLAN rozhraní',
'edit vlan' => 'Úprava VLANu',
'edit voicemail' => 'Upravit hlasovou schránku',
'edit vote about work' => 'Upravit hlas o práci',
'edit wireless setting' => 'Upravit bezdrátové nastavení',
'edited' => 'Upravil',
'editing of account' => 'Úprava účtu',
......
'ip addresses' => 'IP adresy',
'ip_address' => 'IP adresa',
'it can means that username/password/host are bad or host is unavailable' => 'To může znamenat, že uživatelské jméno/heslo/hostitel je špatné nebo je hostitel nedostupný.',
'it is not possible vote about locked work' => 'Není možné hlasovat o zamčené práci.',
'it is possible to deduct fees only in one year' => 'Členské příspěvky je možné strhávat jen v rámci jednoho roku.',
'it\'s not possible to write your htacess file for clean urls' => 'Není možné zapsat váš soubor .htacess pro čistá URL.',
'item number' => 'Položka č.',
......
'limit of member' => 'Limit člena',
'limit has been successfully changed' => 'Limit byl úspěšně změněn.',
'list of all address points' => 'Seznam všech adresních bodů',
'list of all approved works' => 'Seznam všech schválených prací',
'list of all backups' => 'Seznam všech záloh konfigurací',
'list of all calls' => 'Výpis všech hovorů',
'list of all clouds' => 'Seznam všech oblastí',
......
'list of all redirection messages' => 'Seznam všech zpráv přesměrování',
'list of all members' => 'Seznam všech členů',
'list of all member calls' => 'Výpis všech hovorů člena',
'list of all pending work reports' => 'Seznam všech nerozhodnutých pracovních výkazů',
'list of all pending works' => 'Seznam všech nerozhodnutých prací',
'list of all redirected records' => 'Seznam všech přesměrovaných záznamů',
'list of all redirection messages' => 'Seznam všech zpráv přesměrování',
'list of all smokeping records' => 'Seznam všech záznamů smokepingu',
'list of all streets' => 'Seznam všech ulic',
'list of all towns' => 'Seznam všech měst',
'list of all transactions' => 'Seznam všech převodů',
'list of all rejected works' => 'Seznam všech zamítnutých prací',
'list of all unconfirmed works' => 'Seznam všech nepotvrzených prací',
'list of all users' => 'Seznam všech uživatelů',
'list of calls' => 'Výpis hovorů',
......
'number of the hours' => 'počet hodin',
'o' => 'V',
'october' => 'Říjen',
'of all approved works' => 'všech schválených prací',
'of all pending work reports' => 'všech nerozhodnutých pracovních výkazů',
'of all pending works' => 'všech nerozhodnutých prací',
'of all rejected works' => 'všech zamítnutých prací',
'of all users work reports' => 'všech pracovních výkazů uživatele',
'of all users works' => 'všech prací uživatele',
'old password' => 'Staré heslo',
'opening balance' => 'Počáteční zůstatek',
'operating account' => 'Provozní účet',
......
'penalty and fee' => 'Poplatky a pokuty',
'penalty for unidentified transfer' => 'Pokuta za neidentifikovanou platbu',
'penalty have to be a number' => 'Pokuta musí být číslo',
'pending' => 'Nerozhodnuto',
'pending works' => 'Nerozhodnuté práce',
'pending work reports' => 'Nerozhodnuté pracovní výkazy',
'permanent' => 'Trvalé',
'permit extensions' => 'Povolená předčíslí',
'personal comment from administrator' => 'Osobní komentář od administrátora',
......
'remove broadcast ip address' => 'Odebrat IP adresu broadcastu',
'remove network ip address' => 'Odebrat IP adresu sítě',
'request for membership' => 'Žádost o členství',
'requests' => 'Požadavky',
'resize' => 'Změnit velikost',
'restore membership' => 'Obnovit členství',
'reverse dns' => 'Zpětné DNS',
......
'show user' => 'Ukaž uživatele',
'show voip account' => 'Zobrazit VoIP účet',
'show work' => 'Zobrazit práci',
'show work report' => 'Zobrazit pracovní výkaz',
'show works' => 'Zobrazit práce',
'signature of applicant member' => 'podpis žadatele - člena',
'signature and stamp' => 'Podpis a razítko',
......
'subnets' => 'Podsítě',
'suffix' => 'Přípona',
'suffix has to start with slash character and has to end with slash character' => 'Přípona musí začínat lomítkem a musí končit lomítkem.',
'suggest amount' => 'Navrhovaná částka',
'sum' => 'Součet',
'summary' => 'Sumarizace',
'supplier' => 'Dodavatel',
......
'type of the recipient' => 'Typ příjemce',
'type of redirection' => 'Typ přesměrování',
'type' => 'Typ',
'rejected' => 'Zamítnuto',
'rejected works' => 'Zamítnuté práce',
'unconfirmed works' => 'Nepotvrzené práce',
'unidentified transfers' => 'Neidentifikované platby',
'unknown ip address' => 'Neznámá IP adresa',
......
'vlans' => 'VLANy',
'voicemail for voip account' => 'Hlasová schránka pro VoIP účet',
'voicemail password for voip account' => 'Heslo hlasové schránky pro VoIP účet',
'vote' => 'Hlas',
'welcome to freenetis' => 'Vítejte ve FreeNetISu','voicemail password for voip account' => 'Heslo hlasové schránky pro VoIP účet',
'welcome to freenetis installation' => 'Vítejte ve FreeNetIS instalaci.',
'wireless setting' => 'Bezdrátové nastavení',
......
'work has been successfully deleted' => 'Práce byla úspěšně smazána',
'work has been successfully updated' => 'Práce byla úspěšně aktualizována',
'work hasn\'t been successfully confirmed' => 'Práce nebyla úspěšně akutualizována',
'work report' => 'Pracovní výkaz',
'work reports' => 'Pracovní výkazy',
'works' => 'Práce',
'vote has been successfully added' => 'Hlas byl úspěšně přidán.',
'vote has been successfully deleted' => 'Hlas byl úspěšně smazán.',
'vote has been successfully updated' => 'Hlas byl úspěšně aktualizován.',
'write email' => 'Napsat e-mail',
'wrong password' => 'Špatné heslo',
'year' => 'Rok',
'yes' => 'ano',
'you can simply open config-samplephp in a text editor, fill in your information, and save it as configphp' => 'Můžete jednoduše otevřít config-sample.php v textovém editoru, doplnit vaše údaje a uložit jej jako config.php.',
'you cannot vote twice about same work!' => 'Nemůžete hlasovat dvakrát o stejné práci!',
'you are in debt' => 'Máte dluh',
'you have been successfully logged out' => 'Byl jste úspěšně odhlášen.',
'you have no permission to access redirection' => 'Nemáte práva k zobrazení přesměrování',
freenetis/trunk/kohana/application/helpers/form.php
else
{
$sel = ($selected === $key) ? ' selected' : '';
$input .= '<option value="'.$key.'"'.$sel.'>'.$val.'</option>'."\n";
$input .= '<option value';
if ($key!='')
$input.= '="'.$key.'"';
$input .= $sel.'>'.$val.'</option>'."\n";
}
}
$input .= '</select>';
freenetis/trunk/kohana/application/models/job.php
* @param $filter_values
* @return ORM Iterator
*/
public function get_all_confirmed_works($limit_from = 0, $limit_results = 50, $order_by = 'id', $order_by_direction = 'ASC', $filter_values = array())
public function get_all_approved_works($limit_from = 0, $limit_results = 50, $order_by = 'id', $order_by_direction = 'ASC', $filter_values = array())
{
$where = (count($filter_values)) ? 'WHERE ' : '';
/*$where = (count($filter_values)) ? 'WHERE ' : '';
if (isset($filter_values['user_id'])) $where .= 'u.id = '.$filter_values['user_id'];
if (isset($filter_values['description'])) $where .= ($where!='WHERE ') ? ' AND j.description LIKE \'%'.$filter_values['description'].'%\'' : 'j.description LIKE \'%'.$filter_values['description'].'%\'';
if (isset($filter_values['day']))
......
return self::$db->query('SELECT j.id, concat(u.name,\' \',u.surname) as user_name, j.description, j.date, j.hours, j.km, concat(c.name,\' \',c.surname) as confirm_user, t.creation_datetime as confirm_time, t.amount as rating FROM jobs j
LEFT JOIN users u ON j.user_id = u.id
LEFT JOIN transfers t ON j.transfer_id = t.id
LEFT JOIN users c ON j.confirmed_by_id = c.id '.$where.' ORDER BY '.$order_by.' '.$order_by_direction);
LEFT JOIN users c ON j.confirmed_by_id = c.id '.$where.' ORDER BY '.$order_by.' '.$order_by_direction); */
return self::$db->query('SELECT q.id, q.job_report_id, r.description as work_report, q.user_id, CONCAT(u.name,\' \', u.surname) AS uname, q.description, q.date, q.hours, q.km, q.transfer_id, t.amount as rating
FROM (SELECT j.*, SUM(v.vote) AS sum, COUNT(v.vote) AS count FROM jobs j
LEFT JOIN votes v ON j.id = v.fk_id AND v.type = 1
WHERE j.locked > 0 AND j.job_report_id IS NULL
GROUP BY j.id) as q
LEFT JOIN users u ON q.user_id = u.id
LEFT JOIN job_reports r ON q.job_report_id = r.id
LEFT JOIN transfers t ON q.transfer_id = t.id
WHERE q.sum > 0 ORDER BY '.$order_by.' '.$order_by_direction.' LIMIT '.$limit_from.', '.$limit_results);
}
public function get_all_unconfirmed_works($limit_from = 0, $limit_results = 50, $order_by = 'id', $order_by_direction = 'ASC', $filter_values = array())
public function get_all_rejected_works($limit_from = 0, $limit_results = 50, $order_by = 'id', $order_by_direction = 'ASC', $filter_values = array())
{
$where = (count($filter_values)) ? 'WHERE ' : '';
/*$where = (count($filter_values)) ? 'WHERE ' : '';
if (isset($filter_values['user_id'])) $where .= 'u.id = '.$filter_values['user_id'];
if (isset($filter_values['description'])) $where .= ($where!='WHERE ') ? ' AND j.description LIKE \'%'.$filter_values['description'].'%\'' : 'j.description LIKE \'%'.$filter_values['description'].'%\'';
if (isset($filter_values['day']))
......
return self::$db->query('SELECT j.id, concat(u.name,\' \',u.surname) as user_name, j.description, j.date, j.hours, j.km, concat(c.name,\' \',c.surname) as confirm_user FROM jobs j
LEFT JOIN users u ON j.user_id = u.id
LEFT JOIN users c ON j.confirmed_by_id = c.id '.$where.' ORDER BY '.$order_by.' '.$order_by_direction);
LEFT JOIN users c ON j.confirmed_by_id = c.id '.$where.' ORDER BY '.$order_by.' '.$order_by_direction);*/
return self::$db->query('SELECT q.id, q.job_report_id, r.description as work_report, q.user_id, CONCAT(u.name,\' \', u.surname) AS uname, q.description, q.date, q.hours, q.km, q.suggest_amount
FROM (SELECT j.*, SUM(v.vote) AS sum, COUNT(v.vote) AS count FROM jobs j
LEFT JOIN votes v ON j.id = v.fk_id AND v.type = 1
WHERE j.locked > 0 AND j.job_report_id IS NULL
GROUP BY j.id) as q
LEFT JOIN users u ON q.user_id = u.id
LEFT JOIN job_reports r ON q.job_report_id = r.id
LEFT JOIN transfers t ON q.transfer_id = t.id
WHERE q.sum <= 0 ORDER BY '.$order_by.' '.$order_by_direction.' LIMIT '.$limit_from.', '.$limit_results);
}
public function get_all_pending_works($limit_from = 0, $limit_results = 50, $order_by = 'id', $order_by_direction = 'ASC', $filter_values = array())
{
/*return self::$db->query('SELECT q.id, q.job_report_id, r.description as work_report, q.user_id, CONCAT(u.name,\' \', u.surname) AS uname, q.description, q.date, q.hours, q.km, q.suggest_amount
FROM (SELECT j.*, SUM(v.vote) AS sum, COUNT(v.vote) AS count FROM jobs j
LEFT JOIN votes v ON j.id = v.fk_id AND v.type = 1
WHERE j.locked = 0
GROUP BY j.id) as q
LEFT JOIN users u ON q.user_id = u.id
LEFT JOIN job_reports r ON q.job_report_id = r.id
LEFT JOIN transfers t ON q.transfer_id = t.id
ORDER BY '.$order_by.' '.$order_by_direction.' LIMIT '.$limit_from.', '.$limit_results);*/
return self::$db->query('SELECT j.id, j.job_report_id, r.description AS work_report, j.user_id, CONCAT( u.name, \' \', u.surname ) AS uname, j.description, j.date, j.hours, j.km, j.suggest_amount, v.vote, v.comment
FROM jobs j
LEFT JOIN users u ON j.user_id = u.id
LEFT JOIN job_reports r ON j.job_report_id = r.id
LEFT JOIN transfers t ON j.transfer_id = t.id
LEFT JOIN votes v ON j.id = v.fk_id AND v.type =1 AND v.user_id = '.Session::instance()->get('user_id').'
WHERE j.locked = 0 AND j.job_report_id IS NULL
ORDER BY '.$order_by.' '.$order_by_direction.' LIMIT '.$limit_from.', '.$limit_results);
}
/**
* @author Michal Kliment
......
* @param $filter_values
* @return count of all works
*/
public function count_all_confirmed_works($filter_values = array())
public function count_all_approved_works($filter_values = array())
{
$where = (count($filter_values)) ? 'WHERE ' : '';
/*$where = (count($filter_values)) ? 'WHERE ' : '';
if (isset($filter_values['user_id'])) $where .= 'u.id = '.$filter_values['user_id'];
if (isset($filter_values['description'])) $where .= ($where!='WHERE ') ? ' AND j.description LIKE \'%'.$filter_values['description'].'%\'' : 'j.description LIKE \'%'.$filter_values['description'].'%\'';
if (isset($filter_values['day']))
......
else $where.=' AND j.confirmed_by_id IS NOT NULL';
$works = self::$db->query('SELECT j.id, concat(u.name,\' \',u.surname) as user_name, j.description, j.date, j.hours, j.km FROM jobs j
LEFT JOIN users u ON j.user_id = u.id '.$where);
LEFT JOIN users u ON j.user_id = u.id '.$where);*/
$works = self::$db->query('SELECT q.id FROM (SELECT j.*, SUM(v.vote) AS sum, COUNT(v.vote) AS count FROM jobs j
LEFT JOIN votes v ON j.id = v.fk_id AND v.type = 1
WHERE j.locked > 0 AND j.job_report_id IS NULL
GROUP BY j.id) AS q
WHERE q.sum > 0');
return count($works);
}
public function count_all_unconfirmed_works($filter_values = array())
public function count_all_rejected_works($filter_values = array())
{
$where = (count($filter_values)) ? 'WHERE ' : '';
/*$where = (count($filter_values)) ? 'WHERE ' : '';
if (isset($filter_values['user_id'])) $where .= 'u.id = '.$filter_values['user_id'];
if (isset($filter_values['description'])) $where .= ($where!='WHERE ') ? ' AND j.description LIKE \'%'.$filter_values['description'].'%\'' : 'j.description LIKE \'%'.$filter_values['description'].'%\'';
if (isset($filter_values['day']))
......
else $where.=' AND j.confirmed_by_id IS NULL';
$works = self::$db->query('SELECT j.id, concat(u.name,\' \',u.surname) as user_name, j.description, j.date, j.hours, j.km FROM jobs j
LEFT JOIN users u ON j.user_id = u.id '.$where);
LEFT JOIN users u ON j.user_id = u.id '.$where);*/
$works = self::$db->query('SELECT q.id FROM (SELECT j.*, SUM(v.vote) AS sum, COUNT(v.vote) AS count FROM jobs j
LEFT JOIN votes v ON j.id = v.fk_id AND v.type = 1
WHERE j.locked > 0 AND j.job_report_id IS NULL
GROUP BY j.id) AS q
WHERE q.sum <= 0');
return count($works);
}
public function count_all_pending_works($filter_values = array())
{
$works = self::$db->query('SELECT j.* FROM jobs j
WHERE j.locked = 0 AND j.job_report_id IS NULL');
return count($works);
}
public function get_all_pending_works_by_user($user_id)
{
return self::$db->query('SELECT j.id, j.user_id, j.job_report_id, r.description AS work_report, j.description, j.date, j.hours, j.km, j.suggest_amount, v.vote, v.comment
FROM jobs j
LEFT JOIN job_reports r ON j.job_report_id = r.id
LEFT JOIN transfers t ON j.transfer_id = t.id
LEFT JOIN votes v ON j.id = v.fk_id AND v.type =1 AND v.user_id = '.Session::instance()->get('user_id').'
WHERE j.locked = 0 AND j.job_report_id IS NULL AND j.user_id = '.$user_id);
}
public function get_all_approved_works_by_user ($user_id)
{
return self::$db->query('SELECT q.id, q.job_report_id, r.description as work_report, q.description, q.date, q.hours, q.km, q.transfer_id, t.amount as rating
FROM (SELECT j.*, SUM(v.vote) AS sum, COUNT(v.vote) AS count FROM jobs j
LEFT JOIN votes v ON j.id = v.fk_id AND v.type = 1
WHERE j.locked > 0
GROUP BY j.id) as q
LEFT JOIN job_reports r ON q.job_report_id = r.id
LEFT JOIN transfers t ON q.transfer_id = t.id
WHERE q.sum > 0 AND j.job_report_id IS NULL AND q.user_id = '.$user_id);
}
public function get_all_rejected_works_by_user ($user_id)
{
return self::$db->query('SELECT q.id, q.job_report_id, r.description as work_report, q.description, q.date, q.hours, q.km, q.suggest_amount
FROM (SELECT j.*, SUM(v.vote) AS sum, COUNT(v.vote) AS count FROM jobs j
LEFT JOIN votes v ON j.id = v.fk_id AND v.type = 1
WHERE j.locked > 0
GROUP BY j.id) as q
LEFT JOIN job_reports r ON q.job_report_id = r.id
LEFT JOIN transfers t ON q.transfer_id = t.id
WHERE q.sum <= 0 AND j.job_report_id IS NULL AND q.user_id = '.$user_id);
}
/*
public function get_all_confirmed_works_by_member_id($member_id)
{
......
LEFT JOIN users c ON j.confirmed_by_id = c.id WHERE j.confirmed_by_id IS NULL AND u.member_id = '.$member_id);
}
*/
public function get_all_works_by_job_report_id ($job_report_id)
{
return self::$db->query('SELECT j.id, j.user_id, j.description, j.suggest_amount, date, hours, km, v.vote, v.comment FROM jobs j
LEFT JOIN votes v ON j.id = v.fk_id AND v.type = 1 AND v.user_id = '.Session::instance()->get('user_id').'
WHERE j.job_report_id = '.$job_report_id.'
ORDER BY date');
}
public function get_all_users()
{
return self::$db->query('SELECT u.id, CONCAT(u.name,\' \',u.surname) as name FROM jobs j LEFT JOIN users u ON j.user_id = u.id GROUP BY user_id ORDER BY u.surname');
}
public function get_all_users()
{
return self::$db->query('SELECT u.id, CONCAT(u.name,\' \',u.surname) as name FROM jobs j LEFT JOIN users u ON j.user_id = u.id GROUP BY user_id ORDER BY u.surname');
}
/**
* Function gets confirmed works of given user.
freenetis/trunk/kohana/application/models/job_report.php
<?php
class Job_report_Model extends ORM {
protected $belongs_to = array('user');
public function get_work_report ($work_report_id)
{
return self::$db->query('SELECT r.id, j.user_id, u.member_id, CONCAT(u.name, \' \', u.surname) as uname, r.description, SUM(j.suggest_amount) AS suggest_amount, MIN(j.date) AS date_from, MAX(j.date) AS date_to,
SUM(j.hours) AS hours, SUM(j.km) AS km, MAX(j.locked) AS locked FROM job_reports r
LEFT JOIN jobs j ON r.id = j.job_report_id
LEFT JOIN users u ON j.user_id = u.id
GROUP BY r.id
HAVING r.id = '.$work_report_id)->current();
}
public function get_all_pending_work_reports ($limit_from = 0, $limit_results = 50, $order_by = 'id', $order_by_direction = 'ASC', $filter_values = array())
{
return self::$db->query('SELECT r.id, j.user_id, CONCAT(u.name, \' \', u.surname) as uname, r.description, SUM(j.suggest_amount) AS suggest_amount, MIN(j.date) AS date_from, MAX(j.date) AS date_to,
SUM(j.hours) AS hours, SUM(j.km) AS km, MAX(j.locked) AS locked FROM job_reports r
LEFT JOIN jobs j ON r.id = j.job_report_id
LEFT JOIN users u ON j.user_id = u.id
GROUP BY r.id
HAVING locked = 0
ORDER BY '.$order_by.' '.$order_by_direction.' LIMIT '.$limit_from.', '.$limit_results);
}
public function count_all_pending_work_reports ($filter_values = array())
{
$work_reports = self::$db->query('SELECT r.id, j.user_id, r.description, SUM(j.suggest_amount) AS suggest_amount, MIN(j.date) AS begin_date, MAX(j.date) AS end_date,
SUM(j.hours) AS hours, SUM(j.km) AS km, MAX(j.locked) AS locked FROM job_reports r
LEFT JOIN jobs j ON r.id = j.job_report_id
GROUP BY r.id
HAVING locked = 0');
return count ($work_reports);
}
}
?>
freenetis/trunk/kohana/application/models/vote.php
<?php
class Vote_Model extends ORM {
protected $belongs_to = array('user');
public static $work = 1;
function get_all_votes_by_work($work_id)
{
self::$db->query('SELECT * FROM votes v
WHERE v.type = 1 AND v.fk_id = '.$work_id);
}
}
?>
freenetis/trunk/kohana/application/controllers/upgrade_sql_652.php
<?php
// array of sql queries that upgrade database
$upgrade_sql[652] = array(
"INSERT INTO `axo_map` (`acl_id`, `section_value`, `value`) VALUES ('59', 'Users_Controller', 'additional_contacts');"
);
?>
freenetis/trunk/kohana/application/controllers/votes.php
<?php
/**
* Votes controller
*
* @author Michal Kliment
* @copyright (c) 2010 Kliment Michal
* @license GNU GPLv3
* @license http://www.gnu.org/licenses/gpl.txt
*/
class Votes_Controller extends Controller
{
/**
* Function adds vote to work
* @author Michal Kliment
* @param int id of work
*/
function add_to_work($work_id = NULL)
{
// is parameter set?
if (!$work_id || !is_numeric($work_id))
Controller::warning(PARAMETER);
// create work object
$work = new Job_Model($work_id);
// work doesn't exist
if (!$work->id)
Controller::error(RECORD);
// access control
if (!$this->acl_check_new(get_class($this), 'work', $this->session->get('member_id')))
Controller::error(ACCESS);
// work is locked => cannot add vote
if ($work->locked)
{
$this->session->set_flash('message', url_lang::lang('texts.It is not possible vote about locked work.'));
url::redirect(url_lang::base().'works/show/'.$work->id);
}
$vote_model = new Vote_Model();
$vote = $vote_model->where('user_id', $this->session->get('user_id'))->where('type',Vote_Model::$work)->where('fk_id', $work->id)->find();
// vote about this work already exists
if ($vote && $vote->id)
{
$this->session->set_flash('message', url_lang::lang('texts.You cannot vote twice about same work!'));
url::redirect(url_lang::base().'works/show/'.$work->id);
}
if ($work->user_id != $this->session->get('user_id'))
{
$vote_options = array(1 => url_lang::lang('texts.Agree'),
-1 => url_lang::lang('texts.Disagree'),
0 => url_lang::lang('texts.Abstain'));
}
else
{
// nobody cannot approve his own work
$vote_options = array(0 => url_lang::lang('texts.Abstain'));
}
$form = new Forge(url::base().url::current(TRUE), '', 'POST', array('id' => 'article_form'));
$form->set_attr('class', 'form_class')->set_attr('method', 'post');
$form->dropdown('vote')->label(url_lang::lang('texts.Vote'))->options($vote_options);
$form->textarea('comment')->label(url_lang::lang('texts.Comment').':')->rules('length[0,65535]');
$form->submit('submit')->value(url_lang::lang('texts.Save'));
// form is valid
if ($form->validate())
{
$form_data = $form->as_array();
$vote = new Vote_Model();
$vote->user_id = $this->session->get('user_id');
$vote->type = Vote_Model::$work;
$vote->fk_id = $work->id;
$vote->vote = $form_data['vote'];
$vote->comment = $form_data['comment'];
$vote->save();
$this->session->set_flash('message', url_lang::lang('texts.Vote has been successfully added.'));
url::redirect(url_lang::base().'works/show/'.$work->id);
}
$view = new View('main');
$view->title = url_lang::lang('texts.Add vote about work');
$view->content = new View('form');
$view->content->headline = url_lang::lang('texts.Add vote about work');
$view->content->link_back = html::anchor(url_lang::base().'works/show/'.$work->id, url_lang::lang('texts.Back to the work'));
$view->content->form = $form->html();
$view->render(TRUE);
}
/**
* Function edits vote
* @author Michal Kliment
* @param int id of vote to edit
*/
function edit ($vote_id = NULL)
{
// is parameter set
if (!$vote_id || !is_numeric($vote_id))
Controller::warning(PARAMETER);
// create vote object
$vote = new Vote_Model($vote_id);
// vote doesn't exist
if (!$vote->id)
Controller::error(RECORD);
// test type of vote
switch ($vote->type)
{
// vote about work
case Vote_Model::$work:
// access control
if (!$this->acl_check_edit(get_class($this), 'work', $vote->user->member_id))
Controller::error(ACCESS);
$work = new Job_Model($vote->fk_id);
// work is locked => cannot edit vote
if ($work->locked)
{
$this->session->set_flash('message', url_lang::lang('texts.It is not possible vote about locked work.'));
url::redirect(url_lang::base().'works/show/'.$work->id);
}
if ($work->user_id != $this->session->get('user_id'))
{
$vote_options = array(1 => url_lang::lang('texts.Agree'),
-1 => url_lang::lang('texts.Disagree'),
0 => url_lang::lang('texts.Abstain'));
}
else
{
// nobody cannot approve his own work
$vote_options = array(0 => url_lang::lang('texts.Abstain'));
}
$title = url_lang::lang('texts.Edit vote about work');
$link_back = html::anchor(url_lang::base().'works/show/'.$work->id, url_lang::lang('texts.Back to the work'));
break;
}
$form = new Forge(url::base().url::current(TRUE), '', 'POST', array('id' => 'article_form'));
$form->set_attr('class', 'form_class')->set_attr('method', 'post');
$form->dropdown('vote')->label(url_lang::lang('texts.Vote'))->options($vote_options)->selected($vote->vote);
$form->textarea('comment')->label(url_lang::lang('texts.Comment').':')->rules('length[0,65535]')->value($vote->comment);
$form->submit('submit')->value(url_lang::lang('texts.Save'));
// form is valid
if ($form->validate())
{
$form_data = $form->as_array();
$vote = new Vote_Model($vote_id);
$vote->vote = $form_data['vote'];
$vote->comment = $form_data['comment'];
$vote->save();
$this->session->set_flash('message', url_lang::lang('texts.Vote has been successfully updated.'));
url::redirect(url_lang::base().'works/show/'.$work->id);
}
$view = new View('main');
$view->title = $title;
$view->content = new View('form');
$view->content->headline = $title;
$view->content->link_back = $link_back;
$view->content->form = $form->html();
$view->render(TRUE);
}
/**
* Function deletes vote
* @author Michal Kliment
* @param int id of vote to delete
*/
function delete ($vote_id = NULL)
{
// is parameter set
if (!$vote_id || !is_numeric($vote_id))
Controller::warning (PARAMETER);
// creates vote object
$vote = new Vote_Model($vote_id);
// vote doesn't exist
if (!$vote->id)
Controller::error(RECORD);
// test type of vote
switch ($vote->type)
{
case Vote_Model::$work:
// access control
if (!$this->acl_check_delete(get_class($this), 'work', $vote->user->member_id))
Controller::error(ACCESS);
$work = new Job_Model($vote->fk_id);
// work is locked => cannot edit vote
if ($work->locked)
{
$this->session->set_flash('message', url_lang::lang('texts.It is not possible vote about locked work.'));
}
else
{
$vote->delete();
$this->session->set_flash('message', url_lang::lang('texts.Vote has been successfully deleted.'));
}
url::redirect(url_lang::base().'works/show/'.$work->id);
}
}
}
?>
freenetis/trunk/kohana/application/controllers/work_reports.php
<?php
class Work_reports_Controller extends Controller {
public function index()
{
url::redirect (url_lang::base().'work_reports/pending');
}
public function pending($limit_results = 100, $order_by = 'id', $order_by_direction = 'ASC', $page_word = null, $page = 1)
{
// acccess control
if (!$this->acl_check_view('Users_Controller','work'))
Controller::error(ACCESS);
// gets new selector
if (is_numeric($this->input->get('record_per_page')))
$limit_results = (int) $this->input->get('record_per_page');
// parameters control
//$allowed_order_type = array('id','user_name','description','date','hours','km','confirm_user','confirm_time','rating');
//if (!in_array(strtolower($order_by), $allowed_order_type)) $order_by = 'id';
//if (strtolower($order_by_direction) != 'asc' && strtolower($order_by_direction) != 'desc') $order_by_direction = 'asc';
$work_report_model = new Job_report_Model();
$total_work_reports = $work_report_model->count_all_pending_work_reports();
if (($sql_offset = ($page - 1) * $limit_results) > $total_work_reports)
$sql_offset = 0;
$work_reports = $work_report_model->get_all_pending_work_reports($sql_offset, (int)$limit_results, $order_by, $order_by_direction);
// create grid
$grid = new Grid(url_lang::base().'work_reports/pending', url_lang::lang('texts.List of all pending work reports'), array(
//'separator' => '',
'use_paginator' => true,
'use_selector' => true,
'current' => $limit_results, //current selected 'records_per_page' value
'selector_increace' => 100, // increace
'selector_min' => 100, // minimum where selector start
'selector_max_multiplier' => 20,
'base_url' => Config::get('lang').'/work_reports/pending/'.$limit_results.'/'.$order_by.'/'.$order_by_direction ,
'uri_segment' => 'page', // pass a string as uri_segment to trigger former 'label' functionality
'total_items' => $total_work_reports, // use db count query here of course
'items_per_page' => $limit_results, // it may be handy to set defaults for stuff like this in config/pagination.php
'style' => 'classic',
'order_by' => $order_by,
'order_by_direction' => $order_by_direction,
'limit_results' => $limit_results,
//'query_string' => $query_string
));
if ($this->acl_check_new('Users_Controller','work'))
$grid->add_new_button(url_lang::base().'work_reports/add', url_lang::lang('texts.Add new work report'));
$grid->order_field('id')->label(url_lang::lang('texts.Id'));
$grid->order_callback_field('uname')->label(url_lang::lang('texts.User name'))->callback('Works_Controller::user_name');
$grid->order_field('description')->label(url_lang::lang('texts.Description'));
$grid->order_field('date_from')->label(url_lang::lang('texts.Date from'));
$grid->order_field('date_to')->label(url_lang::lang('texts.Date to'));
$grid->order_field('hours')->label(url_lang::lang('texts.Hours'));
$grid->order_field('km')->label(url_lang::lang('texts.Km'));
$grid->order_callback_field('suggest_amount')->label(url_lang::lang('texts.Suggest amount'))->callback('Works_Controller::suggest_amount');
// access control
if ($this->acl_check_view('Users_Controller','work'))
$grid->action_field('id')->label(url_lang::lang('texts.Show')) ->url(url_lang::base().'work_reports/show') ->action(url_lang::lang('texts.Show'))->class('center');
$grid->datasource($work_reports);
$view = new View('main');
$view->title = url_lang::lang('texts.Pending work reports');
$view->content = new View('work_reports');
$view->content->grid = $grid;
$view->render(TRUE);
}
public function show($work_report_id = NULL)
{
if (!$work_report_id || !is_numeric($work_report_id))
Controller::warning (PARAMETER);
$work_report_model = new Job_report_Model();
$work_report = $work_report_model->get_work_report($work_report_id);
if (!$work_report || !$work_report->id)
Controller::error (RECORD);
$work_model = new Job_Model();
$works = $work_model->get_all_works_by_job_report_id($work_report->id);
// create grid
$works_grid = new Grid(url_lang::base().'work_reports/show/'.$work_report->id, '', array(
//'separator' => '',
'use_paginator' => false,
'use_selector' => false,
'total_items' => count ($works)
));
$works_grid->field('id')->label(url_lang::lang('texts.Id'));
$works_grid->field('description')->label(url_lang::lang('texts.Description'));
$works_grid->field('date')->label(url_lang::lang('texts.Date'));
$works_grid->field('hours')->label(url_lang::lang('texts.Hours'));
$works_grid->field('km')->label(url_lang::lang('texts.Km'));
if ($this->acl_check_new('Votes_Controller', 'work', $this->session->get('member_id')))
{
$works_grid->form_field('vote')->label(url_lang::lang('texts.Vote'))->type('dropdown')->rules('required')->options(array(NULL => '----------------', 1 => url_lang::lang('texts.Agree'), -1 => url_lang::lang('texts.Disagree'), 0 => url_lang::lang('texts.Abstain')))->callback('Works_Controller::vote_form_field');
$works_grid->form_field('comment')->label(url_lang::lang('texts.Comment'))->type('textarea');
}
// access control
if ($this->acl_check_view('Users_Controller','work'))
$works_grid->action_field('id')->label(url_lang::lang('texts.Show')) ->url(url_lang::base().'works/show') ->action(url_lang::lang('texts.Show'))->class('center');
$works_grid->datasource($works);
if ($work_report->locked)
{
$link_back = '';
}
else
{
$state = url_lang::lang('texts.Pending');
$link_back = html::anchor(url_lang::base().'work_reports/pending', url_lang::lang('texts.of all pending work reports'));
$sum = 0;
}
if (isset ($_POST) && count ($_POST))
{
$vote_model = new Vote_Model();
$post_votes = $_POST['vote'];
$comments = $_POST['comment'];
foreach ($post_votes as $id => $post_vote)
{
$vote = $vote_model->where('user_id',$this->session->get('user_id'))->where('fk_id', $id)->where('type',Vote_Model::$work)->find();
if (!$vote->id && $post_vote=="")
continue;
if ($vote->id && $post_vote=="")
{
$vote->delete();
continue;
}
if ($vote->id && $post_vote!="")
{
$vote->vote = $post_vote;
$vote->comment = $comments[$id];
$vote->save();
continue;
}
if (!$vote->id)
{
$vote->clear();
$vote->user_id = $this->session->get('user_id');
$vote->fk_id = $id;
$vote->type = Vote_Model::$work;
$vote->vote = $post_vote;
$vote->comment = $comments[$id];
$vote->save();
}
}
url::redirect(url::base().url::current(TRUE));
}
$view = new View('main');
$view->title = url_lang::lang('texts.Show work report');
$view->content = new View('work_reports_show');
$view->content->work_report = $work_report;
$view->content->link_back = $link_back;
$view->content->state = $state;
$view->content->works_grid = $works_grid;
$view->render(TRUE);
}
public function add($user_id = NULL)
{
if ($user_id)
{
if (!is_numeric($user_id))
Controller::warning(PARAMETER);
$user = new User_Model($user_id);
if (!$user->id)
Controller::error(RECORD);
if (!$this->acl_check_new('Users_Controller','work', $user->member_id))
Controller::error(ACCESS);
$selected = $user->id;
$arr_users[$user->id] = $user->surname.' '.$user->name.' - '.$user->login;
}
else
{
// access control
if (!$this->acl_check_new('Users_Controller', 'work'))
Controller::error(ACCESS);
$user_model = new User_Model();
$users = $user_model->select('id','name','surname','login')->orderby('id')->find_all();
$selected = NULL;
foreach ($users as $user)
{
$arr_users[$user->id] = $user->surname.' '.$user->name.' - '.$user->login;
}
asort($arr_users, SORT_LOCALE_STRING);
$arr_users = arr::merge (array(NULL => '----- '.url_lang::lang('texts.select user').' -----'), $arr_users);
}
// creates form
$form = new Forge(url_lang::base().'work_reports/add'.(isset($user_id)?'/'.$user_id:''), '', 'POST', array('id' => 'article_form'));
$form->set_attr('class', 'form_class')->set_attr('method', 'post');
$form->group('')->label(url_lang::lang('texts.Basic information'));
$form->dropdown('user_id')->label(url_lang::lang('texts.User'))->options($arr_users)->rules('required')->selected($selected);
$form->textarea('description')->label(url_lang::lang('texts.Description').':')->rules('required|length[0,65535]');
$form->group('')->label(url_lang::lang('texts.Work'));
$form->textarea('work_description[1]')->label(url_lang::lang('texts.Description').':')->rules('required|length[0,65535]');
$form->date('work_date[1]')->label(url_lang::lang('texts.Date').':')->years(date('Y')-10, date('Y'))->rules('required');
$form->input('work_hours[1]')->label(url_lang::lang('texts.Hours').':')->rules('required|length[0,250]|valid_numeric');
$form->input('work_km[1]')->label(url_lang::lang('texts.Km').':')->rules('length[0,250]|valid_numeric');
$form->input('work_suggest_amount[1]')->label(url_lang::lang('texts.Suggest amount').':')->rules('required|valid_numeric');
$form->submit('submit')->value(url_lang::lang('texts.Save'));
special::required_forge_style($form, ' *', 'required');
if ($form->validate())
{
//$form_data = $form->as_array();
$form_data = $_POST;
$issaved = TRUE;
$work_report = new Job_report_Model();
$work_report->description = $form_data["description"];
$issaved = $issaved && $work_report->save();
foreach ($form_data["work_description"] as $i => $work_description)
{
$work = new Job_Model();
$work->job_report_id = $work_report->id;
$work->user_id = $form_data["user_id"];
$work->description = $work_description;
$work->suggest_amount = $form_data["work_suggest_amount"][$i];
... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.

Také k dispozici: Unified diff