",{title:i.element.attr("title")});return i.disabled&&this._addClass(s,null,"ui-state-disabled"),this._setText(n,i.label),s.append(n).appendTo(e)},_setText:function(t,e){e?t.text(e):t.html(" ")},_move:function(t,e){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex).parent("li"):(i=this.menuItems.eq(this.element[0].selectedIndex).parent("li"),n+=":not(.ui-state-disabled)"),s="first"===t||"last"===t?i["first"===t?"prevAll":"nextAll"](n).eq(-1):i[t+"All"](n).eq(0),s.length&&this.menuInstance.focus(e,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex).parent("li")},_toggle:function(t){this[this.isOpen?"close":"open"](t)},_setSelection:function(){var t;this.range&&(window.getSelection?(t=window.getSelection(),t.removeAllRanges(),t.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(e){this.isOpen&&(t(e.target).closest(".ui-selectmenu-menu, #"+t.ui.escapeSelector(this.ids.button)).length||this.close(e))}},_buttonEvents:{mousedown:function(){var t;window.getSelection?(t=window.getSelection(),t.rangeCount&&(this.range=t.getRangeAt(0))):this.range=document.selection.createRange()},click:function(t){this._setSelection(),this._toggle(t)},keydown:function(e){var i=!0;switch(e.keyCode){case t.ui.keyCode.TAB:case t.ui.keyCode.ESCAPE:this.close(e),i=!1;break;case t.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(e);break;case t.ui.keyCode.UP:e.altKey?this._toggle(e):this._move("prev",e);break;case t.ui.keyCode.DOWN:e.altKey?this._toggle(e):this._move("next",e);break;case t.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(e):this._toggle(e);break;case t.ui.keyCode.LEFT:this._move("prev",e);break;case t.ui.keyCode.RIGHT:this._move("next",e);break;case t.ui.keyCode.HOME:case t.ui.keyCode.PAGE_UP:this._move("first",e);break;case t.ui.keyCode.END:case t.ui.keyCode.PAGE_DOWN:this._move("last",e);break;default:this.menu.trigger(e),i=!1}i&&e.preventDefault()}},_selectFocusedItem:function(t){var e=this.menuItems.eq(this.focusIndex).parent("li");e.hasClass("ui-state-disabled")||this._select(e.data("ui-selectmenu-item"),t)},_select:function(t,e){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=t.index,this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(t)),this._setAria(t),this._trigger("select",e,{item:t}),t.index!==i&&this._trigger("change",e,{item:t}),this.close(e)},_setAria:function(t){var e=this.menuItems.eq(t.index).attr("id");this.button.attr({"aria-labelledby":e,"aria-activedescendant":e}),this.menu.attr("aria-activedescendant",e)},_setOption:function(t,e){if("icons"===t){var i=this.button.find("span.ui-icon");this._removeClass(i,null,this.options.icons.button)._addClass(i,null,e.button)}this._super(t,e),"appendTo"===t&&this.menuWrap.appendTo(this._appendTo()),"width"===t&&this._resizeButton()},_setOptionDisabled:function(t){this._super(t),this.menuInstance.option("disabled",t),this.button.attr("aria-disabled",t),this._toggleClass(this.button,null,"ui-state-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_toggleAttr:function(){this.button.attr("aria-expanded",this.isOpen),this._removeClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"closed":"open"))._addClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"open":"closed"))._toggleClass(this.menuWrap,"ui-selectmenu-open",null,this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var t=this.options.width;return t===!1?(this.button.css("width",""),void 0):(null===t&&(t=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(t),void 0)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){var t=this._super();return t.disabled=this.element.prop("disabled"),t},_parseOptions:function(e){var i=this,s=[];e.each(function(e,n){s.push(i._parseOption(t(n),e))}),this.items=s},_parseOption:function(t,e){var i=t.parent("optgroup");return{element:t,index:e,value:t.val(),label:t.text(),optgroup:i.attr("label")||"",disabled:i.prop("disabled")||t.prop("disabled")}},_destroy:function(){this._unbindFormResetHandler(),this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.labels.attr("for",this.ids.element)}}]),t.widget("ui.slider",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"slide",options:{animate:!1,classes:{"ui-slider":"ui-corner-all","ui-slider-handle":"ui-corner-all","ui-slider-range":"ui-corner-all ui-widget-header"},distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass("ui-slider ui-slider-"+this.orientation,"ui-widget ui-widget-content"),this._refresh(),this._animateOff=!1
+},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,s=this.options,n=this.element.find(".ui-slider-handle"),o="
",a=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),e=n.length;i>e;e++)a.push(o);this.handles=n.add(t(a.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e).attr("tabIndex",0)})},_createRange:function(){var e=this.options;e.range?(e.range===!0&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=t("
").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),("min"===e.range||"max"===e.range)&&this._addClass(this.range,"ui-slider-range-"+e.range)):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,o,a,r,h,l,c=this,u=this.options;return u.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(s-c.values(e));(n>i||n===i&&(e===c._lastChangedValue||c.values(e)===u.min))&&(n=i,o=t(this),a=e)}),r=this._start(e,a),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=a,this._addClass(o,null,"ui-state-active"),o.trigger("focus"),h=o.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-h.left-o.width()/2,top:e.pageY-h.top-o.height()/2-(parseInt(o.css("borderTopWidth"),10)||0)-(parseInt(o.css("borderBottomWidth"),10)||0)+(parseInt(o.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,a,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this._removeClass(this.handles,null,"ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,s,n,o;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/e,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),o=this._valueMin()+s*n,this._trimAlignValue(o)},_uiHash:function(t,e,i){var s={handle:this.handles[t],handleIndex:t,value:void 0!==e?e:this.value()};return this._hasMultipleValues()&&(s.value=void 0!==e?e:this.values(t),s.values=i||this.values()),s},_hasMultipleValues:function(){return this.options.values&&this.options.values.length},_start:function(t,e){return this._trigger("start",t,this._uiHash(e))},_slide:function(t,e,i){var s,n,o=this.value(),a=this.values();this._hasMultipleValues()&&(n=this.values(e?0:1),o=this.values(e),2===this.options.values.length&&this.options.range===!0&&(i=0===e?Math.min(n,i):Math.max(n,i)),a[e]=i),i!==o&&(s=this._trigger("slide",t,this._uiHash(e,i,a)),s!==!1&&(this._hasMultipleValues()?this.values(e,i):this.value(i)))},_stop:function(t,e){this._trigger("stop",t,this._uiHash(e))},_change:function(t,e){this._keySliding||this._mouseSliding||(this._lastChangedValue=e,this._trigger("change",t,this._uiHash(e)))},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(e,i){var s,n,o;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),void 0;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this._hasMultipleValues()?this._values(e):this.value();for(s=this.options.values,n=arguments[0],o=0;s.length>o;o+=1)s[o]=this._trimAlignValue(n[o]),this._change(null,o);this._refreshValue()},_setOption:function(e,i){var s,n=0;switch("range"===e&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(n=this.options.values.length),this._super(e,i),e){case"orientation":this._detectOrientation(),this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-"+this.orientation),this._refreshValue(),this.options.range&&this._refreshRange(i),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=n-1;s>=0;s--)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_setOptionDisabled:function(t){this._super(t),this._toggleClass(null,"ui-state-disabled",!!t)},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this._hasMultipleValues()){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,s=t-i;return 2*Math.abs(i)>=e&&(s+=i>0?e:-e),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var t=this.options.max,e=this._valueMin(),i=this.options.step,s=Math.round((t-e)/i)*i;t=s+e,t>this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,s,n,o,a=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,c={};this._hasMultipleValues()?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),c["horizontal"===h.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[l?"animate":"css"](c,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),o=this._valueMax(),i=o!==n?100*((s-n)/(o-n)):0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:100-i+"%"},r.animate),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:100-i+"%"},r.animate))},_handleEvents:{keydown:function(e){var i,s,n,o,a=t(e.target).data("ui-slider-handle-index");switch(e.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(e.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(t(e.target),null,"ui-state-active"),i=this._start(e,a),i===!1))return}switch(o=this.options.step,s=n=this._hasMultipleValues()?this.values(a):this.value(),e.keyCode){case t.ui.keyCode.HOME:n=this._valueMin();break;case t.ui.keyCode.END:n=this._valueMax();break;case t.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+o);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-o)}this._slide(e,a,n)},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),this._removeClass(t(e.target),null,"ui-state-active"))}}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY
=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],h=[],l=this._connectWith();if(l&&e)for(s=l.length-1;s>=0;s--)for(o=t(l[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&h.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(h.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t(" ",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,h,l,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[a],l=!1,e[u]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(e[u]-h)&&(n=Math.abs(e[u]-h),o=this.items[s],this.direction=l?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;
+this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget("ui.spinner",{version:"1.12.1",defaultElement:" ",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e=this._super(),i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);null!=n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var e=this.element[0]===t.ui.safeActiveElement(this.document[0]);e||(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===t.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("").parent().append(" ")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&this.uiSpinner.height()>0&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i,s,n;return"culture"===t||"numberFormat"===t?(i=this._parse(this.element.val()),this.options[t]=e,this.element.val(this._format(i)),void 0):(("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(s=this.buttons.first().find(".ui-icon"),this._removeClass(s,null,this.options.icons.up),this._addClass(s,null,e.up),n=this.buttons.last().find(".ui-icon"),this._removeClass(n,null,this.options.icons.down),this._addClass(n,null,e.down)),this._super(t,e),void 0)},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:r(function(t){this._super(t)}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null===t?!1:t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:r(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:r(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:r(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:r(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(r(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),t.uiBackCompat!==!1&&t.widget("ui.spinner",t.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return""},_buttonHtml:function(){return" "}}),t.ui.spinner,t.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,s;i=e.href.replace(t,""),s=location.href.replace(t,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return e.hash.length>1&&i===s}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===e&&(s&&this.tabs.each(function(i,n){return t(n).attr("aria-controls")===s?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===e||-1===e)&&(e=this.tabs.length?0:!1)),e!==!1&&(e=this.tabs.index(this.tabs.eq(e)),-1===e&&(e=i?!1:0)),!i&&e===!1&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:s++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:n=!1,s--;break;case t.ui.keyCode.END:s=this.anchors.length-1;break;case t.ui.keyCode.HOME:s=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}e.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),e.ctrlKey||e.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e),void 0)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=t(),this.anchors.each(function(i,s){var n,o,a,r=t(s).uniqueId().attr("id"),h=t(s).closest("li"),l=h.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=h.attr("aria-controls")||t({}).uniqueId()[0].id,n="#"+a,o=e.element.find(n),o.length||(o=e._createPanel(a),o.insertAfter(e.panels[i-1]||e.tablist)),o.attr("aria-live","polite")),o.length&&(e.panels=e.panels.add(o)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":a,"aria-labelledby":r}),o.attr("aria-labelledby",r)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(e){return t("").attr("id",e).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(e){var i,s,n;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),n=0;s=this.tabs[n];n++)i=t(s),e===!0||-1!==t.inArray(n,e)?(i.attr("aria-disabled","true"),this._addClass(i,null,"ui-state-disabled")):(i.removeAttr("aria-disabled"),this._removeClass(i,null,"ui-state-disabled"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,e===!0)},_setupEvents:function(e){var i={};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,h=r?t():this._getPanelForTab(o),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():o,newPanel:h};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){o._addClass(i.newTab.closest("li"),"ui-tabs-active","ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){o._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n()}):(this._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+t.ui.escapeSelector(e)+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(e){var i=this.options.disabled;i!==!1&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(i!==!0){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var s=this,n=this.tabs.eq(e),o=n.find(".ui-tabs-anchor"),a=this._getPanelForTab(n),r={tab:n,panel:a},h=function(t,e){"abort"===e&&s.panels.stop(!1,!0),s._removeClass(n,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===s.xhr&&delete s.xhr};this._isLocal(o[0])||(this.xhr=t.ajax(this._ajaxSettings(o,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(n,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,n){setTimeout(function(){a.html(t),s._trigger("load",i,r),h(n,e)},1)}).fail(function(t,e){setTimeout(function(){h(t,e)},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href").replace(/#.*$/,""),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),t.uiBackCompat!==!1&&t.widget("ui.tabs",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}}),t.ui.tabs,t.widget("ui.tooltip",{version:"1.12.1",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var e=t(this).attr("title")||"";return t("
").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))},_removeDescribedBy:function(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=t("").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=t([])},_setOption:function(e,i){var s=this;this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s.element[0],e.close(n,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var e=t(this);return e.is("[title]")?e.data("ui-tooltip-title",e.attr("title")).removeAttr("title"):void 0}))},_enable:function(){this.disabledTitles.each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))}),this.disabledTitles=t([])},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(e,s),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s||s.nodeType||s.jquery?this._open(e,t,s):(i=s.call(t[0],function(i){n._delay(function(){t.data("ui-tooltip-open")&&(e&&(e.type=o),this._open(e,t,i))})}),i&&this._open(e,t,i),void 0)},_open:function(e,i,s){function n(t){l.of=t,a.is(":hidden")||a.position(l)}var o,a,r,h,l=t.extend({},this.options.position);if(s){if(o=this._find(i))return o.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(e&&"mouseover"===e.type?i.attr("title",""):i.removeAttr("title")),o=this._tooltip(i),a=o.tooltip,this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),h=t("
").html(a.find(".ui-tooltip-content").html()),h.removeAttr("name").find("[name]").removeAttr("name"),h.removeAttr("id").find("[id]").removeAttr("id"),h.appendTo(this.liveRegion),this.options.track&&e&&/^mouse/.test(e.type)?(this._on(this.document,{mousemove:n}),n(e)):a.position(t.extend({of:i},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(l.of),clearInterval(r))},t.fx.interval)),this._trigger("open",e,{tooltip:a})}},_registerCloseHandlers:function(e,i){var s={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var s=t.Event(e);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),e&&"mouseover"!==e.type||(s.mouseleave="close"),e&&"focusin"!==e.type||(s.focusout="close"),this._on(!0,i,s)},close:function(e){var i,s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);return o?(i=o.tooltip,o.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),o.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e]}),o.closing=!0,this._trigger("close",e,{tooltip:i}),o.hiding||(o.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(e){var i=t("
").attr("role","tooltip"),s=t("
").appendTo(i),n=i.uniqueId().attr("id");return this._addClass(s,"ui-tooltip-content"),this._addClass(i,"ui-tooltip","ui-widget ui-widget-content"),i.appendTo(this._appendTo(e)),this.tooltips[n]={element:e,tooltip:i}},_find:function(t){var e=t.data("ui-tooltip-id");return e?this.tooltips[e]:null},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){var e=t.closest(".ui-front, dialog");return e.length||(e=this.document[0].body),e},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur"),o=s.element;n.target=n.currentTarget=o[0],e.close(n,!0),t("#"+i).remove(),o.data("ui-tooltip-title")&&(o.attr("title")||o.attr("title",o.data("ui-tooltip-title")),o.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),t.uiBackCompat!==!1&&t.widget("ui.tooltip",t.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}}),t.ui.tooltip});
\ No newline at end of file
diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/edit.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/edit.html.twig
index e6144d3f..cf297b66 100755
--- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/edit.html.twig
+++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/edit.html.twig
@@ -118,6 +118,9 @@
{{ form_label(form.fgcancreateblog) }}
{{ form_widget(form.fgcancreateblog) }}
+
+ {{ form_label(form.fgcancreateproject) }}
+ {{ form_widget(form.fgcancreateproject) }}
@@ -132,6 +135,7 @@
{{ form_row(form.alerts) }}
{{ form_row(form.calendars) }}
{{ form_row(form.blogs) }}
+ {{ form_row(form.projects) }}
{{ form_row(form.fluxs) }}
{{ form_row(form.notices) }}
diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/list.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/list.html.twig
index 0dbabee1..967c63bb 100644
--- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/list.html.twig
+++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/list.html.twig
@@ -42,6 +42,7 @@
Création Pages
Création Calendriers
Création Blogs
+
Création Projets
{% endif %}
{% endif %}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Command/InitDataCommand.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Command/InitDataCommand.php
index 17163e62..891a08a5 100644
--- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Command/InitDataCommand.php
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Command/InitDataCommand.php
@@ -19,6 +19,8 @@ use Cadoles\PortalBundle\Entity\PageWidget;
use Cadoles\PortalBundle\Entity\Widget;
use Cadoles\PortalBundle\Entity\Appexternal;
use Cadoles\PortalBundle\Entity\Flux;
+use Cadoles\PortalBundle\Entity\Projecttasktag;
+use Cadoles\PortalBundle\Entity\Projecttaskstatus;
use Cadoles\PortalBundle\Entity\Itemcategory;
use Cadoles\PortalBundle\Entity\Item;
@@ -70,6 +72,14 @@ class InitDataCommand extends ContainerAwareCommand
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new AssignedGenerator());
+ $metadata = $em->getClassMetaData('CadolesPortalBundle:Projecttasktag');
+ $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
+ $metadata->setIdGenerator(new AssignedGenerator());
+
+ $metadata = $em->getClassMetaData('CadolesPortalBundle:Projecttaskstatus');
+ $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
+ $metadata->setIdGenerator(new AssignedGenerator());
+
$metadata = $em->getClassMetaData('CadolesPortalBundle:Pagecategory');
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new AssignedGenerator());
@@ -181,6 +191,88 @@ class InitDataCommand extends ContainerAwareCommand
$em->flush();
}
+//== PROJECTTASKTAG ===============================================================================================================================================
+ $output->writeln(' > Creation Projecttasktag');
+
+ $entityTag = $em->getRepository('CadolesPortalBundle:Projecttasktag')->find(1);
+ if(!$entityTag) {
+ $entityTag = new Projecttasktag();
+ $entityTag->setId(1);
+ $entityTag->setName("Demande");
+ $entityTag->setColor("1e824c");
+ $em->persist($entityTag);
+ $em->flush();
+ }
+
+ $entityTag = $em->getRepository('CadolesPortalBundle:Projecttasktag')->find(2);
+ if(!$entityTag) {
+ $entityTag = new Projecttasktag();
+ $entityTag->setId(2);
+ $entityTag->setName("Evolution");
+ $entityTag->setColor("2574a9");
+ $em->persist($entityTag);
+ $em->flush();
+ }
+
+ $entityTag = $em->getRepository('CadolesPortalBundle:Projecttasktag')->find(3);
+ if(!$entityTag) {
+ $entityTag = new Projecttasktag();
+ $entityTag->setId(3);
+ $entityTag->setName("Anomalie");
+ $entityTag->setColor("cf000f");
+ $em->persist($entityTag);
+ $em->flush();
+ }
+
+ $entityTag = $em->getRepository('CadolesPortalBundle:Projecttasktag')->find(4);
+ if(!$entityTag) {
+ $entityTag = new Projecttasktag();
+ $entityTag->setId(4);
+ $entityTag->setName("Question");
+ $entityTag->setColor("f15a22");
+ $em->persist($entityTag);
+ $em->flush();
+ }
+
+//== PROJECTTASKSTATUS ============================================================================================================================================
+ $output->writeln(' > Creation Projecttaskstatus');
+
+ $entityStatus = $em->getRepository('CadolesPortalBundle:Projecttaskstatus')->find(10);
+ if(!$entityStatus) {
+ $entityStatus = new Projecttaskstatus();
+ $entityStatus->setId(10);
+ $entityStatus->setName("En Attente");
+ $em->persist($entityStatus);
+ $em->flush();
+ }
+
+ $entityStatus = $em->getRepository('CadolesPortalBundle:Projecttaskstatus')->find(20);
+ if(!$entityStatus) {
+ $entityStatus = new Projecttaskstatus();
+ $entityStatus->setId(20);
+ $entityStatus->setName("A Faire");
+ $em->persist($entityStatus);
+ $em->flush();
+ }
+
+ $entityStatus = $em->getRepository('CadolesPortalBundle:Projecttaskstatus')->find(30);
+ if(!$entityStatus) {
+ $entityStatus = new Projecttaskstatus();
+ $entityStatus->setId(30);
+ $entityStatus->setName("Fait");
+ $em->persist($entityStatus);
+ $em->flush();
+ }
+
+ $entityStatus = $em->getRepository('CadolesPortalBundle:Projecttaskstatus')->find(40);
+ if(!$entityStatus) {
+ $entityStatus = new Projecttaskstatus();
+ $entityStatus->setId(40);
+ $entityStatus->setName("Livré");
+ $em->persist($entityStatus);
+ $em->flush();
+ }
+
//== PAGECATEGORY ========================================================================================================================================
$output->writeln(' > Creation Pagecategory');
@@ -720,7 +812,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_ribbon.png"]);
$entityWidget->setId(-2000);
- $entityWidget->setRoworder(1);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('URL');
$entityWidget->setDescription("Affiche le contenu d'une url");
@@ -740,7 +832,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_computer.png"]);
$entityWidget->setId(-1990);
- $entityWidget->setRoworder(2);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Bureau');
$entityWidget->setDescription("Affiche vos items de bureau");
@@ -760,7 +852,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_megaphone.png"]);
$entityWidget->setId(-1980);
- $entityWidget->setRoworder(3);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Annonces');
$entityWidget->setDescription("Affiche vos annonces");
@@ -780,7 +872,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_rss.png"]);
$entityWidget->setId(-1970);
- $entityWidget->setRoworder(4);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Flux');
$entityWidget->setDescription("Affiche vos flux RSS");
@@ -800,7 +892,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_star.png"]);
$entityWidget->setId(-1960);
- $entityWidget->setRoworder(5);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Favoris');
$entityWidget->setDescription("Création de Favoris");
@@ -820,7 +912,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_bolt.png"]);
$entityWidget->setId(-1950);
- $entityWidget->setRoworder(6);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Lien');
$entityWidget->setDescription("Création d'un Lien");
@@ -840,7 +932,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_compose.png"]);
$entityWidget->setId(-1940);
- $entityWidget->setRoworder(7);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Editeur');
$entityWidget->setDescription("Votre propre texte à éditer");
@@ -860,7 +952,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_easel.png"]);
$entityWidget->setId(-1930);
- $entityWidget->setRoworder(8);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Carrousel');
$entityWidget->setDescription("Carrousel d'images");
@@ -880,7 +972,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_folder.png"]);
$entityWidget->setId(-1920);
- $entityWidget->setRoworder(9);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Fichiers');
$entityWidget->setDescription("Répertoire de fichiers");
@@ -900,7 +992,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_image.png"]);
$entityWidget->setId(-1910);
- $entityWidget->setRoworder(10);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Galerie');
$entityWidget->setDescription("Galerie d'images");
@@ -920,7 +1012,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_calendar.png"]);
$entityWidget->setId(-1900);
- $entityWidget->setRoworder(11);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Calendrier');
$entityWidget->setDescription("Calendrier d'évènements");
@@ -939,7 +1031,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_rocket.png"]);
$entityWidget->setId(-1890);
- $entityWidget->setRoworder(12);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Blog');
$entityWidget->setDescription("Les derniers articles publiés sur vos blogs");
@@ -959,7 +1051,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_rss.png"]);
$entityWidget->setId(-1880);
- $entityWidget->setRoworder(13);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('RSS');
$entityWidget->setDescription("Afficher un flux RSS spécifique");
@@ -990,7 +1082,7 @@ class InitDataCommand extends ContainerAwareCommand
if($entityWidget) {
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_frames.png"]);
$entityWidget->setId(-1870);
- $entityWidget->setRoworder(14);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Mes Formulaires');
$entityWidget->setDescription("Afficher vos formulaires provenant de vos applications");
@@ -1011,7 +1103,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_info.png"]);
$entityWidget->setId(-1860);
- $entityWidget->setRoworder(13);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Information Page');
$entityWidget->setDescription("Afficher les informations associées à la page");
@@ -1030,7 +1122,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_computer.png"]);
$entityWidget->setId(-1850);
- $entityWidget->setRoworder(2);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Bureau Essentiel');
$entityWidget->setDescription("Affiche les items de bureau essentiel");
@@ -1051,7 +1143,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_chat.png"]);
$entityWidget->setId(-1840);
- $entityWidget->setRoworder(2);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Chat');
$entityWidget->setDescription("Conversation instantanée");
@@ -1074,7 +1166,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_users.png"]);
$entityWidget->setId(-1830);
- $entityWidget->setRoworder(2);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Mes Groupes de Travail');
$entityWidget->setDescription("Affiche la liste de vos groupes de travail");
@@ -1093,7 +1185,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_megaphone2.png"]);
$entityWidget->setId(-1820);
- $entityWidget->setRoworder(2);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Actualités de mes Groupes');
$entityWidget->setDescription("Affiche la liste actualités de vos groupes de travail");
@@ -1113,7 +1205,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_onlyoffice.png"]);
$entityWidget->setId(-1810);
- $entityWidget->setRoworder(2);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Onlyoffice');
$entityWidget->setDescription("Les documents associés à votre groupe");
@@ -1131,12 +1223,32 @@ class InitDataCommand extends ContainerAwareCommand
$em->remove($entityWidget);
}
+ // Widget Project
+ $entityWidget = $em->getRepository('CadolesPortalBundle:Widget')->find(-1800);
+ if(!$entityWidget) $entityWidget = new Widget();
+ $entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_check.png"]);
+ $entityWidget->setId(-1800);
+ $entityWidget->setRoworder(0);
+ $entityWidget->setIcon($entityicon);
+ $entityWidget->setName('Projet');
+ $entityWidget->setDescription("Gestion de projet");
+ $entityWidget->setRouteview("cadoles_portal_config_panelwidget_view_project");
+ $entityWidget->setHeight("630");
+ $entityWidget->setAutoajust(true);
+ $entityWidget->setBorder(false);
+ $entityWidget->setOpened(true);
+ $entityWidget->setAccess(["config","user","group"]);
+ $parameter = json_decode('{"fields": []}');
+ $entityWidget->setParameter($parameter);
+ $em->persist($entityWidget);
+
+
// Widget Séparateur
$entityWidget = $em->getRepository('CadolesPortalBundle:Widget')->find(-1600);
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_roadblock.png"]);
$entityWidget->setId(-1600);
- $entityWidget->setRoworder(100);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Séparateur');
$entityWidget->setDescription("Widget graphique pour séparer les autres widgets");
@@ -1156,7 +1268,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_clock.png"]);
$entityWidget->setId(-1500);
- $entityWidget->setRoworder(100);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Horloge');
$entityWidget->setDescription("Une simple horloge");
@@ -1175,7 +1287,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityWidget) $entityWidget = new Widget();
$entityicon = $em->getRepository('CadolesPortalBundle:Icon')->findoneby(["label"=>"uploads/icon/icon_calculator.png"]);
$entityWidget->setId(-1490);
- $entityWidget->setRoworder(110);
+ $entityWidget->setRoworder(0);
$entityWidget->setIcon($entityicon);
$entityWidget->setName('Calculatrice');
$entityWidget->setDescription("Une simple calculatrice");
@@ -1222,7 +1334,7 @@ class InitDataCommand extends ContainerAwareCommand
$entityPagewidget = new Pagewidget();
$entityPagewidget->setId(-110);
$entityPagewidget->setLoc("R1C1");
- $entityPagewidget->setRoworder(1);
+ $entityPagewidget->setRoworder(0);
$entityPagewidget->setName("Applications");
$entityPagewidget->setHeight($entityWidget->getHeight());
$entityPagewidget->setAutoajust($entityWidget->getAutoajust());
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/PagewidgetController.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/PagewidgetController.php
index 15ab48cd..3c0ef6d0 100644
--- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/PagewidgetController.php
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/PagewidgetController.php
@@ -1677,6 +1677,77 @@ class PagewidgetController extends Controller
]);
}
+ public function viewprojectAction(Request $request,$id,$access="config") {
+ $usage=$request->query->get('usage');
+ $group=$request->query->get('group');
+
+ $em = $this->getDoctrine()->getManager();
+ $entity = $em->getRepository($this->labelentity)->find($id);
+ if (!$entity) throw $this->createNotFoundException('Unable to find entity.');
+
+ // Permissions
+ if($access=="config") {
+ $canupdate = true;
+ }
+ else {
+ // On s'assure que l'utilisateur à la permission de voir
+ $page=$entity->getPage();
+ $em->getRepository("CadolesPortalBundle:Page")->getPermission($this->getUser(),$page,$cansee,$canupdate);
+ if(!$cansee) throw $this->createNotFoundException('Permission denied');
+ }
+
+ // Parametres
+ $nbarticle=10;
+ foreach($entity->getParameter()["fields"] as $parameter) {
+ switch($parameter["id"]) {
+ case "nbarticle":
+ $nbarticle=$parameter["value"];
+ break;
+ }
+ }
+
+ // On récupère soit les projects du group en cours soit l'ensemble des projects de l'utilisateur
+ $user=$this->getUser();
+ if($usage=="group") {
+ $projects=$em->getRepository("CadolesPortalBundle:Project")->getProjectsGroup($this->getUser(),$group);
+ if($projects) $firstproject=$projects[0]->getId();
+ }
+ else {
+ $em->getRepository("CadolesPortalBundle:Project")->getProjectsUser($user,$projectsuser,$projectsadmin,$projectsshared);
+ $projects=array_merge($projectsuser,$projectsadmin->toArray(),$projectsshared);
+ $firstproject="all";
+ }
+
+ // On récupère les nbarticle de ses projects
+ $em->getRepository("CadolesPortalBundle:Projecttask")->getProjectsTasks($projects,0,$nbarticle,$count,$projecttasks);
+
+ foreach($projecttasks as $key => $projecttask) {
+ if($projecttask->getPercentage()==100) unset($projecttasks[$key]);
+ }
+
+ if($usage!="group") {
+ foreach($projecttasks as $key => $projecttask) {
+ if(!$user) unset($projecttasks[$key]);
+ else {
+ if($projecttask->getUser() && $projecttask->getUser()!=$user) unset($projecttasks[$key]);
+ elseif($projecttask->getOwner() && $projecttask->getOwner()!=$user) unset($projecttasks[$key]);
+ }
+ }
+ }
+
+ // Render
+ return $this->render($this->labelentity.':viewproject.html.twig', [
+ 'entity' => $entity,
+ 'canadd' => $canupdate,
+ 'canupdate' => $canupdate,
+ 'projecttasks' => $projecttasks,
+ 'nbarticle' => $nbarticle,
+ 'access' => $access,
+ 'firstproject' => $firstproject,
+ 'usage' => $usage
+ ]);
+ }
+
public function viewseparatorAction($id,$access="config") {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository($this->labelentity)->find($id);
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/ProjectController.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/ProjectController.php
new file mode 100644
index 00000000..51918b4a
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/ProjectController.php
@@ -0,0 +1,422 @@
+render($this->labelentity.':list.html.twig',[
+ 'useheader' => true,
+ 'usemenu' => false,
+ 'usesidebar' => true,
+ ]);
+ }
+
+ public function ajaxlistAction(Request $request,$access="config")
+ {
+ // S'assurer que c'est un appel ajax
+ /*
+ if (!$request->isXmlHttpRequest()) {
+ return new JsonResponse(array('message' => 'Interdit'), 400);
+ }
+ */
+
+ $em = $this->getDoctrine()->getManager();
+
+ $start=$request->query->get('start');
+ $length= $request->query->get('length');
+ $search= $request->query->get('search');
+ $draw= $request->query->get('draw');
+ $order= $request->query->get('order');
+ $alluser= $request->query->get('alluser');
+
+ // On sauvegarde en session le flag alluser
+ $this->get("session")->set("alluserproject",$alluser);
+
+ // Query de base
+ $qbase=$em->createQueryBuilder()->from($this->labelentity,'table');
+ $qsearch=$em->createQueryBuilder()->from($this->labelentity,'table');
+
+ if($alluser=="false") {
+ $qbase->where("table.user is null");
+ $qsearch->where("table.user is null");
+ }
+ else {
+ $qbase->from('CadolesCoreBundle:User','user')
+ ->where("table.user=user");
+
+ $qsearch->from('CadolesCoreBundle:User','user')
+ ->where("table.user=user");
+ }
+
+ if($alluser=="false")
+ $qsearch->andwhere('table.id LIKE :value OR table.name LIKE :value');
+ else
+ $qsearch->andWhere('table.id LIKE :value OR table.name LIKE :value OR user.username LIKE :value') ;
+
+ $qsearch->setParameter("value", "%".$search["value"]."%");
+
+ // Nombre total d'enregistrement
+ $total = $qbase->select('COUNT(table)')->getQuery()->getSingleScalarResult();
+
+ // Nombre d'enregistrement filtré
+ if($search["value"]=="")
+ $totalf = $total;
+ else {
+ $totalf= $qsearch->select('COUNT(table)')->getQuery()->getSingleScalarResult();
+ }
+
+ // Parcours des Enregistrement
+ if($search["value"]=="")
+ $qb = $qbase->select('table');
+ else
+ $qb = $qsearch->select('table');
+
+ // Order
+ switch($order[0]["column"]) {
+ case 1 :
+ $qb->orderBy('table.name',$order[0]["dir"]);
+ break;
+ case 2 :
+ if($alluser=="true") $qb->orderBy('user.username',$order[0]["dir"]);
+ break;
+ }
+
+ // Execution de la requete d'affichage
+ $datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
+ //dump($qsearch->getQuery()->getSql());
+
+ // Construction du tableau de retour
+ $output = array(
+ 'draw' => $draw,
+ 'recordsFiltered' => $totalf,
+ 'recordsTotal' => $total,
+ 'data' => array(),
+ );
+
+ foreach($datas as $data) {
+ $route=str_replace("_config_","_".$access."_",$this->routeprimary);
+ $action = "";
+ $action.="$data->getId()))."' data-method='delete'> ";
+ $action.="$data->getId()))."'> ";
+
+ $user="";
+ if($data->getUser()) {
+ $user.=" getUser()->getAvatar()."' class='avatar' style='margin:0px 5px 0px 0px;display:inline-block;'>";
+ $user.=$data->getUser()->getUsername();
+ }
+
+ array_push($output["data"],array($action,$data->getName(),$user));
+ }
+
+ // Retour
+ return new Response(json_encode($output), 200);
+ }
+
+ public function ajaxseleclistAction(Request $request)
+ {
+ // S'assurer que c'est un appel ajax
+ if (!$request->isXmlHttpRequest()) {
+ return new JsonResponse(array('message' => 'Interdit'), 400);
+ }
+
+ $output=array();
+ $em = $this->getDoctrine()->getManager();
+ $page_limit=$request->query->get('page_limit');
+ $q=$request->query->get('q');
+
+ $qb = $em->createQueryBuilder();
+ $qb->select('table')->from("CadolesPortalBundle:Project",'table')
+ ->where('table.name LIKE :value')
+ ->setParameter("value", "%".$q."%")
+ ->orderBy('table.name');
+
+ $datas=$qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult();
+ foreach($datas as $data) {
+ array_push($output,array("id"=>$data->getId(),"text"=>$data->getName()));
+ }
+
+ $response = new Response(json_encode($output));
+ $response->headers->set('Content-Type', 'application/json');
+ return $response;
+ }
+
+ private function entityForm(Project $entity,$access="config")
+ {
+ $route=str_replace("_config_","_".$access."_",$this->routeprimary);
+
+ if ($this->getDoctrine()->getManager()->contains($entity)) {
+ return $this->createForm(ProjectType::class, $entity, [
+ "mode" => "update",
+ "access" => $access
+ ]);
+ }
+ else {
+ return $this->createForm(ProjectType::class, $entity, [
+ "mode" => "submit",
+ "access" => $access
+ ]);
+ }
+ }
+
+ public function submitAction(Request $request,$access="config")
+ {
+ if($access=="user"&&!$this->get('session')->get('cancreateproject'))
+ throw $this->createNotFoundException('Permission denied');
+
+ $entity = new Project();
+
+ $form = $this->entityForm($entity,$access);
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+
+
+ $em = $this->getDoctrine()->getManager();
+ if($access=="user") $entity->setUser($this->getUser());
+
+ $em->persist($entity);
+ $em->flush();
+
+ return $this->redirect($this->generateUrl('cadoles_portal_'.$access.'_project_view',["id"=>$entity->getId()]));
+ }
+
+ return $this->render($this->labelentity.':edit.html.twig', [
+ 'useheader' => ($access=="config"),
+ 'usemenu' => false,
+ 'usesidebar' => ($access=="config"),
+ 'maxwidth' => ($access=="user"),
+ 'entity' => $entity,
+ 'mode' => "submit",
+ 'access' => $access,
+ 'form' => $form->createView()
+ ]);
+ }
+
+ public function updateAction(Request $request, $id,$access="config")
+ {
+ $em = $this->getDoctrine()->getManager();
+ $entity = $em->getRepository($this->labelentity)->find($id);
+ if (!$entity) throw $this->createNotFoundException('Unable to find entity.');
+
+ // On s'assure que l'utilisateur à la permission de modifier
+ if($access=="user") {
+ $em->getRepository($this->labelentity)->getPermission($this->getUser(),$entity,$cansee,$canupdate,$canadd);
+ if(!$canupdate) throw $this->createNotFoundException('Permission denied');
+ }
+
+ // Création du formulaire
+ $form = $this->entityForm($entity,$access);
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+ $em = $this->getDoctrine()->getManager();
+ $em->persist($entity);
+ $em->flush();
+
+ return $this->redirect($this->generateUrl('cadoles_portal_'.$access.'_project_view',["id"=>$entity->getId()]));
+ }
+
+
+ return $this->render($this->labelentity.':edit.html.twig', [
+ 'useheader' => ($access=="config"),
+ 'usemenu' => false,
+ 'usesidebar' => ($access=="config"),
+ 'maxwidth' => ($access=="user"),
+ 'entity' => $entity,
+ 'access' => $access,
+ 'mode' => "update",
+ 'form' => $form->createView(),
+ ]);
+ }
+
+ public function shareAction(Request $request, $id,$access="config")
+ {
+ $em = $this->getDoctrine()->getManager();
+ $entity = $em->getRepository($this->labelentity)->find($id);
+ if (!$entity) throw $this->createNotFoundException('Unable to find entity.');
+
+ // On s'assure que l'utilisateur à la permission de modifier
+ if($access=="user") {
+ $em->getRepository($this->labelentity)->getPermission($this->getUser(),$entity,$cansee,$canupdate,$canadd);
+ if(!$canupdate) throw $this->createNotFoundException('Permission denied');
+ }
+
+ // Création du formulaire
+ $form = $this->createForm(ProjectShareType::class, $entity, ["access" => $access, "user" => $this->getUser()]);
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+ $em = $this->getDoctrine()->getManager();
+ $em->persist($entity);
+ $em->flush();
+
+ return $this->redirect($this->generateUrl('cadoles_portal_'.$access.'_project_view',["id"=>$id]));
+ }
+
+
+ return $this->render($this->labelentity.':share.html.twig', [
+ 'useheader' => ($access=="config"),
+ 'usemenu' => false,
+ 'usesidebar' => ($access=="config"),
+ 'maxwidth' => ($access=="user"),
+ 'entity' => $entity,
+ 'access' => $access,
+ 'form' => $form->createView(),
+ ]);
+ }
+
+ public function writerAction(Request $request, $id,$access="config")
+ {
+ $em = $this->getDoctrine()->getManager();
+ $entity = $em->getRepository($this->labelentity)->find($id);
+ if (!$entity) throw $this->createNotFoundException('Unable to find entity.');
+
+ // On s'assure que l'utilisateur à la permission de modifier
+ if($access=="user") {
+ $em->getRepository($this->labelentity)->getPermission($this->getUser(),$entity,$cansee,$canupdate,$canadd);
+ if(!$canupdate) throw $this->createNotFoundException('Permission denied');
+ }
+
+ // Création du formulaire
+ $form = $this->createForm(ProjectWriterType::class, $entity, ["id"=>$entity->getId(),"access" => $access, "user" => $this->getUser()]);
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+ $em = $this->getDoctrine()->getManager();
+ $em->persist($entity);
+ $em->flush();
+
+ return $this->redirect($this->generateUrl('cadoles_portal_'.$access.'_project_view',["id"=>$id]));
+ }
+
+
+ return $this->render($this->labelentity.':writer.html.twig', [
+ 'useheader' => ($access=="config"),
+ 'usemenu' => false,
+ 'usesidebar' => ($access=="config"),
+ 'maxwidth' => ($access=="user"),
+ 'entity' => $entity,
+ 'access' => $access,
+ 'form' => $form->createView(),
+ ]);
+ }
+
+ public function deleteAction(Request $request, $id,$access="config")
+ {
+ $em = $this->getDoctrine()->getManager();
+ $entity = $this->getDoctrine()->getRepository($this->labelentity)->find($id);
+ if (!$entity) throw $this->createNotFoundException('Unable to find entity.');
+
+ // On s'assure que l'utilisateur à la permission de supprimer
+ if($access=="user") {
+ $em->getRepository($this->labelentity)->getPermission($this->getUser(),$entity,$cansee,$canupdate,$canadd);
+ if(!$canupdate) throw $this->createNotFoundException('Permission denied');
+ }
+
+ // Suppression
+ $em->remove($entity);
+ $em->flush();
+
+ // Retour
+ if($access=="config")
+ return $this->redirect($this->generateUrl($this->routeprimary));
+ else
+ return $this->redirect($this->generateUrl('cadoles_portal_'.$access.'_project_view'));
+ }
+
+ public function viewAction(Request $request, $id, $access="config") {
+
+ $page=$request->query->get("page");
+ if(is_null($page)) $page=1;
+
+ $em = $this->getDoctrine()->getManager();
+ $entity=[];
+ if($id!=0) {
+ $entity = $em->getRepository($this->labelentity)->find($id);
+ if (!$entity) throw $this->createNotFoundException('Unable to find entity.');
+ }
+
+ // Permissions
+ $user=$this->getUser();
+ if($access=="config") {
+ $canupdate = true;
+ $canadd=true;
+ $cansee=true;
+
+ $projects=$em->getRepository($this->labelentity)->findBy(["id"=>$id]);
+ $entity->setCanupdate(true);
+ $entity->setCanadd(true);
+
+ }
+ else {
+ // On récupère l'ensemble des projects de l'utilisateur
+ $em->getRepository($this->labelentity)->getProjectsUser($user,$projectsuser,$projectsadmin,$projectsshared);
+ $projects=array_merge($projectsuser,$projectsadmin->toArray(),$projectsshared);
+
+ // Utilisateur sans project = creation d'un project par défaut
+ if(empty($projectsuser)&&$user) {
+ $project=new Project();
+ $project->setName("Mon Project");
+ $project->setUser($user);
+ $project->setCanupdate(true);
+ $em->persist($project);
+ $em->flush();
+
+ $projectsuser=[$project];
+ }
+
+ // permission
+ if($id==0) {
+ $cansee=true;
+ $canadd=($this->getUser());
+ }
+ else {
+ $em->getRepository($this->labelentity)->getPermission($user,$entity,$cansee,$canupdate,$canadd);
+ }
+
+ if(!$cansee) throw $this->createNotFoundException('Permission denied');
+
+ $canupdate=$this->get('session')->get('cancreateproject');
+ }
+
+ $pagination=15;
+ if($entity)
+ $em->getRepository("CadolesPortalBundle:Projecttask")->getProjectsTasks($entity,($page-1)*$pagination,$pagination,$count,$projecttasks);
+ else
+ $em->getRepository("CadolesPortalBundle:Projecttask")->getProjectsTasks($projects,($page-1)*$pagination,$pagination,$count,$projecttasks);
+
+
+ return $this->render($this->labelentity.':view.html.twig', [
+ 'useheader' => ($access=="config"),
+ 'usemenu' => false,
+ 'usesidebar' => ($access=="config"),
+ 'maxwidth' => ($access=="user"),
+ 'entity' => $entity,
+ 'access' => $access,
+ 'canupdate' => $canupdate,
+ 'canadd' => $cansee,
+ 'projecttasks' => $projecttasks,
+ 'projects' => $projects,
+ 'countarticles' => $count,
+ 'pagination' => $pagination,
+ 'page' => $page
+ ]);
+
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/ProjecttaskController.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/ProjecttaskController.php
new file mode 100644
index 00000000..c64d9579
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/ProjecttaskController.php
@@ -0,0 +1,352 @@
+routeprimary);
+
+ if ($this->getDoctrine()->getManager()->contains($entity)) {
+ return $this->createForm(ProjecttaskType::class, $entity, [
+ "mode" => "update",
+ "access" => $access,
+ "user" => $this->getUser()
+ ]);
+ }
+ else {
+ return $this->createForm(ProjecttaskType::class, $entity, [
+ "mode" => "submit",
+ "access" => $access,
+ "user" => $this->getUser()
+ ]);
+ }
+ }
+
+ public function submitAction(Request $request,$idproject,$access="config")
+ {
+ $em = $this->getDoctrine()->getManager();
+ $entity = new Projecttask();
+ $project=$em->getRepository("CadolesPortalBundle:Project")->find($idproject);
+ if($project) $entity->setProject($project);
+ $entity->setPriority(0);
+ $entity->setPercentage(0);
+
+ $form = $this->entityForm($entity,$access);
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+ if($entity->getPercentage()>100) $entity->setPercentage(100);
+ $entity->setOwner($this->getUser());
+ $entity->setSubmit(new \Datetime());
+
+ $em->persist($entity);
+ $em->flush();
+
+ foreach($entity->getProject()->getGroups() as $group) {
+ if($group->getFgcanshare()) {
+ $url=$this->generateUrl('cadoles_portal_'.$access.'_projecttask_view',["id"=>$entity->getId()]);
+ $message="Création tâche".$entity->getName()." ";
+ $usergroup=$em->getRepository("CadolesCoreBundle:Usergroup")->findOneBy(["group"=>$group,"user"=>$this->getUser()]);
+ if($usergroup) {
+ $key=$usergroup->getKeyvalue();
+ $websocket = $this->container->get('cadoles.websocket.pushmessage')->send($key,$this->getUser()->getId(),$group->getId(),$message);
+ }
+ }
+ }
+
+ return $this->redirect($this->generateUrl('cadoles_portal_'.$access.'_projecttask_view',["id"=>$entity->getId()]));
+ }
+
+ return $this->render($this->labelentity.':edit.html.twig', [
+ 'useheader' => ($access=="config"),
+ 'usemenu' => false,
+ 'usesidebar' => ($access=="config"),
+ 'maxwidth' => ($access=="user"),
+ 'entity' => $entity,
+ 'mode' => "submit",
+ 'access' => $access,
+ 'form' => $form->createView()
+ ]);
+ }
+
+ public function updateAction(Request $request, $id,$access="config")
+ {
+ $em = $this->getDoctrine()->getManager();
+ $entity = $em->getRepository($this->labelentity)->find($id);
+ if (!$entity) throw $this->createNotFoundException('Unable to find entity.');
+ $oldpercentage=$entity->getPercentage();
+
+ // On s'assure que l'utilisateur à la permission de modifier
+ if($access=="user") {
+ $user=$this->getUser();
+ $em->getRepository("CadolesPortalBundle:Project")->getPermission($user,$entity->getProject(),$cansee,$canupdate,$canadd);
+ if($user && ((is_null($entity->getUser()) && $user==$entity->getOwner()) || $user==$entity->getUser())) $canadd=true;
+ if(!$canadd) throw $this->createNotFoundException('Permission denied');
+ }
+
+ // Création du formulaire
+ $form = $this->entityForm($entity,$access);
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+ if($entity->getPercentage()>100) $entity->setPercentage(100);
+ $em = $this->getDoctrine()->getManager();
+ $em->persist($entity);
+ $em->flush();
+
+ foreach($entity->getProject()->getGroups() as $group) {
+ if($group->getFgcanshare()) {
+ $url=$this->generateUrl('cadoles_portal_'.$access.'_projecttask_view',["id"=>$entity->getId()]);
+ if($oldpercentage<100&$entity->getPercentage()==100)
+ $message="Tâche terminée".$entity->getName()." ";
+ elseif($oldpercentage==100&$entity->getPercentage()<100)
+ $message="Tâche réouverte".$entity->getName()." ";
+ else
+ $message="Modification tâche".$entity->getName()." ";
+ $usergroup=$em->getRepository("CadolesCoreBundle:Usergroup")->findOneBy(["group"=>$group,"user"=>$this->getUser()]);
+ if($usergroup) {
+ $key=$usergroup->getKeyvalue();
+ $websocket = $this->container->get('cadoles.websocket.pushmessage')->send($key,$this->getUser()->getId(),$group->getId(),$message);
+ }
+ }
+ }
+
+ return $this->redirect($this->generateUrl('cadoles_portal_'.$access.'_projecttask_view',["id"=>$entity->getId()]));
+ }
+
+
+ return $this->render($this->labelentity.':edit.html.twig', [
+ 'useheader' => ($access=="config"),
+ 'usemenu' => false,
+ 'usesidebar' => ($access=="config"),
+ 'maxwidth' => ($access=="user"),
+ 'entity' => $entity,
+ 'access' => $access,
+ 'mode' => "update",
+ 'form' => $form->createView(),
+ ]);
+ }
+
+ public function deleteAction(Request $request, $id,$access="config")
+ {
+ $em = $this->getDoctrine()->getManager();
+ $entity = $this->getDoctrine()->getRepository($this->labelentity)->find($id);
+ if (!$entity) throw $this->createNotFoundException('Unable to find entity.');
+
+ $idproject=$entity->getProject()->getId();
+
+ // On s'assure que l'utilisateur à la permission de supprimer
+ if($access=="user") {
+ $user=$this->getUser();
+ $em->getRepository("CadolesPortalBundle:Project")->getPermission($user,$entity->getProject(),$cansee,$canupdate,$canadd);
+ if($user && ((is_null($entity->getUser()) && $user==$entity->getOwner()) || $user==$entity->getUser())) $canadd=true;
+
+ if(!$canadd) throw $this->createNotFoundException('Permission denied');
+ }
+
+ // Suppression
+ $em->remove($entity);
+ $em->flush();
+
+ // Retour
+ return $this->redirect($this->generateUrl('cadoles_portal_'.$access.'_project_view',["id"=>$idproject]));
+ }
+
+ public function viewAction($id, Request $request, $access="config")
+ {
+ $em = $this->getDoctrine()->getManager();
+ $entity = $em->getRepository($this->labelentity)->find($id);
+ if (!$entity) throw $this->createNotFoundException('Unable to find entity.');
+
+ // Permissions
+ $user=$this->getUser();
+ if($access=="config") {
+ $canupdate = true;
+ $canadd=true;
+
+ $projects=$em->getRepository("CadolesPortalBundle:Project")->findBy(["id"=>$entity->getProject()->getId()]);
+ }
+ else {
+ // On récupère l'ensemble des projects de l'utilisateur
+ $em->getRepository("CadolesPortalBundle:Project")->getProjectsUser($user,$projectsuser,$projectsadmin,$projectsshared);
+ $projects=array_merge($projectsuser,$projectsadmin->toArray(),$projectsshared);
+
+ // permission
+ if($id==0) {
+ $cansee=true;
+ $canadd=true;
+ }
+ else {
+ $em->getRepository("CadolesPortalBundle:Project")->getPermission($user,$entity->getProject(),$cansee,$canupdate,$canadd);
+ }
+
+ if(!$cansee) throw $this->createNotFoundException('Permission denied');
+
+ $canupdate=false;
+ if($user) {
+ $canupdate=true;
+ if((is_null($entity->getUser()) && $user==$entity->getOwner()) || $user==$entity->getUser()) $canadd=true;
+ }
+ }
+
+ $em->getRepository("CadolesPortalBundle:Projecttask")->getProjectsTasks($projects,0,10,$count,$projecttasks);
+
+ return $this->render($this->labelentity.':view.html.twig', [
+ 'useheader' => ($access=="config"),
+ 'usemenu' => false,
+ 'usesidebar' => ($access=="config"),
+ 'maxwidth' => ($access=="user"),
+ 'entity' => $entity,
+ 'access' => $access,
+ 'canupdate' => $canupdate,
+ 'canadd' => $canadd,
+ 'projects' => $projects,
+ 'projecttasks' => $projecttasks
+ ]);
+
+ }
+
+ public function uploadAction(Request $request,$access=null) {
+ // Fichier temporaire uploadé
+ $tmpfile = $request->files->get('upload');
+ $extention = $tmpfile->getClientOriginalExtension();
+
+ // Répertoire de Destination
+ $fs = new Filesystem();
+ $rootdir = $this->get('kernel')->getRootDir()."/../web";
+ $fs->mkdir($rootdir."/uploads/ckeditor");
+
+ // Fichier cible
+ $targetName = uniqid().".".$extention;
+ $targetFile = $rootdir."/uploads/ckeditor/".$targetName;
+ $targetUrl = "/".$this->getParameter('alias')."/uploads/ckeditor/".$targetName;
+ $message = "";
+
+ move_uploaded_file($tmpfile,$targetFile);
+
+ $output["uploaded"]=1;
+ $output["fileName"]=$targetName;
+ $output["url"]=$targetUrl;
+
+ return new Response(json_encode($output));
+
+ }
+
+ public function usersAction(Request $request, $access="config") {
+ // S'assurer que c'est un appel ajax
+ if (!$request->isXmlHttpRequest()) {
+ return new JsonResponse(array('message' => 'Interdit'), 400);
+ }
+
+ $output=array();
+ $em = $this->getDoctrine()->getManager();
+ $page_limit=$request->query->get('page_limit');
+ $q=$request->query->get('q');
+ $projectid=$request->query->get('project');
+
+ $project=$em->getRepository("CadolesPortalBundle:Project")->find($projectid);
+ if($project) {
+ $user=$this->getUser();
+ $em->getRepository("CadolesPortalBundle:Project")->getPermission($user,$project,$cansee,$canupdate,$canadd);
+
+ // Si permission alors il peut affecter tt les personnes du groupe
+ if($canadd||$access=="config") {
+ $qb= $em->createQueryBuilder()
+ ->select('user')
+
+ ->from('CadolesPortalBundle:Project','project')
+ ->andwhere('project.id=:project')
+
+ ->from('CadolesCoreBundle:UserGroup','usergroup')
+ ->andwhere("usergroup.group MEMBER OF project.groups")
+
+ ->from('CadolesCoreBundle:User','user')
+ ->andwhere("usergroup.user=user")
+
+ ->setParameter('project',$projectid);
+
+ $datas=$qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult();
+ foreach($datas as $data) {
+ array_push($output,array("id"=>$data->getId(),"text"=>$data->getUsername()));
+ }
+ }
+ // Sinon il ne peut que s'affecter lui
+ else {
+ array_push($output,array("id"=>$user->getId(),"text"=>$user->getUsername()));
+ }
+ }
+
+ $response = new Response(json_encode($output));
+ $response->headers->set('Content-Type', 'application/json');
+ return $response;
+ }
+
+ public function percentageAction($id,Request $request, $access="config") {
+ // S'assurer que c'est un appel ajax
+ if (!$request->isXmlHttpRequest()) {
+ return new JsonResponse(array('message' => 'Interdit'), 400);
+ }
+
+ $output=array();
+ $em = $this->getDoctrine()->getManager();
+ $percentage=$request->get('percentage');
+ $entity = $this->getDoctrine()->getRepository($this->labelentity)->find($id);
+ if (!$entity) throw $this->createNotFoundException('Unable to find entity.');
+
+ $idproject=$entity->getProject()->getId();
+ $oldpercentage=$entity->getPercentage();
+
+ // On s'assure que l'utilisateur à la permission de supprimer
+ if($access=="user") {
+ $user=$this->getUser();
+ $em->getRepository("CadolesPortalBundle:Project")->getPermission($user,$entity->getProject(),$cansee,$canupdate,$canadd);
+ if($user && ((is_null($entity->getUser()) && $user==$entity->getOwner()) || $user==$entity->getUser())) $canadd=true;
+
+ if(!$canadd) throw $this->createNotFoundException('Permission denied');
+ }
+
+
+ $entity->setPercentage($percentage);
+ $em->persist($entity);
+ $em->flush();
+
+ foreach($entity->getProject()->getGroups() as $group) {
+ if($group->getFgcanshare()) {
+ $url=$this->generateUrl('cadoles_portal_'.$access.'_projecttask_view',["id"=>$entity->getId()]);
+ $message="";
+ if($oldpercentage<100&$entity->getPercentage()==100)
+ $message="Tâche terminée".$entity->getName()." ";
+ elseif($oldpercentage==100&$entity->getPercentage()<100)
+ $message="Tâche réouverte".$entity->getName()." ";
+
+ if($message!="") {
+ $usergroup=$em->getRepository("CadolesCoreBundle:Usergroup")->findOneBy(["group"=>$group,"user"=>$this->getUser()]);
+ if($usergroup) {
+ $key=$usergroup->getKeyvalue();
+ $websocket = $this->container->get('cadoles.websocket.pushmessage')->send($key,$this->getUser()->getId(),$group->getId(),$message);
+ }
+ }
+ }
+ }
+
+ $response = new Response(json_encode($output));
+ $response->headers->set('Content-Type', 'application/json');
+ return $response;
+ }
+
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Project.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Project.php
new file mode 100644
index 00000000..888261cd
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Project.php
@@ -0,0 +1,292 @@
+canupdate;
+ }
+ public function setCanupdate($canupdate)
+ {
+ $this->canupdate = $canupdate;
+ return $this;
+ }
+
+ /* champs calculé non stocké en base */
+ private $canadd;
+ public function getCanadd()
+ {
+ return $this->canadd;
+ }
+ public function setCanadd($canadd)
+ {
+ $this->canadd = $canadd;
+ return $this;
+ }
+
+ /**
+ * Constructor
+ */
+ public function __construct()
+ {
+ $this->groups = new \Doctrine\Common\Collections\ArrayCollection();
+ $this->writers = new \Doctrine\Common\Collections\ArrayCollection();
+ $this->projecttasks = new \Doctrine\Common\Collections\ArrayCollection();
+ }
+
+ /**
+ * Get id
+ *
+ * @return integer
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * Set name
+ *
+ * @param string $name
+ *
+ * @return Project
+ */
+ public function setName($name)
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
+ /**
+ * Get name
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Set roles
+ *
+ * @param array $roles
+ *
+ * @return Project
+ */
+ public function setRoles($roles)
+ {
+ $this->roles = $roles;
+
+ return $this;
+ }
+
+ /**
+ * Get roles
+ *
+ * @return array
+ */
+ public function getRoles()
+ {
+ return $this->roles;
+ }
+
+ /**
+ * Add group
+ *
+ * @param \Cadoles\CoreBundle\Entity\Group $group
+ *
+ * @return Project
+ */
+ public function addGroup(\Cadoles\CoreBundle\Entity\Group $group)
+ {
+ $this->groups[] = $group;
+
+ return $this;
+ }
+
+ /**
+ * Remove group
+ *
+ * @param \Cadoles\CoreBundle\Entity\Group $group
+ */
+ public function removeGroup(\Cadoles\CoreBundle\Entity\Group $group)
+ {
+ $this->groups->removeElement($group);
+ }
+
+ /**
+ * Get groups
+ *
+ * @return \Doctrine\Common\Collections\Collection
+ */
+ public function getGroups()
+ {
+ return $this->groups;
+ }
+
+ /**
+ * Set user
+ *
+ * @param \Cadoles\CoreBundle\Entity\User $user
+ *
+ * @return Project
+ */
+ public function setUser(\Cadoles\CoreBundle\Entity\User $user = null)
+ {
+ $this->user = $user;
+
+ return $this;
+ }
+
+ /**
+ * Get user
+ *
+ * @return \Cadoles\CoreBundle\Entity\User
+ */
+ public function getUser()
+ {
+ return $this->user;
+ }
+
+ /**
+ * Add writer
+ *
+ * @param \Cadoles\CoreBundle\Entity\User $writer
+ *
+ * @return Project
+ */
+ public function addWriter(\Cadoles\CoreBundle\Entity\User $writer)
+ {
+ $this->writers[] = $writer;
+
+ return $this;
+ }
+
+ /**
+ * Remove writer
+ *
+ * @param \Cadoles\CoreBundle\Entity\User $writer
+ */
+ public function removeWriter(\Cadoles\CoreBundle\Entity\User $writer)
+ {
+ $this->writers->removeElement($writer);
+ }
+
+ /**
+ * Get writers
+ *
+ * @return \Doctrine\Common\Collections\Collection
+ */
+ public function getWriters()
+ {
+ return $this->writers;
+ }
+
+ /**
+ * Add projecttask
+ *
+ * @param \Cadoles\PortalBundle\Entity\Projecttask $projecttask
+ *
+ * @return Project
+ */
+ public function addProjecttask(\Cadoles\PortalBundle\Entity\Projecttask $projecttask)
+ {
+ $this->projecttasks[] = $projecttask;
+
+ return $this;
+ }
+
+ /**
+ * Remove projecttask
+ *
+ * @param \Cadoles\PortalBundle\Entity\Projecttask $projecttask
+ */
+ public function removeProjecttask(\Cadoles\PortalBundle\Entity\Projecttask $projecttask)
+ {
+ $this->projecttasks->removeElement($projecttask);
+ }
+
+ /**
+ * Get projecttasks
+ *
+ * @return \Doctrine\Common\Collections\Collection
+ */
+ public function getProjecttasks()
+ {
+ return $this->projecttasks;
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Projecttask.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Projecttask.php
new file mode 100644
index 00000000..22c25834
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Projecttask.php
@@ -0,0 +1,366 @@
+id;
+ }
+
+ /**
+ * Set name
+ *
+ * @param string $name
+ *
+ * @return Projecttask
+ */
+ public function setName($name)
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
+ /**
+ * Get name
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Set description
+ *
+ * @param string $description
+ *
+ * @return Projecttask
+ */
+ public function setDescription($description)
+ {
+ $this->description = $description;
+
+ return $this;
+ }
+
+ /**
+ * Get description
+ *
+ * @return string
+ */
+ public function getDescription()
+ {
+ return $this->description;
+ }
+
+ /**
+ * Set submit
+ *
+ * @param \DateTime $submit
+ *
+ * @return Projecttask
+ */
+ public function setSubmit($submit)
+ {
+ $this->submit = $submit;
+
+ return $this;
+ }
+
+ /**
+ * Get submit
+ *
+ * @return \DateTime
+ */
+ public function getSubmit()
+ {
+ return $this->submit;
+ }
+
+ /**
+ * Set user
+ *
+ * @param \Cadoles\CoreBundle\Entity\User $user
+ *
+ * @return Projecttask
+ */
+ public function setUser(\Cadoles\CoreBundle\Entity\User $user = null)
+ {
+ $this->user = $user;
+
+ return $this;
+ }
+
+ /**
+ * Get user
+ *
+ * @return \Cadoles\CoreBundle\Entity\User
+ */
+ public function getUser()
+ {
+ return $this->user;
+ }
+
+ /**
+ * Set project
+ *
+ * @param \Cadoles\PortalBundle\Entity\Project $project
+ *
+ * @return Projecttask
+ */
+ public function setProject(\Cadoles\PortalBundle\Entity\Project $project)
+ {
+ $this->project = $project;
+
+ return $this;
+ }
+
+ /**
+ * Get project
+ *
+ * @return \Cadoles\PortalBundle\Entity\Project
+ */
+ public function getProject()
+ {
+ return $this->project;
+ }
+
+ /**
+ * Set owner
+ *
+ * @param \Cadoles\CoreBundle\Entity\User $owner
+ *
+ * @return Projecttask
+ */
+ public function setOwner(\Cadoles\CoreBundle\Entity\User $owner)
+ {
+ $this->owner = $owner;
+
+ return $this;
+ }
+
+ /**
+ * Get owner
+ *
+ * @return \Cadoles\CoreBundle\Entity\User
+ */
+ public function getOwner()
+ {
+ return $this->owner;
+ }
+
+
+ /**
+ * Set projecttasktag
+ *
+ * @param \Cadoles\PortalBundle\Entity\Projecttasktag $projecttasktag
+ *
+ * @return Projecttask
+ */
+ public function setProjecttasktag(\Cadoles\PortalBundle\Entity\Projecttasktag $projecttasktag = null)
+ {
+ $this->projecttasktag = $projecttasktag;
+
+ return $this;
+ }
+
+ /**
+ * Get projecttasktag
+ *
+ * @return \Cadoles\PortalBundle\Entity\Projecttasktag
+ */
+ public function getProjecttasktag()
+ {
+ return $this->projecttasktag;
+ }
+
+ /**
+ * Set projecttaskstatus
+ *
+ * @param \Cadoles\PortalBundle\Entity\Projecttaskstatus $projecttaskstatus
+ *
+ * @return Projecttask
+ */
+ public function setProjecttaskstatus(\Cadoles\PortalBundle\Entity\Projecttaskstatus $projecttaskstatus = null)
+ {
+ $this->projecttaskstatus = $projecttaskstatus;
+
+ return $this;
+ }
+
+ /**
+ * Get projecttaskstatus
+ *
+ * @return \Cadoles\PortalBundle\Entity\Projecttaskstatus
+ */
+ public function getProjecttaskstatus()
+ {
+ return $this->projecttaskstatus;
+ }
+
+ /**
+ * Set priority
+ *
+ * @param integer $priority
+ *
+ * @return Projecttask
+ */
+ public function setPriority($priority)
+ {
+ $this->priority = $priority;
+
+ return $this;
+ }
+
+ /**
+ * Get priority
+ *
+ * @return integer
+ */
+ public function getPriority()
+ {
+ return $this->priority;
+ }
+
+ /**
+ * Set end
+ *
+ * @param \DateTime $end
+ *
+ * @return Projecttask
+ */
+ public function setEnd($end)
+ {
+ $this->end = $end;
+
+ return $this;
+ }
+
+ /**
+ * Get end
+ *
+ * @return \DateTime
+ */
+ public function getEnd()
+ {
+ return $this->end;
+ }
+
+ /**
+ * Set percentage
+ *
+ * @param integer $percentage
+ *
+ * @return Projecttask
+ */
+ public function setPercentage($percentage)
+ {
+ $this->percentage = $percentage;
+
+ return $this;
+ }
+
+ /**
+ * Get percentage
+ *
+ * @return integer
+ */
+ public function getPercentage()
+ {
+ return $this->percentage;
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Projecttaskstatus.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Projecttaskstatus.php
new file mode 100644
index 00000000..6de4005f
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Projecttaskstatus.php
@@ -0,0 +1,119 @@
+id = $id;
+ return $this;
+ }
+
+
+ /**
+ * Constructor
+ */
+ public function __construct()
+ {
+ $this->projecttasks = new \Doctrine\Common\Collections\ArrayCollection();
+ }
+
+ /**
+ * Get id
+ *
+ * @return integer
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * Set name
+ *
+ * @param string $name
+ *
+ * @return Projecttaskstatus
+ */
+ public function setName($name)
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
+ /**
+ * Get name
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Add projecttask
+ *
+ * @param \Cadoles\PortalBundle\Entity\Projecttask $projecttask
+ *
+ * @return Projecttaskstatus
+ */
+ public function addProjecttask(\Cadoles\PortalBundle\Entity\Projecttask $projecttask)
+ {
+ $this->projecttasks[] = $projecttask;
+
+ return $this;
+ }
+
+ /**
+ * Remove projecttask
+ *
+ * @param \Cadoles\PortalBundle\Entity\Projecttask $projecttask
+ */
+ public function removeProjecttask(\Cadoles\PortalBundle\Entity\Projecttask $projecttask)
+ {
+ $this->projecttasks->removeElement($projecttask);
+ }
+
+ /**
+ * Get projecttasks
+ *
+ * @return \Doctrine\Common\Collections\Collection
+ */
+ public function getProjecttasks()
+ {
+ return $this->projecttasks;
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Projecttasktag.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Projecttasktag.php
new file mode 100644
index 00000000..b6fe2ebd
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Entity/Projecttasktag.php
@@ -0,0 +1,148 @@
+id = $id;
+ return $this;
+ }
+
+
+ /**
+ * Constructor
+ */
+ public function __construct()
+ {
+ $this->projecttasks = new \Doctrine\Common\Collections\ArrayCollection();
+ }
+
+ /**
+ * Get id
+ *
+ * @return integer
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * Set name
+ *
+ * @param string $name
+ *
+ * @return Projecttasktag
+ */
+ public function setName($name)
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
+ /**
+ * Get name
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Set color
+ *
+ * @param string $color
+ *
+ * @return Projecttasktag
+ */
+ public function setColor($color)
+ {
+ $this->color = $color;
+
+ return $this;
+ }
+
+ /**
+ * Get color
+ *
+ * @return string
+ */
+ public function getColor()
+ {
+ return $this->color;
+ }
+
+ /**
+ * Add projecttask
+ *
+ * @param \Cadoles\PortalBundle\Entity\Projecttask $projecttask
+ *
+ * @return Projecttasktag
+ */
+ public function addProjecttask(\Cadoles\PortalBundle\Entity\Projecttask $projecttask)
+ {
+ $this->projecttasks[] = $projecttask;
+
+ return $this;
+ }
+
+ /**
+ * Remove projecttask
+ *
+ * @param \Cadoles\PortalBundle\Entity\Projecttask $projecttask
+ */
+ public function removeProjecttask(\Cadoles\PortalBundle\Entity\Projecttask $projecttask)
+ {
+ $this->projecttasks->removeElement($projecttask);
+ }
+
+ /**
+ * Get projecttasks
+ *
+ * @return \Doctrine\Common\Collections\Collection
+ */
+ public function getProjecttasks()
+ {
+ return $this->projecttasks;
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjectShareType.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjectShareType.php
new file mode 100644
index 00000000..c9a29b9d
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjectShareType.php
@@ -0,0 +1,60 @@
+add('submit', SubmitType::class, [
+ "label" => ($options["mode"]=="delete"?"Confirmer la Suppression":"Valider"),
+ "attr" => ($options["mode"]=="delete"?array("class" => "btn btn-danger"):array("class" => "btn btn-success"))
+ ])
+
+ ->add('groups', EntityType::class, [
+ 'label' => 'Partager avec les Groupes',
+ 'class' => 'CadolesCoreBundle:Group',
+ 'query_builder' => function(EntityRepository $er) use ($user) {
+ return $er->createQueryBuilder('g')
+ ->select('g')
+ ->From('CadolesCoreBundle:UserGroup','ug')
+ ->where('g.fgcanshare=:fgcanshare')
+ ->andWhere('g=ug.group')
+ ->andWhere('ug.user=:user')
+ ->andWhere('ug.fgmanager=:fgcanshare')
+ ->setParameter('fgcanshare',true)
+ ->setParameter('user',$user);
+ },
+ 'choice_label' => 'label',
+ 'multiple' => true,
+ 'expanded' => true
+ ]);
+
+ ;
+
+ }
+
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults([
+ 'data_class' => 'Cadoles\PortalBundle\Entity\Project',
+ 'mode' => 'string',
+ 'access' => 'string',
+ 'user' => 'Cadoles\CoreBundle\Entity\User'
+ ]);
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjectType.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjectType.php
new file mode 100644
index 00000000..023c4b4b
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjectType.php
@@ -0,0 +1,94 @@
+add('submit', SubmitType::class, [
+ "label" => ($options["mode"]=="delete"?"Confirmer la Suppression":"Valider"),
+ "attr" => ($options["mode"]=="delete"?array("class" => "btn btn-danger"):array("class" => "btn btn-success"))
+ ])
+
+ ->add('name', TextType::class, [
+ 'label' => 'Nom'
+ ]);
+
+ if($options["access"]=="config") {
+ $builder
+ ->add('roles', ChoiceType::class, [
+ "label" => 'Visible pour les Rôles',
+ "choices" => [
+ "Visiteur" => 'ROLE_ANONYME',
+ "Utilisateur" => 'ROLE_USER',
+ "Animateur de Groupe" => 'ROLE_ANIM',
+ "Modérateur" => 'ROLE_MODO',
+ "Administateur" => 'ROLE_ADMIN',
+ ],
+ "multiple" => true,
+ "expanded" => true,
+ "disabled" => ($options["mode"]=="delete"?true:false),
+ ])
+
+ ->add('groups', Select2EntityType::class, [
+ 'label' => 'Visible pour les Groupes',
+ 'class' => 'CadolesCoreBundle:Group',
+ 'text_property' => 'label',
+ 'multiple' => true,
+ 'remote_route' => 'cadoles_core_ajax_group_list',
+ 'primary_key' => 'id',
+ 'text_property' => 'label',
+ 'minimum_input_length' => 0,
+ 'page_limit' => 100,
+ 'allow_clear' => true,
+ 'delay' => 250,
+ 'cache' => false,
+ 'cache_timeout' => 60000,
+ 'language' => 'fr',
+ 'placeholder' => 'Selectionner un groupe',
+ ])
+
+ ->add('user', Select2EntityType::class, [
+ 'label' => "Propriétaire",
+ 'disabled' => ($options["mode"]=="delete"?true:false),
+ "required" => false,
+ 'multiple' => false,
+ 'remote_route' => 'cadoles_core_config_user_ajax_selectlist',
+ 'class' => 'Cadoles\coreBundle\Entity\User',
+ 'primary_key' => 'id',
+ 'text_property' => 'username',
+ 'minimum_input_length' => 2,
+ 'page_limit' => 10,
+ 'allow_clear' => true,
+ 'delay' => 250,
+ 'cache' => false,
+ 'cache_timeout' => 60000, // if 'cache' is true
+ 'language' => 'fr',
+ 'placeholder' => 'Selectionner un propriétaire',
+ 'attr' => array("class" => "form-control", "style" => "margin-bottom:15px")
+ ]);
+ }
+ }
+
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults([
+ 'data_class' => 'Cadoles\PortalBundle\Entity\Project',
+ 'mode' => 'string',
+ 'access' => 'string'
+ ]);
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjectWriterType.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjectWriterType.php
new file mode 100644
index 00000000..84fb0a6d
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjectWriterType.php
@@ -0,0 +1,64 @@
+add('submit', SubmitType::class, [
+ "label" => ($options["mode"]=="delete"?"Confirmer la Suppression":"Valider"),
+ "attr" => ($options["mode"]=="delete"?array("class" => "btn btn-danger"):array("class" => "btn btn-success"))
+ ])
+
+ ->add('writers', EntityType::class, [
+ 'label' => 'Donner permissions en écritures à',
+ 'class' => 'CadolesCoreBundle:User',
+ 'query_builder' => function(EntityRepository $er) use ($id,$access) {
+ $qb= $er->createQueryBuilder('user');
+ return $qb->select('user')
+
+ ->from('CadolesPortalBundle:Project','project')
+ ->andwhere('project.id=:project')
+
+ ->from('CadolesCoreBundle:UserGroup','usergroup')
+ ->andwhere("usergroup.group MEMBER OF project.groups")
+ ->andwhere("usergroup.user=user")
+
+ ->setParameter('project',$id);
+ },
+ 'choice_label' => 'username',
+ 'multiple' => true,
+ 'expanded' => true
+ ]);
+
+ ;
+
+ }
+
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults([
+ 'data_class' => 'Cadoles\PortalBundle\Entity\Project',
+ 'id' => 'integer',
+ 'mode' => 'string',
+ 'access' => 'string',
+ 'user' => 'Cadoles\CoreBundle\Entity\User'
+ ]);
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjecttaskType.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjecttaskType.php
new file mode 100644
index 00000000..3c8b0737
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Form/ProjecttaskType.php
@@ -0,0 +1,138 @@
+add('submit', SubmitType::class, [
+ "label" => ($options["mode"]=="delete"?"Confirmer la Suppression":"Valider"),
+ "attr" => ($options["mode"]=="delete"?array("class" => "btn btn-danger"):array("class" => "btn btn-success"))
+ ])
+
+ ->add('name', TextType::class, [
+ 'label' => 'Titre'
+ ])
+
+ ->add("description",CKEditorType::class,[
+ "config_name" => 'full_config',
+ "label" => 'Description',
+ "required" => false,
+ "config" => ["height" => "500px",'filebrowserUploadRoute' => 'cadoles_portal_'.$options["access"].'_projecttask_upload']
+ ])
+
+ ->add('priority', IntegerType::class, [
+ "label" => 'Priorité',
+ "required" => true,
+ ])
+
+ ->add('end', DateType::class, [
+ "label" => 'A Réaliser avant le',
+ "required" => false,
+ ])
+
+ ->add('percentage', IntegerType::class, [
+ "label" => "Pourcentage d'avancement",
+ "required" => true,
+ ])
+
+ ->add('projecttasktag', EntityType::class, [
+ "label" => 'Type',
+ "class" => 'CadolesPortalBundle:Projecttasktag',
+ "choice_label" => 'name',
+ "required" => false,
+ ])
+
+ ->add('projecttaskstatus', EntityType::class, [
+ "label" => 'Statut',
+ "class" => 'CadolesPortalBundle:Projecttaskstatus',
+ "choice_label" => 'name',
+ "required" => false,
+ ]);
+
+ if($options["access"]=="config") {
+ $builder
+ ->add('project', EntityType::class, [
+ "label" => 'Projet associé',
+ "class" => 'CadolesPortalBundle:Project',
+ "choice_label" => 'name',
+ ]);
+ }
+ else {
+ $builder
+ ->add('project', EntityType::class, [
+ 'label' => 'Projet associé',
+ 'class' => 'CadolesPortalBundle:Project',
+ 'choice_label' => 'name',
+ "disabled" => ($options["mode"]=="update"?true:false),
+ 'placeholder' => '-- Sélectionnez un Projet --',
+ 'query_builder' => function(EntityRepository $er) use ($user) {
+ $qb=$er->createQueryBuilder('project');
+ return $qb->select('project')
+ ->where('project.user=:user')
+ ->orwhere(':user MEMBER OF project.writers')
+
+ ->from('CadolesCoreBundle:UserGroup','usergroup')
+ ->orwhere('usergroup.group MEMBER OF project.groups AND usergroup.user=:user')
+
+ ->from('CadolesCoreBundle:User','user')
+ ->andwhere("user=:user")
+
+ ->setparameter('user',$user);
+ },
+ ]);
+ }
+
+ $builder->add('user',
+ Select2EntityType::class, array(
+ 'label' => "Intervenant",
+ "required" => false,
+ 'multiple' => false,
+ 'remote_route' => 'cadoles_portal_'.$options["access"].'_projecttask_users',
+ 'class' => 'Cadoles\coreBundle\Entity\User',
+ 'req_params' => ['project' => 'parent.children[project]'],
+ 'primary_key' => 'id',
+ 'text_property' => 'username',
+ 'minimum_input_length' => 0,
+ 'page_limit' => 10,
+ 'allow_clear' => true,
+ 'delay' => 250,
+ 'cache' => false,
+ 'cache_timeout' => 60000, // if 'cache' is true
+ 'language' => 'fr',
+ 'placeholder' => 'Selectionner un intervenant',
+ 'attr' => array("class" => "form-control", "style" => "margin-bottom:15px")
+ )
+ );
+ }
+
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults([
+ 'data_class' => 'Cadoles\PortalBundle\Entity\Projecttask',
+ 'mode' => 'string',
+ 'access' => 'string',
+ 'user' => 'Cadoles\CoreBundle\Entity\User'
+ ]);
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/ProjectRepository.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/ProjectRepository.php
new file mode 100644
index 00000000..c7ddc3ee
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/ProjectRepository.php
@@ -0,0 +1,260 @@
+createQueryBuilder('project')
+ ->from('CadolesCoreBundle:Group','g')
+ ->andWhere('g MEMBER OF project.groups')
+ ->andWhere('g.id=:id')
+ ->setParameter('id',$groupid)
+ ->addOrderBy('project.name', 'ASC')
+ ->getQuery()->getResult();
+
+
+ // Permission sur les projects
+ if($projectsshared) {
+ foreach($projectsshared as $projectshared) {
+ $projectshared->setCanupdate(false);
+ $projectshared->setCanadd($this->getInwriter($user,$projectshared));
+ }
+ }
+
+ return $projectsshared;
+ }
+
+ // getProjectsUser
+ // $user = l'utilisateur en cours
+ // &$projectsuser = les projects de l'utilisateur
+ // &$projects = les projects système de l'utilistauer
+ // &$projectsshared = les projects partagées pour l'utilisateur
+
+ public function getProjectsUser($user,&$projectsuser,&$projectsadmin,&$projectsshared)
+ {
+ // Profilage
+ $roles=($user?$user->getRoles():["ROLE_ANONYME"]);
+ $groups=($user?$user->getGroups():[]);
+
+ // Récupération des projects de l'utilisateur
+ $projectsuser=[];
+ if($user) {
+ $qb = $this->createQueryBuilder('project');
+ $qb ->where("project.user=:user")
+ ->setParameter("user",$user)
+ ->addOrderBy('project.name', 'ASC');
+ $projectsuser=$qb->getQuery()->getResult();
+ }
+
+ // Permission sur les projects
+ if($projectsuser) {
+ foreach($projectsuser as $projectuser) {
+ $projectuser->setCanupdate(true);
+ $projectuser->setCanadd(true);
+ }
+ }
+
+ // projects partagées
+ $projectsshared=[];
+ /*
+ if($user) {
+ $projectsshared=$this->createQueryBuilder('project')
+ ->from('CadolesCoreBundle:Group','g')
+ ->from('CadolesCoreBundle:UserGroup','ug')
+ ->from('CadolesCoreBundle:UserGroup','proprio')
+ ->where('g.fgcanshare=:fgcanshare')
+ ->andWhere('g=ug.group')
+ ->andWhere('ug.user=:user')
+ ->andWhere('g MEMBER OF project.groups')
+ ->andWhere('project.user != :user')
+ ->andWhere('project.user is not null')
+ ->andWhere('proprio.user=project.user')
+ ->andWhere('proprio.group=g')
+ ->setParameter('fgcanshare',true)
+ ->setParameter('user',$user)
+ ->addOrderBy('project.name', 'ASC')
+ ->getQuery()->getResult();
+ }
+
+ // Permission sur les projects
+ if($projectsshared) {
+ foreach($projectsshared as $projectshared) {
+ $projectshared->setCanupdate(false);
+ $projectshared->setCanadd($this->getInwriter($user,$projectshared));
+ }
+ }
+ */
+
+ // Initialisation du calcul des projects
+ $projectsadmin=new ArrayCollection();
+
+ // Récupération des projects par rôles
+ foreach($roles as $role) {
+ $qb = $this->createQueryBuilder("project");
+ $qb ->where($qb->expr()->like('project.roles', $qb->expr()->literal("%$role%")))
+ ->andWhere("project.user != :user or project.user is null")
+ ->setParameter('user',$user);
+
+ $projectsroles=$qb->getQuery()->getResult();
+ foreach($projectsroles as $projectrole) {
+ if(!$projectsadmin->contains($projectrole)) $projectsadmin->add($projectrole);
+ }
+ }
+
+ // Récupération des projects par group
+ foreach($groups as $group) {
+ $qb = $this->createQueryBuilder("project");
+ $qb ->where(":group MEMBER OF project.groups")
+ ->andWhere("project.user != :user or project.user is null")
+ ->setParameter('user',$user)
+ ->setParameter("group",$group->getGroup());
+
+ $projectsgroups=$qb->getQuery()->getResult();
+ foreach($projectsgroups as $projectgroup) {
+ if(!$projectsadmin->contains($projectgroup)) $projectsadmin->add($projectgroup);
+ }
+ }
+
+ // Permission sur les projects
+ foreach($projectsadmin as $projectadmin) {
+ $projectadmin->setCanupdate(false);
+ $projectadmin->setCanadd($this->getInwriter($user,$projectadmin));
+ }
+ }
+
+ public function getPermission($user,$project,&$cansee,&$canupdate,&$canadd) {
+ // si project de l'utilisateur
+ if($project->getUser()==$user&&!is_null($user)) {
+ $cansee=true;
+ $canupdate=true;
+ $canadd=true;
+ }
+ else {
+ $canupdate=false;
+ $cansee=false;
+ $canadd=false;
+
+ // Profilage
+ $roles=($user?$user->getRoles():["ROLE_ANONYME"]);
+ $groups=($user?$user->getGroups():[]);
+
+ // Le project est-il dans les projects associés à un partage de group ?
+ /*
+ $inprojectsshared=$this->createQueryBuilder('project')
+ ->from('CadolesCoreBundle:Group','g')
+ ->from('CadolesCoreBundle:UserGroup','ug')
+ ->from('CadolesCoreBundle:UserGroup','proprio')
+ ->where('g.fgcanshare=:fgcanshare')
+ ->andWhere('project.id = :id')
+ ->andWhere('g=ug.group')
+ ->andWhere('ug.user=:user')
+ ->andWhere('g MEMBER OF project.groups')
+ ->andWhere('project.user != :user')
+ ->andWhere('project.user is not null')
+ ->andWhere('proprio.user=project.user')
+ ->andWhere('proprio.group=g')
+ ->setParameter("id",$project->getId())
+ ->setParameter('fgcanshare',true)
+ ->setParameter('user',$user)
+ ->getQuery()->getResult();
+ if($inprojectsshared) $cansee=true;
+ */
+
+ // Le project est-il dans les projects associés au role de l'utilisateur ?
+ foreach($roles as $role) {
+ $qb = $this->createQueryBuilder("project");
+ $qb ->where($qb->expr()->like('project.roles', $qb->expr()->literal("%$role%")))
+ ->andWhere("project.id=:id")
+ ->andWhere("project.user is null")
+ ->setParameter("id",$project->getId());
+ $inprojectrole=$qb->getQuery()->getResult();
+ if($inprojectrole) $cansee=true;
+ }
+
+
+ // Le project est-il dans les projects associés aux groupes de l'utilisateur ?
+ foreach($groups as $group) {
+ $qb = $this->createQueryBuilder("project");
+ $qb ->where(":group MEMBER OF project.groups")
+ ->andWhere("project.id=:id")
+ ->setParameter("id",$project->getId())
+ ->setParameter("group",$group->getGroup());
+
+ $inprojectgroup=$qb->getQuery()->getResult();
+ if($inprojectgroup) {
+ $cansee=true;
+
+ // Est-il manager du groupe
+ if($group->getGroup()->getFgcanshare()) {
+ if($group->getFgmanager()) $canadd=true;
+ }
+ }
+ }
+
+ // utilisateur a-t-il la permission d'écriture
+ $canadd=$this->getInwriter($user,$project);
+
+ }
+ }
+
+ public function getInwriter($user,$project) {
+ $canadd=false;
+
+ if($user) {
+ // Peut ecrire ceux qui sont déclaré comme écrivain
+ $qb = $this->createQueryBuilder("project");
+ $qb ->andWhere("project.id=:id")
+ ->andwhere(':user MEMBER OF project.writers')
+
+ ->from('CadolesCoreBundle:User','user')
+ ->andwhere("user=:user")
+
+ ->from('CadolesCoreBundle:UserGroup','usergroup')
+ ->andwhere('usergroup.group MEMBER OF project.groups')
+ ->andwhere('usergroup.user=:user')
+
+ ->setParameter("id",$project->getId())
+ ->setparameter('user',$user);
+
+ $inprojectwriters=$qb->getQuery()->getResult();
+ if($inprojectwriters) $canadd=true;
+
+ // Peut ecrire ceux qui sont manager du groupe auquel est rattaché le project
+ $qb = $this->createQueryBuilder("project");
+ $qb ->andWhere("project.id=:id")
+ ->from('CadolesCoreBundle:User','user')
+ ->andwhere("user=:user")
+
+ ->from('CadolesCoreBundle:UserGroup','usergroup')
+ ->andwhere('usergroup.group MEMBER OF project.groups')
+ ->andwhere('usergroup.user=:user')
+ ->andwhere('usergroup.fgmanager=:flag')
+
+ ->from('CadolesCoreBundle:Group','groupe')
+ ->andwhere('groupe=usergroup.group')
+ ->andwhere('groupe.fgcanshare=:flag')
+
+ ->setParameter("id",$project->getId())
+ ->setparameter('user',$user)
+ ->setparameter('flag',true);
+
+
+ $inprojectwriters=$qb->getQuery()->getResult();
+ if($inprojectwriters) $canadd=true;
+ }
+
+ return $canadd;
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/ProjecttaskRepository.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/ProjecttaskRepository.php
new file mode 100644
index 00000000..e843c8b2
--- /dev/null
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/ProjecttaskRepository.php
@@ -0,0 +1,28 @@
+createQueryBuilder('projecttask')
+ ->select('COUNT(projecttask)')
+ ->andwhere('projecttask.project IN(:project)')
+ ->setParameter('project',$projects)
+ ->getQuery()->getSingleScalarResult();
+
+ $articles=$this->createQueryBuilder('projecttask')
+ ->andwhere('projecttask.project IN(:project)')
+ ->setParameter('project',$projects)
+ ->orderBy('projecttask.submit', 'DESC')
+ ->addOrderBy('projecttask.name', 'ASC')
+ ->setFirstResult($start)->setMaxResults($length)
+ ->getQuery()->getResult();
+ }
+}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/config/routing.yml b/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/config/routing.yml
index 7d1605f3..43d253ec 100644
--- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/config/routing.yml
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/config/routing.yml
@@ -550,6 +550,7 @@ cadoles_portal_user_blogarticle_image:
path: /user/blogarticle/image
defaults: { _controller: CadolesPortalBundle:Blogarticle:image, access: user }
+
#== BLOGCOMMENT ==========================================================================================================================================
#-- Access config
@@ -692,6 +693,129 @@ cadoles_portal_user_calendarevent_share:
defaults: { _controller: CadolesPortalBundle:Calendarevent:share, access: user }
+#== PROJECT =================================================================================================================================================
+
+#-- Access config
+cadoles_portal_config_project:
+ path: /config/project
+ defaults: { _controller: CadolesPortalBundle:Project:list }
+
+cadoles_portal_config_project_ajax_list:
+ path: /config/project/ajax/list
+ defaults: { _controller: CadolesPortalBundle:Project:ajaxlist, access: config }
+
+cadoles_portal_config_project_view:
+ path: /config/project/view/{id}
+ defaults: { _controller: CadolesPortalBundle:Project:view, access: config, id: 0 }
+
+cadoles_portal_config_project_submit:
+ path: /config/project/submit
+ defaults: { _controller: CadolesPortalBundle:Project:submit, access: config }
+
+cadoles_portal_config_project_update:
+ path: /config/project/update/{id}
+ defaults: { _controller: CadolesPortalBundle:Project:update, access: config }
+
+cadoles_portal_config_project_delete:
+ path: /config/project/delete/{id}
+ defaults: { _controller: CadolesPortalBundle:Project:delete, access: config }
+
+cadoles_portal_config_project_share:
+ path: /config/project/share/{id}
+ defaults: { _controller: CadolesPortalBundle:Project:share, access: config }
+
+cadoles_portal_config_project_writer:
+ path: /config/project/writer/{id}
+ defaults: { _controller: CadolesPortalBundle:Project:writer, access: config }
+
+cadoles_portal_config_ajax_project_seleclist:
+ path: /config/project/ajax/selectlist
+ defaults: { _controller: CadolesPortalBundle:Project:ajaxseleclist }
+
+#-- Access user
+cadoles_portal_user_project_view:
+ path: /project/{id}
+ defaults: { _controller: CadolesPortalBundle:Project:view, access: user, id: 0 }
+
+cadoles_portal_user_project_submit:
+ path: /user/project/submit
+ defaults: { _controller: CadolesPortalBundle:Project:submit, access: user }
+
+cadoles_portal_user_project_update:
+ path: /user/project/update/{id}
+ defaults: { _controller: CadolesPortalBundle:Project:update, access: user }
+
+cadoles_portal_user_project_delete:
+ path: /user/project/delete/{id}
+ defaults: { _controller: CadolesPortalBundle:Project:delete, access: user }
+
+cadoles_portal_user_project_share:
+ path: /user/project/share/{id}
+ defaults: { _controller: CadolesPortalBundle:Project:share, access: user }
+
+cadoles_portal_user_project_writer:
+ path: /user/project/writer/{id}
+ defaults: { _controller: CadolesPortalBundle:Project:writer, access: user }
+
+#== PROJECTTASK ==========================================================================================================================================
+
+#-- Access config
+cadoles_portal_config_projecttask_view:
+ path: /config/projecttask/view/{id}
+ defaults: { _controller: CadolesPortalBundle:Projecttask:view, access: config }
+
+cadoles_portal_config_projecttask_submit:
+ path: /config/projecttask/submit/{idproject}
+ defaults: { _controller: CadolesPortalBundle:Projecttask:submit, access: config}
+
+cadoles_portal_config_projecttask_update:
+ path: /config/projecttask/update/{id}
+ defaults: { _controller: CadolesPortalBundle:Projecttask:update, access: config }
+
+cadoles_portal_config_projecttask_delete:
+ path: /config/projecttask/delete/{id}
+ defaults: { _controller: CadolesPortalBundle:Projecttask:delete, access: config }
+
+cadoles_portal_config_projecttask_upload:
+ path: /config/projecttask/upload
+ defaults: { _controller: CadolesPortalBundle:Projecttask:upload, access: config }
+
+cadoles_portal_config_projecttask_users:
+ path: /config/projecttask/users
+ defaults: { _controller: CadolesPortalBundle:Projecttask:users, access: config }
+
+cadoles_portal_config_projecttask_percentage:
+ path: /config/projecttask/percentage/{id}
+ defaults: { _controller: CadolesPortalBundle:Projecttask:percentage, access: config }
+
+#-- Access user
+cadoles_portal_user_projecttask_view:
+ path: /projecttask/{id}
+ defaults: { _controller: CadolesPortalBundle:Projecttask:view, access: user }
+
+cadoles_portal_user_projecttask_submit:
+ path: /user/projecttask/submit/{idproject}
+ defaults: { _controller: CadolesPortalBundle:Projecttask:submit, access: user, idproject: 0 }
+
+cadoles_portal_user_projecttask_update:
+ path: /user/projecttask/update/{id}
+ defaults: { _controller: CadolesPortalBundle:Projecttask:update, access: user }
+
+cadoles_portal_user_projecttask_delete:
+ path: /user/projecttask/delete/{id}
+ defaults: { _controller: CadolesPortalBundle:Projecttask:delete, access: user }
+
+cadoles_portal_user_projecttask_upload:
+ path: /user/projecttask/upload
+ defaults: { _controller: CadolesPortalBundle:Projecttask:upload, access: user }
+
+cadoles_portal_user_projecttask_users:
+ path: /user/projecttask/users
+ defaults: { _controller: CadolesPortalBundle:Projecttask:users, access: user }
+
+cadoles_portal_user_projecttask_percentage:
+ path: /user/projecttask/percentage/{id}
+ defaults: { _controller: CadolesPortalBundle:Projecttask:percentage, access: user }
#== FEED =================================================================================================================================================
@@ -800,6 +924,10 @@ cadoles_portal_config_panelwidget_view_blog:
path: /config/pagewidget/view/blog/{id}
defaults: { _controller: CadolesPortalBundle:Pagewidget:viewblog, access: config }
+cadoles_portal_config_panelwidget_view_project:
+ path: /config/pagewidget/view/project/{id}
+ defaults: { _controller: CadolesPortalBundle:Pagewidget:viewproject, access: config }
+
cadoles_portal_config_panelwidget_view_separator:
path: /config/pagewidget/view/separator/{id}
defaults: { _controller: CadolesPortalBundle:Pagewidget:viewseparator, access: config }
@@ -913,6 +1041,10 @@ cadoles_portal_user_panelwidget_view_blog:
path: /pagewidget/view/blog/{id}
defaults: { _controller: CadolesPortalBundle:Pagewidget:viewblog, access: user }
+cadoles_portal_user_panelwidget_view_project:
+ path: /pagewidget/view/project/{id}
+ defaults: { _controller: CadolesPortalBundle:Pagewidget:viewproject, access: user }
+
cadoles_portal_user_panelwidget_view_separator:
path: /pagewidget/view/separator/{id}
defaults: { _controller: CadolesPortalBundle:Pagewidget:viewseparator, access: user }
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Blogarticle/edit.html.twig b/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Blogarticle/edit.html.twig
index e061856a..705b8e29 100644
--- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Blogarticle/edit.html.twig
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Blogarticle/edit.html.twig
@@ -12,7 +12,7 @@
{{ form_widget(form.submit) }}
{% if mode=="update" %}
- Annuler
+ Annuler
{% elseif mode=="submit" %}
{% set blogid=0 %}
{%if entity.blog.id is defined %}
diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Blogcomment/edit.html.twig b/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Blogcomment/edit.html.twig
index f6ae60f6..188cf1a3 100644
--- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Blogcomment/edit.html.twig
+++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Blogcomment/edit.html.twig
@@ -11,7 +11,7 @@
{{ form_widget(form.submit) }}
- Annuler
+ Annuler
{% if mode=="update" %}
.msgtopic a { color: #{{colorbodyfont}}; font-weight: bold; }
+
{% if canupdate %}